fix: Restore camera rotation and stabilize UI element scaling
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
@@ -87,17 +87,7 @@ void Camera::wheelEvent(QWheelEvent* event, const QVector3D& worldPos)
|
|||||||
QMatrix4x4 Camera::modelViewMatrix() const
|
QMatrix4x4 Camera::modelViewMatrix() const
|
||||||
{
|
{
|
||||||
QMatrix4x4 model;
|
QMatrix4x4 model;
|
||||||
float effectiveZoom = m_zoom;
|
model.translate(m_panX, m_panY, 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);
|
|
||||||
|
|
||||||
if (m_isRotating) {
|
if (m_isRotating) {
|
||||||
model.translate(m_rotationPivot);
|
model.translate(m_rotationPivot);
|
||||||
@@ -237,6 +227,7 @@ void Camera::animateToPlaneView(int plane)
|
|||||||
void Camera::startRotation(const QVector3D& pivot)
|
void Camera::startRotation(const QVector3D& pivot)
|
||||||
{
|
{
|
||||||
m_rotationPivot = pivot;
|
m_rotationPivot = pivot;
|
||||||
|
m_stableZoom = m_zoom;
|
||||||
|
|
||||||
QMatrix4x4 rotation;
|
QMatrix4x4 rotation;
|
||||||
rotation.rotate(m_xRot / 16.0f, 1, 0, 0);
|
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());
|
setPanX(m_panX + p_diff.x());
|
||||||
setPanY(m_panY + p_diff.y());
|
setPanY(m_panY + p_diff.y());
|
||||||
|
setZoom(m_zoom + p_diff.z());
|
||||||
|
|
||||||
m_isRotating = true;
|
m_isRotating = true;
|
||||||
}
|
}
|
||||||
@@ -266,6 +258,7 @@ void Camera::stopRotation()
|
|||||||
|
|
||||||
setPanX(m_panX - p_diff.x());
|
setPanX(m_panX - p_diff.x());
|
||||||
setPanY(m_panY - p_diff.y());
|
setPanY(m_panY - p_diff.y());
|
||||||
|
setZoom(m_zoom - p_diff.z());
|
||||||
|
|
||||||
m_isRotating = false;
|
m_isRotating = false;
|
||||||
}
|
}
|
||||||
@@ -313,3 +306,11 @@ void Camera::animateRestoreState()
|
|||||||
|
|
||||||
animGroup->start(QAbstractAnimation::DeleteWhenStopped);
|
animGroup->start(QAbstractAnimation::DeleteWhenStopped);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float Camera::uiCameraDistance() const
|
||||||
|
{
|
||||||
|
if (m_isRotating) {
|
||||||
|
return m_stableZoom;
|
||||||
|
}
|
||||||
|
return m_zoom;
|
||||||
|
}
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ public:
|
|||||||
void stopRotation();
|
void stopRotation();
|
||||||
bool isRotating() const { return m_isRotating; }
|
bool isRotating() const { return m_isRotating; }
|
||||||
const QVector3D& rotationPivot() const { return m_rotationPivot; }
|
const QVector3D& rotationPivot() const { return m_rotationPivot; }
|
||||||
|
float uiCameraDistance() const;
|
||||||
|
|
||||||
float savedXRot() const { return m_savedXRot; }
|
float savedXRot() const { return m_savedXRot; }
|
||||||
float savedYRot() const { return m_savedYRot; }
|
float savedYRot() const { return m_savedYRot; }
|
||||||
@@ -67,6 +68,7 @@ private:
|
|||||||
|
|
||||||
QVector3D m_rotationPivot;
|
QVector3D m_rotationPivot;
|
||||||
bool m_isRotating = false;
|
bool m_isRotating = false;
|
||||||
|
float m_stableZoom = 0;
|
||||||
|
|
||||||
float m_savedXRot = 0;
|
float m_savedXRot = 0;
|
||||||
float m_savedYRot = 0;
|
float m_savedYRot = 0;
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ void SketchGrid::paintGL(SketchPlane plane, QOpenGLShaderProgram* shaderProgram,
|
|||||||
|
|
||||||
void SketchGrid::drawGridLines(SketchPlane plane, QOpenGLShaderProgram* shaderProgram, int colorLoc)
|
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 float minorIncrement = params.minorIncrement;
|
||||||
const int gridSize = params.gridSize;
|
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)
|
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;
|
const int axisLength = params.gridSize;
|
||||||
QVector<GLfloat> vertices;
|
QVector<GLfloat> vertices;
|
||||||
|
|
||||||
@@ -161,7 +161,7 @@ void SketchGrid::paintAxisLabels(QPainter& painter, SketchGrid::SketchPlane plan
|
|||||||
painter.setPen(Qt::white);
|
painter.setPen(Qt::white);
|
||||||
painter.setFont(QFont("Arial", 10));
|
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 float majorIncrement = params.majorIncrement;
|
||||||
const int range = params.gridSize;
|
const int range = params.gridSize;
|
||||||
|
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ void ViewportWidget::paintGL()
|
|||||||
m_snapping->paintGL();
|
m_snapping->paintGL();
|
||||||
|
|
||||||
if (m_camera->isRotating()) {
|
if (m_camera->isRotating()) {
|
||||||
const float radius = 0.004f * -m_camera->zoom();
|
const float radius = 0.004f * -m_camera->uiCameraDistance();
|
||||||
const int numSegments = 16;
|
const int numSegments = 16;
|
||||||
QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted();
|
QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted();
|
||||||
QVector3D rightVec = invModelView.column(0).toVector3D();
|
QVector3D rightVec = invModelView.column(0).toVector3D();
|
||||||
@@ -204,7 +204,7 @@ void ViewportWidget::paintGL()
|
|||||||
}
|
}
|
||||||
|
|
||||||
painter.setPen(Qt::white);
|
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();
|
painter.end();
|
||||||
}
|
}
|
||||||
@@ -560,7 +560,7 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!unattachedVertices.isEmpty()) {
|
if (!unattachedVertices.isEmpty()) {
|
||||||
const float radius = 0.004f * -m_camera->zoom();
|
const float radius = 0.004f * -m_camera->uiCameraDistance();
|
||||||
const int numSegments = 16;
|
const int numSegments = 16;
|
||||||
QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted();
|
QMatrix4x4 invModelView = m_camera->modelViewMatrix().inverted();
|
||||||
QVector3D rightVec = invModelView.column(0).toVector3D();
|
QVector3D rightVec = invModelView.column(0).toVector3D();
|
||||||
|
|||||||
Reference in New Issue
Block a user