mesh_shader.uniformLocation("view_matrix"),
1, GL_FALSE, view_matrix().data());
+ // Compensate for z-flattening when zooming
+ glUniform1f(mesh_shader.uniformLocation("zoom"), 1/zoom);
+
// Find and enable the attribute location for vertex position
const GLuint vp = mesh_shader.attributeLocation("vertex_position");
glEnableVertexAttribArray(vp);
}
else if (event->buttons() & Qt::RightButton)
{
- qDebug() << d;
center = transform_matrix().inverted() *
view_matrix().inverted() *
QVector3D(-d.x() / (0.5*width()),
void Canvas::wheelEvent(QWheelEvent *event)
{
+ // Find GL position before the zoom operation
+ // (to zoom about mouse cursor)
+ auto p = event->pos();
+ QVector3D v(1 - p.x() / (0.5*width()),
+ p.y() / (0.5*height()) - 1, 0);
+ QVector3D a = transform_matrix().inverted() *
+ view_matrix().inverted() * v;
+
if (event->delta() < 0)
{
for (int i=0; i > event->delta(); --i)
for (int i=0; i < event->delta(); ++i)
zoom /= 1.001;
}
+
+ // Then find the cursor's GL position post-zoom and adjust center.
+ QVector3D b = transform_matrix().inverted() *
+ view_matrix().inverted() * v;
+ center += b - a;
update();
}