8 Canvas::Canvas(const QGLFormat& format, QWidget *parent)
9 : QGLWidget(format, parent), mesh(NULL),
10 scale(1), tilt(90), yaw(0)
20 void Canvas::load_mesh(Mesh* m)
23 center = QVector3D(m->xmin() + m->xmax(),
24 m->ymin() + m->ymax(),
25 m->zmin() + m->zmax()) / 2;
27 pow(m->xmax() - m->xmin(), 2) +
28 pow(m->ymax() - m->ymin(), 2) +
29 pow(m->zmax() - m->zmin(), 2));
36 void Canvas::initializeGL()
38 mesh_shader.addShaderFromSourceFile(QGLShader::Vertex, ":/gl/mesh.vert");
39 mesh_shader.addShaderFromSourceFile(QGLShader::Fragment, ":/gl/mesh.frag");
42 glClearColor(0.0, 0.0, 0.0, 0.0);
43 glEnable(GL_DEPTH_TEST);
46 void Canvas::paintGL()
48 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
50 if (mesh) draw_mesh();
53 void Canvas::draw_mesh()
57 // Load the transform and view matrices into the shader
59 mesh_shader.uniformLocation("transform_matrix"),
60 1, GL_FALSE, transform_matrix().data());
62 mesh_shader.uniformLocation("view_matrix"),
63 1, GL_FALSE, view_matrix().data());
65 // Find and enable the attribute location for vertex position
66 const GLuint vp = mesh_shader.attributeLocation("vertex_position");
67 glEnableVertexAttribArray(vp);
69 // Then draw the mesh with that vertex position
72 // Clean up state machine
73 glDisableVertexAttribArray(vp);
74 mesh_shader.release();
77 QMatrix4x4 Canvas::transform_matrix() const
80 m.rotate(tilt, QVector3D(1, 0, 0));
81 m.rotate(yaw, QVector3D(0, 0, 1));
87 QMatrix4x4 Canvas::view_matrix() const
90 if (width() > height())
92 m.scale(height() / float(width()), 1, 0.5);
96 m.scale(1, width() / float(height()), 0.5);
101 void Canvas::mousePressEvent(QMouseEvent* event)
103 if (event->button() == Qt::LeftButton)
105 mouse_pos = event->pos();
106 setCursor(Qt::ClosedHandCursor);
110 void Canvas::mouseReleaseEvent(QMouseEvent* event)
112 if (event->button() == Qt::LeftButton)
118 void Canvas::mouseMoveEvent(QMouseEvent* event)
120 if (event->buttons() & Qt::LeftButton)
122 auto p = event->pos();
123 auto d = p - mouse_pos;
124 yaw = fmod(yaw + d.x(), 360);
125 tilt = fmax(0, fmin(180, tilt - d.y()));