11 Canvas::Canvas(const QGLFormat& format, QWidget *parent)
12 : QGLWidget(format, parent), mesh(NULL),
13 scale(1), tilt(90), yaw(0)
23 void Canvas::load_mesh(Mesh* m)
26 center = QVector3D(m->xmin() + m->xmax(),
27 m->ymin() + m->ymax(),
28 m->zmin() + m->zmax()) / 2;
30 pow(m->xmax() - m->xmin(), 2) +
31 pow(m->ymax() - m->ymin(), 2) +
32 pow(m->zmax() - m->zmin(), 2));
38 void Canvas::set_status(const QString &s)
44 void Canvas::initializeGL()
46 mesh_shader.addShaderFromSourceFile(QGLShader::Vertex, ":/gl/mesh.vert");
47 mesh_shader.addShaderFromSourceFile(QGLShader::Fragment, ":/gl/mesh.frag");
50 backdrop = new Backdrop();
53 void Canvas::paintEvent(QPaintEvent *event)
57 glClearColor(0.0, 0.0, 0.0, 0.0);
58 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
59 glEnable(GL_DEPTH_TEST);
62 if (mesh) draw_mesh();
64 QPainter painter(this);
65 painter.setRenderHint(QPainter::Antialiasing);
67 painter.drawText(10, height() - 10, status);
71 void Canvas::draw_mesh()
75 // Load the transform and view matrices into the shader
77 mesh_shader.uniformLocation("transform_matrix"),
78 1, GL_FALSE, transform_matrix().data());
80 mesh_shader.uniformLocation("view_matrix"),
81 1, GL_FALSE, view_matrix().data());
83 // Find and enable the attribute location for vertex position
84 const GLuint vp = mesh_shader.attributeLocation("vertex_position");
85 glEnableVertexAttribArray(vp);
87 // Then draw the mesh with that vertex position
90 // Clean up state machine
91 glDisableVertexAttribArray(vp);
92 mesh_shader.release();
95 QMatrix4x4 Canvas::transform_matrix() const
98 m.rotate(tilt, QVector3D(1, 0, 0));
99 m.rotate(yaw, QVector3D(0, 0, 1));
101 m.translate(-center);
105 QMatrix4x4 Canvas::view_matrix() const
108 if (width() > height())
110 m.scale(-height() / float(width()), 1, 0.5);
114 m.scale(-1, width() / float(height()), 0.5);
119 void Canvas::mousePressEvent(QMouseEvent* event)
121 if (event->button() == Qt::LeftButton)
123 mouse_pos = event->pos();
124 setCursor(Qt::ClosedHandCursor);
128 void Canvas::mouseReleaseEvent(QMouseEvent* event)
130 if (event->button() == Qt::LeftButton)
136 void Canvas::mouseMoveEvent(QMouseEvent* event)
138 if (event->buttons() & Qt::LeftButton)
140 auto p = event->pos();
141 auto d = p - mouse_pos;
142 yaw = fmod(yaw - d.x(), 360);
143 tilt = fmax(0, fmin(180, tilt - d.y()));