9 Canvas::Canvas(const QGLFormat& format, QWidget *parent)
10 : QGLWidget(format, parent), mesh(NULL),
11 scale(1), tilt(90), yaw(0)
21 void Canvas::load_mesh(Mesh* m)
24 center = QVector3D(m->xmin() + m->xmax(),
25 m->ymin() + m->ymax(),
26 m->zmin() + m->zmax()) / 2;
28 pow(m->xmax() - m->xmin(), 2) +
29 pow(m->ymax() - m->ymin(), 2) +
30 pow(m->zmax() - m->zmin(), 2));
37 void Canvas::initializeGL()
39 mesh_shader.addShaderFromSourceFile(QGLShader::Vertex, ":/gl/mesh.vert");
40 mesh_shader.addShaderFromSourceFile(QGLShader::Fragment, ":/gl/mesh.frag");
43 backdrop = new Backdrop();
45 glClearColor(0.0, 0.0, 0.0, 0.0);
46 glEnable(GL_DEPTH_TEST);
49 void Canvas::paintGL()
51 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
54 if (mesh) draw_mesh();
57 void Canvas::draw_mesh()
61 // Load the transform and view matrices into the shader
63 mesh_shader.uniformLocation("transform_matrix"),
64 1, GL_FALSE, transform_matrix().data());
66 mesh_shader.uniformLocation("view_matrix"),
67 1, GL_FALSE, view_matrix().data());
69 // Find and enable the attribute location for vertex position
70 const GLuint vp = mesh_shader.attributeLocation("vertex_position");
71 glEnableVertexAttribArray(vp);
73 // Then draw the mesh with that vertex position
76 // Clean up state machine
77 glDisableVertexAttribArray(vp);
78 mesh_shader.release();
81 QMatrix4x4 Canvas::transform_matrix() const
84 m.rotate(tilt, QVector3D(1, 0, 0));
85 m.rotate(yaw, QVector3D(0, 0, 1));
91 QMatrix4x4 Canvas::view_matrix() const
94 if (width() > height())
96 m.scale(height() / float(width()), 1, 0.5);
100 m.scale(1, width() / float(height()), 0.5);
105 void Canvas::mousePressEvent(QMouseEvent* event)
107 if (event->button() == Qt::LeftButton)
109 mouse_pos = event->pos();
110 setCursor(Qt::ClosedHandCursor);
114 void Canvas::mouseReleaseEvent(QMouseEvent* event)
116 if (event->button() == Qt::LeftButton)
122 void Canvas::mouseMoveEvent(QMouseEvent* event)
124 if (event->buttons() & Qt::LeftButton)
126 auto p = event->pos();
127 auto d = p - mouse_pos;
128 yaw = fmod(yaw + d.x(), 360);
129 tilt = fmax(0, fmin(180, tilt - d.y()));