From 7ce318b402c9ba8b0d732b69fa2d9542a1532920 Mon Sep 17 00:00:00 2001 From: Tanner Collin Date: Tue, 17 Feb 2026 13:58:58 -0700 Subject: [PATCH] fix: Restore camera rotation and stabilize UI element scaling Co-authored-by: aider (gemini/gemini-2.5-pro) --- src/Camera.cpp | 23 ++++++++++++----------- src/Camera.h | 2 ++ src/SketchGrid.cpp | 6 +++--- src/ViewportWidget.cpp | 6 +++--- 4 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/Camera.cpp b/src/Camera.cpp index d9bbf76..6b47cd1 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -87,17 +87,7 @@ void Camera::wheelEvent(QWheelEvent* event, const QVector3D& worldPos) QMatrix4x4 Camera::modelViewMatrix() const { QMatrix4x4 model; - float effectiveZoom = m_zoom; - - if (m_isRotating) { - QMatrix4x4 rotation; - rotation.rotate(m_xRot / 16.0f, 1, 0, 0); - rotation.rotate(m_yRot / 16.0f, 0, 1, 0); - QVector3D p_rotated = rotation.map(m_rotationPivot); - effectiveZoom += (p_rotated - m_rotationPivot).z(); - } - - model.translate(m_panX, m_panY, effectiveZoom); + model.translate(m_panX, m_panY, m_zoom); if (m_isRotating) { model.translate(m_rotationPivot); @@ -237,6 +227,7 @@ void Camera::animateToPlaneView(int plane) void Camera::startRotation(const QVector3D& pivot) { m_rotationPivot = pivot; + m_stableZoom = m_zoom; QMatrix4x4 rotation; rotation.rotate(m_xRot / 16.0f, 1, 0, 0); @@ -247,6 +238,7 @@ void Camera::startRotation(const QVector3D& pivot) setPanX(m_panX + p_diff.x()); setPanY(m_panY + p_diff.y()); + setZoom(m_zoom + p_diff.z()); m_isRotating = true; } @@ -266,6 +258,7 @@ void Camera::stopRotation() setPanX(m_panX - p_diff.x()); setPanY(m_panY - p_diff.y()); + setZoom(m_zoom - p_diff.z()); m_isRotating = false; } @@ -313,3 +306,11 @@ void Camera::animateRestoreState() animGroup->start(QAbstractAnimation::DeleteWhenStopped); } + +float Camera::uiCameraDistance() const +{ + if (m_isRotating) { + return m_stableZoom; + } + return m_zoom; +} diff --git a/src/Camera.h b/src/Camera.h index 7e6aec7..953cb2c 100644 --- a/src/Camera.h +++ b/src/Camera.h @@ -46,6 +46,7 @@ public: void stopRotation(); bool isRotating() const { return m_isRotating; } const QVector3D& rotationPivot() const { return m_rotationPivot; } + float uiCameraDistance() const; float savedXRot() const { return m_savedXRot; } float savedYRot() const { return m_savedYRot; } @@ -67,6 +68,7 @@ private: QVector3D m_rotationPivot; bool m_isRotating = false; + float m_stableZoom = 0; float m_savedXRot = 0; float m_savedYRot = 0; diff --git a/src/SketchGrid.cpp b/src/SketchGrid.cpp index 28fc478..b3a8924 100644 --- a/src/SketchGrid.cpp +++ b/src/SketchGrid.cpp @@ -72,7 +72,7 @@ void SketchGrid::paintGL(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, void SketchGrid::drawGridLines(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc) { - auto params = getGridParams(-m_viewport->camera()->zoom()); + auto params = getGridParams(-m_viewport->camera()->uiCameraDistance()); const float minorIncrement = params.minorIncrement; const int gridSize = params.gridSize; @@ -115,7 +115,7 @@ void SketchGrid::drawGridLines(SketchPlane plane, QOpenGLShaderProgram* shaderPr void SketchGrid::drawAxes(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc) { - auto params = getGridParams(-m_viewport->camera()->zoom()); + auto params = getGridParams(-m_viewport->camera()->uiCameraDistance()); const int axisLength = params.gridSize; QVector vertices; @@ -161,7 +161,7 @@ void SketchGrid::paintAxisLabels(QPainter& painter, SketchGrid::SketchPlane plan painter.setPen(Qt::white); painter.setFont(QFont("Arial", 10)); - auto params = getGridParams(-m_viewport->camera()->zoom()); + auto params = getGridParams(-m_viewport->camera()->uiCameraDistance()); const float majorIncrement = params.majorIncrement; const int range = params.gridSize; diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index 5ec6880..2170beb 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -154,7 +154,7 @@ void ViewportWidget::paintGL() m_snapping->paintGL(); if (m_camera->isRotating()) { - const float radius = 0.004f * -m_camera->zoom(); + const float radius = 0.004f * -m_camera->uiCameraDistance(); const int numSegments = 16; QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted(); QVector3D rightVec = invModelView.column(0).toVector3D(); @@ -204,7 +204,7 @@ void ViewportWidget::paintGL() } painter.setPen(Qt::white); - painter.drawText(width() - 350, height() - 10, QString("Camera Distance: %1").arg(-m_camera->zoom())); + painter.drawText(width() - 350, height() - 10, QString("Camera Distance: %1").arg(-m_camera->uiCameraDistance())); painter.end(); } @@ -560,7 +560,7 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch) } if (!unattachedVertices.isEmpty()) { - const float radius = 0.004f * -m_camera->zoom(); + const float radius = 0.004f * -m_camera->uiCameraDistance(); const int numSegments = 16; QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted(); QVector3D rightVec = invModelView.column(0).toVector3D();