feat: Add limits for camera and pivot point distances

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2026-02-17 14:41:55 -07:00
parent 7ce318b402
commit 64b48c7ed1

View File

@@ -4,6 +4,7 @@
#include <QWheelEvent>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>
#include <QtMath>
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;