Files
unnamed-cad-software/src/Camera.h
T
tanner 64ff7396c2 refactor: Use gp_Ax2 for camera plane orientation
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
2026-03-03 16:09:38 -07:00

91 lines
2.3 KiB
C++

// Unnamed CAD Software
//
// License: GPLv3 (or later)
// Language: C++17
// Notes:
// - use a right-handed, Z-up coordinate system to match Open CASCADE
#ifndef CAMERA_H
#define CAMERA_H
#include <QObject>
#include <QMatrix4x4>
#include <QPoint>
#include <QMouseEvent>
#include <QWheelEvent>
#include <gp_Ax2.hxx>
class Camera : public QObject
{
Q_OBJECT
Q_PROPERTY(float xRotation READ xRotation WRITE setXRotation)
Q_PROPERTY(float yRotation READ yRotation WRITE setYRotation)
Q_PROPERTY(float zoom READ zoom WRITE setZoom)
Q_PROPERTY(float panX READ panX WRITE setPanX)
Q_PROPERTY(float panY READ panY WRITE setPanY)
public:
explicit Camera(QObject *parent = nullptr);
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event, int viewportHeight);
void wheelEvent(QWheelEvent* event, const QVector3D& worldPos);
QMatrix4x4 modelViewMatrix() const;
float xRotation() const;
void setXRotation(float angle);
float yRotation() const;
void setYRotation(float angle);
float zoom() const;
void setZoom(float value);
float panX() const;
void setPanX(float value);
float panY() const;
void setPanY(float value);
void saveState();
void restoreState();
void animateToPlaneView(const gp_Ax2& plane);
void animateRestoreState();
void animateToHomeView();
void startRotation(const QVector3D& pivot);
void stopRotation();
bool isRotating() const { return m_isRotating; }
const QVector3D& rotationPivot() const { return m_rotationPivot; }
float uiCameraDistance() const;
float savedXRot() const { return m_savedXRot; }
float savedYRot() const { return m_savedYRot; }
float savedZoom() const { return m_savedZoom; }
float savedPanX() const { return m_savedPanX; }
float savedPanY() const { return m_savedPanY; }
signals:
void cameraChanged();
void restoreStateAnimationFinished();
private:
QPoint m_lastPos;
float m_xRot;
float m_yRot;
float m_zoom;
float m_panX;
float m_panY;
QVector3D m_rotationPivot;
bool m_isRotating = false;
float m_stableZoom = 0;
float m_savedXRot = 0;
float m_savedYRot = 0;
float m_savedZoom = -5.0f;
float m_savedPanX = 0;
float m_savedPanY = 0;
};
#endif // CAMERA_H