#include <QMouseEvent>
#include <QDebug>
+#include <cmath>
+
#include "canvas.h"
#include "backdrop.h"
#include "glmesh.h"
Canvas::Canvas(const QGLFormat& format, QWidget *parent)
: QGLWidget(format, parent), mesh(NULL),
- scale(1), tilt(90), yaw(0)
+ scale(1), zoom(1), tilt(90), yaw(0), status(" ")
{
// Nothing to do here
}
pow(m->xmax() - m->xmin(), 2) +
pow(m->ymax() - m->ymin(), 2) +
pow(m->zmax() - m->zmin(), 2));
-
update();
delete m;
}
+void Canvas::set_status(const QString &s)
+{
+ status = s;
+ update();
+}
+
+void Canvas::clear_status()
+{
+ status = "";
+ update();
+}
+
void Canvas::initializeGL()
{
+ initializeGLFunctions();
+
mesh_shader.addShaderFromSourceFile(QGLShader::Vertex, ":/gl/mesh.vert");
mesh_shader.addShaderFromSourceFile(QGLShader::Fragment, ":/gl/mesh.frag");
mesh_shader.link();
backdrop = new Backdrop();
-
- glClearColor(0.0, 0.0, 0.0, 0.0);
- glEnable(GL_DEPTH_TEST);
}
-void Canvas::paintGL()
+void Canvas::paintEvent(QPaintEvent *event)
{
+ Q_UNUSED(event);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_DEPTH_TEST);
backdrop->draw();
if (mesh) draw_mesh();
+
+ if (status.isNull()) return;
+
+ QPainter painter(this);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.drawText(10, height() - 10, status);
}
+
void Canvas::draw_mesh()
{
mesh_shader.bind();
QMatrix4x4 m;
if (width() > height())
{
- m.scale(height() / float(width()), 1, 0.5);
+ m.scale(-height() / float(width()), 1, 0.5);
}
else
{
- m.scale(1, width() / float(height()), 0.5);
+ m.scale(-1, width() / float(height()), 0.5);
}
+ m.scale(zoom, zoom, 1);
return m;
}
void Canvas::mousePressEvent(QMouseEvent* event)
{
- if (event->button() == Qt::LeftButton)
+ if (event->button() == Qt::LeftButton ||
+ event->button() == Qt::RightButton)
{
mouse_pos = event->pos();
setCursor(Qt::ClosedHandCursor);
void Canvas::mouseReleaseEvent(QMouseEvent* event)
{
- if (event->button() == Qt::LeftButton)
+ if (event->button() == Qt::LeftButton ||
+ event->button() == Qt::RightButton)
{
unsetCursor();
}
void Canvas::mouseMoveEvent(QMouseEvent* event)
{
+ auto p = event->pos();
+ auto d = p - mouse_pos;
+
if (event->buttons() & Qt::LeftButton)
{
- auto p = event->pos();
- auto d = p - mouse_pos;
- yaw = fmod(yaw + d.x(), 360);
+ yaw = fmod(yaw - d.x(), 360);
tilt = fmax(0, fmin(180, tilt - d.y()));
- mouse_pos = p;
update();
}
+ else if (event->buttons() & Qt::RightButton)
+ {
+ qDebug() << d;
+ center = transform_matrix().inverted() *
+ view_matrix().inverted() *
+ QVector3D(-d.x() / (0.5*width()),
+ d.y() / (0.5*height()), 0);
+ update();
+ }
+ mouse_pos = p;
+}
+
+void Canvas::wheelEvent(QWheelEvent *event)
+{
+ if (event->delta() < 0)
+ {
+ for (int i=0; i > event->delta(); --i)
+ zoom *= 1.001;
+ }
+ else if (event->delta() > 0)
+ {
+ for (int i=0; i < event->delta(); ++i)
+ zoom /= 1.001;
+ }
+ update();
}