]> git.sur5r.net Git - fstl/blobdiff - src/canvas.cpp
Zoom about mouse cursor
[fstl] / src / canvas.cpp
index 1539469949155de9eeb1b824bc97d2037134dbf0..15624dac5eb786d85f1aefc1825a8e3ff0c2683b 100644 (file)
@@ -89,6 +89,9 @@ void Canvas::draw_mesh()
                 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);
@@ -158,7 +161,6 @@ void Canvas::mouseMoveEvent(QMouseEvent* event)
     }
     else if (event->buttons() & Qt::RightButton)
     {
-        qDebug() << d;
         center = transform_matrix().inverted() *
                  view_matrix().inverted() *
                  QVector3D(-d.x() / (0.5*width()),
@@ -170,6 +172,14 @@ void Canvas::mouseMoveEvent(QMouseEvent* event)
 
 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)
@@ -180,5 +190,10 @@ void Canvas::wheelEvent(QWheelEvent *event)
         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();
 }