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)
27 center = QVector3D(m->xmin() + m->xmax(),
28 m->ymin() + m->ymax(),
29 m->zmin() + m->zmax()) / 2;
31 pow(m->xmax() - m->xmin(), 2) +
32 pow(m->ymax() - m->ymin(), 2) +
33 pow(m->zmax() - m->zmin(), 2));
40 void Canvas::initializeGL()
42 mesh_shader.addShaderFromSourceFile(QGLShader::Vertex, ":/gl/mesh.vert");
43 mesh_shader.addShaderFromSourceFile(QGLShader::Fragment, ":/gl/mesh.frag");
46 backdrop = new Backdrop();
48 glClearColor(0.0, 0.0, 0.0, 0.0);
49 glEnable(GL_DEPTH_TEST);
52 void Canvas::paintGL()
54 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
57 if (mesh) draw_mesh();
60 void Canvas::draw_mesh()
64 // Load the transform and view matrices into the shader
66 mesh_shader.uniformLocation("transform_matrix"),
67 1, GL_FALSE, transform_matrix().data());
69 mesh_shader.uniformLocation("view_matrix"),
70 1, GL_FALSE, view_matrix().data());
72 // Find and enable the attribute location for vertex position
73 const GLuint vp = mesh_shader.attributeLocation("vertex_position");
74 glEnableVertexAttribArray(vp);
76 // Then draw the mesh with that vertex position
79 // Clean up state machine
80 glDisableVertexAttribArray(vp);
81 mesh_shader.release();
84 QMatrix4x4 Canvas::transform_matrix() const
87 m.rotate(tilt, QVector3D(1, 0, 0));
88 m.rotate(yaw, QVector3D(0, 0, 1));
94 QMatrix4x4 Canvas::view_matrix() const
97 if (width() > height())
99 m.scale(height() / float(width()), 1, 0.5);
103 m.scale(1, width() / float(height()), 0.5);
108 void Canvas::mousePressEvent(QMouseEvent* event)
110 if (event->button() == Qt::LeftButton)
112 mouse_pos = event->pos();
113 setCursor(Qt::ClosedHandCursor);
117 void Canvas::mouseReleaseEvent(QMouseEvent* event)
119 if (event->button() == Qt::LeftButton)
125 void Canvas::mouseMoveEvent(QMouseEvent* event)
127 if (event->buttons() & Qt::LeftButton)
129 auto p = event->pos();
130 auto d = p - mouse_pos;
131 yaw = fmod(yaw + d.x(), 360);
132 tilt = fmax(0, fmin(180, tilt - d.y()));