feat: Implement pixel-perfect camera panning
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
@@ -21,7 +21,7 @@ void Camera::mousePressEvent(QMouseEvent* event)
|
|||||||
m_lastPos = event->pos();
|
m_lastPos = event->pos();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Camera::mouseMoveEvent(QMouseEvent* event)
|
void Camera::mouseMoveEvent(QMouseEvent* event, int viewportHeight)
|
||||||
{
|
{
|
||||||
int dx = event->pos().x() - m_lastPos.x();
|
int dx = event->pos().x() - m_lastPos.x();
|
||||||
int dy = event->pos().y() - m_lastPos.y();
|
int dy = event->pos().y() - m_lastPos.y();
|
||||||
@@ -29,12 +29,17 @@ void Camera::mouseMoveEvent(QMouseEvent* event)
|
|||||||
if (event->buttons() & Qt::MiddleButton) {
|
if (event->buttons() & Qt::MiddleButton) {
|
||||||
if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {
|
if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {
|
||||||
// Pan
|
// Pan
|
||||||
|
if (viewportHeight == 0) viewportHeight = 1;
|
||||||
|
|
||||||
|
// This logic is based on a 45-degree field of view.
|
||||||
|
float fov = 45.0f;
|
||||||
float dist = -m_zoom;
|
float dist = -m_zoom;
|
||||||
dist = qMin(dist, 200.0f); // Cap distance to avoid crazy fast pan.
|
|
||||||
// Match old speed at default zoom, and have a minimum speed.
|
float world_height = 2.0f * dist * tan(qDegreesToRadians(fov / 2.0f));
|
||||||
float panFactor = dist * 0.000495f + 0.0001f;
|
float pixels_to_world = world_height / viewportHeight;
|
||||||
setPanX(m_panX + dx * panFactor);
|
|
||||||
setPanY(m_panY - dy * panFactor);
|
setPanX(m_panX + dx * pixels_to_world);
|
||||||
|
setPanY(m_panY - dy * pixels_to_world);
|
||||||
} else {
|
} else {
|
||||||
// Rotate
|
// Rotate
|
||||||
setXRotation(m_xRot + 8 * dy);
|
setXRotation(m_xRot + 8 * dy);
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ public:
|
|||||||
explicit Camera(QObject *parent = nullptr);
|
explicit Camera(QObject *parent = nullptr);
|
||||||
|
|
||||||
void mousePressEvent(QMouseEvent* event);
|
void mousePressEvent(QMouseEvent* event);
|
||||||
void mouseMoveEvent(QMouseEvent* event);
|
void mouseMoveEvent(QMouseEvent* event, int viewportHeight);
|
||||||
void wheelEvent(QWheelEvent* event, const QVector3D& worldPos);
|
void wheelEvent(QWheelEvent* event, const QVector3D& worldPos);
|
||||||
|
|
||||||
QMatrix4x4 modelViewMatrix() const;
|
QMatrix4x4 modelViewMatrix() const;
|
||||||
|
|||||||
@@ -233,7 +233,7 @@ void ViewportWidget::mouseMoveEvent(QMouseEvent *event)
|
|||||||
m_activeSketchTool->mouseMoveEvent(event);
|
m_activeSketchTool->mouseMoveEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_camera->mouseMoveEvent(event);
|
m_camera->mouseMoveEvent(event, height());
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user