From c0525ebf4e7a1714eae15d13719ac0f7e50cedb1 Mon Sep 17 00:00:00 2001 From: Trial97 Date: Wed, 15 Jan 2025 17:59:45 +0200 Subject: [PATCH] add wheel support for zoom Signed-off-by: Trial97 --- .../dialogs/skins/draw/SkinOpenGLWidget.cpp | 30 +++++++++++++++---- .../ui/dialogs/skins/draw/SkinOpenGLWidget.h | 5 +++- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.cpp b/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.cpp index 7dc36f2f7..f17b4e827 100644 --- a/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.cpp +++ b/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.cpp @@ -57,9 +57,14 @@ void SkinOpenGLWidget::mouseMoveEvent(QMouseEvent* event) int dx = event->x() - m_mousePosition.x(); int dy = event->y() - m_mousePosition.y(); - // Update rotation angles based on mouse movement - m_rotationX += dy; - m_rotationY += dx; + m_yaw += dx * 0.5f; + m_pitch += dy * 0.5f; + + // Normalize yaw to keep it manageable + if (m_yaw > 360.0f) + m_yaw -= 360.0f; + else if (m_yaw < 0.0f) + m_yaw += 360.0f; m_mousePosition = QVector2D(event->pos()); update(); // Trigger a repaint @@ -149,9 +154,13 @@ void SkinOpenGLWidget::paintGL() renderBackground(); // Calculate model view transformation QMatrix4x4 matrix; - matrix.translate(0.0, 6.0, -50.); - matrix.rotate(m_rotationX, 1.0f, 0.0f, 0.0f); - matrix.rotate(m_rotationY, 0.0f, 1.0f, 0.0f); + float yawRad = qDegreesToRadians(m_yaw); + float pitchRad = qDegreesToRadians(m_pitch); + matrix.lookAt(QVector3D( // + m_distance * cos(pitchRad) * cos(yawRad), // + m_distance * sin(pitchRad) - 8, // + m_distance * cos(pitchRad) * sin(yawRad)), + QVector3D(0, -8, 0), QVector3D(0, 1, 0)); // Set modelview-projection matrix m_program->setUniformValue("mvp_matrix", m_projection * matrix); @@ -210,3 +219,12 @@ void SkinOpenGLWidget::renderBackground() m_backgroundTexture->release(); glDepthMask(GL_TRUE); // Re-enable depth buffer writing } + +void SkinOpenGLWidget::wheelEvent(QWheelEvent* event) +{ + // Adjust distance based on scroll + int delta = event->angleDelta().y(); // Positive for scroll up, negative for scroll down + m_distance -= delta * 0.01f; // Adjust sensitivity factor + m_distance = qMax(16., m_distance); // Clamp distance + update(); // Trigger a repaint +} diff --git a/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.h b/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.h index 4a0e5a447..4c2292054 100644 --- a/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.h +++ b/launcher/ui/dialogs/skins/draw/SkinOpenGLWidget.h @@ -42,6 +42,7 @@ class SkinOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { void mousePressEvent(QMouseEvent* e) override; void mouseReleaseEvent(QMouseEvent* e) override; void mouseMoveEvent(QMouseEvent* event) override; + void wheelEvent(QWheelEvent* event) override; void initializeGL() override; void resizeGL(int w, int h) override; @@ -61,7 +62,9 @@ class SkinOpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions { QVector2D m_mousePosition; bool m_isMousePressed = false; - int m_rotationX = 0, m_rotationY = 0; + float m_distance = 48; + float m_yaw = 90; // Horizontal rotation angle + float m_pitch = 0; // Vertical rotation angle opengl::BoxGeometry* m_background = nullptr; QOpenGLTexture* m_backgroundTexture = nullptr;