diff --git a/src/Camera.cpp b/src/Camera.cpp index 6b47cd1..301a8d8 100644 --- a/src/Camera.cpp +++ b/src/Camera.cpp @@ -4,6 +4,7 @@ #include #include #include +#include Camera::Camera(QObject *parent) : QObject(parent) { @@ -121,6 +122,14 @@ void Camera::setYRotation(float angle) float Camera::zoom() const { return m_zoom; } void Camera::setZoom(float value) { + const float max_dist = 5000.0f; + float remaining_dist_sq = max_dist * max_dist - m_panX * m_panX - m_panY * m_panY; + if (remaining_dist_sq < 0) { + remaining_dist_sq = 0; + } + float max_val = qSqrt(remaining_dist_sq); + value = qBound(-max_val, value, 0.0f); // Zoom is negative or zero + if (value != m_zoom) { m_zoom = value; emit cameraChanged(); @@ -130,6 +139,14 @@ void Camera::setZoom(float value) float Camera::panX() const { return m_panX; } void Camera::setPanX(float value) { + const float max_dist = 5000.0f; + float remaining_dist_sq = max_dist * max_dist - m_panY * m_panY - m_zoom * m_zoom; + if (remaining_dist_sq < 0) { + remaining_dist_sq = 0; + } + float max_val = qSqrt(remaining_dist_sq); + value = qBound(-max_val, value, max_val); + if (value != m_panX) { m_panX = value; emit cameraChanged(); @@ -139,6 +156,14 @@ void Camera::setPanX(float value) float Camera::panY() const { return m_panY; } void Camera::setPanY(float value) { + const float max_dist = 5000.0f; + float remaining_dist_sq = max_dist * max_dist - m_panX * m_panX - m_zoom * m_zoom; + if (remaining_dist_sq < 0) { + remaining_dist_sq = 0; + } + float max_val = qSqrt(remaining_dist_sq); + value = qBound(-max_val, value, max_val); + if (value != m_panY) { m_panY = value; emit cameraChanged(); @@ -227,6 +252,9 @@ void Camera::animateToPlaneView(int plane) void Camera::startRotation(const QVector3D& pivot) { m_rotationPivot = pivot; + if (m_rotationPivot.length() > 1000.0f) { + m_rotationPivot = m_rotationPivot.normalized() * 1000.0f; + } m_stableZoom = m_zoom; QMatrix4x4 rotation;