refactor: Extract camera logic to Camera class
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
111
src/Camera.cpp
Normal file
111
src/Camera.cpp
Normal file
@@ -0,0 +1,111 @@
|
||||
#include "Camera.h"
|
||||
#include <QApplication>
|
||||
#include <QWheelEvent>
|
||||
|
||||
Camera::Camera(QObject *parent) : QObject(parent)
|
||||
{
|
||||
// Set initial view to an isometric angle on the XY plane
|
||||
m_xRot = 30 * 16;
|
||||
m_yRot = -45 * 16;
|
||||
m_zoom = -20.0f;
|
||||
m_panX = 0.0f;
|
||||
m_panY = 0.0f;
|
||||
}
|
||||
|
||||
void Camera::processMouseMovement(QMouseEvent* event, const QPoint& lastPos)
|
||||
{
|
||||
int dx = event->pos().x() - lastPos.x();
|
||||
int dy = event->pos().y() - lastPos.y();
|
||||
|
||||
if (event->buttons() & Qt::MiddleButton) {
|
||||
if (QApplication::keyboardModifiers() & Qt::ShiftModifier) {
|
||||
// Pan
|
||||
setPanX(m_panX + dx / 100.0f);
|
||||
setPanY(m_panY - dy / 100.0f);
|
||||
} else {
|
||||
// Rotate
|
||||
setXRotation(m_xRot + 8 * dy);
|
||||
setYRotation(m_yRot + 8 * dx);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Camera::processWheel(QWheelEvent* event)
|
||||
{
|
||||
QPoint numDegrees = event->angleDelta() / 8;
|
||||
if (!numDegrees.isNull()) {
|
||||
setZoom(m_zoom + numDegrees.y() / 5.0f);
|
||||
}
|
||||
}
|
||||
|
||||
QMatrix4x4 Camera::modelViewMatrix() const
|
||||
{
|
||||
QMatrix4x4 model;
|
||||
model.translate(m_panX, m_panY, m_zoom);
|
||||
model.rotate(m_xRot / 16.0f, 1, 0, 0);
|
||||
model.rotate(m_yRot / 16.0f, 0, 1, 0);
|
||||
return model;
|
||||
}
|
||||
|
||||
float Camera::xRotation() const { return m_xRot; }
|
||||
void Camera::setXRotation(float angle)
|
||||
{
|
||||
if (angle != m_xRot) {
|
||||
m_xRot = angle;
|
||||
emit cameraChanged();
|
||||
}
|
||||
}
|
||||
|
||||
float Camera::yRotation() const { return m_yRot; }
|
||||
void Camera::setYRotation(float angle)
|
||||
{
|
||||
if (angle != m_yRot) {
|
||||
m_yRot = angle;
|
||||
emit cameraChanged();
|
||||
}
|
||||
}
|
||||
|
||||
float Camera::zoom() const { return m_zoom; }
|
||||
void Camera::setZoom(float value)
|
||||
{
|
||||
if (value != m_zoom) {
|
||||
m_zoom = value;
|
||||
emit cameraChanged();
|
||||
}
|
||||
}
|
||||
|
||||
float Camera::panX() const { return m_panX; }
|
||||
void Camera::setPanX(float value)
|
||||
{
|
||||
if (value != m_panX) {
|
||||
m_panX = value;
|
||||
emit cameraChanged();
|
||||
}
|
||||
}
|
||||
|
||||
float Camera::panY() const { return m_panY; }
|
||||
void Camera::setPanY(float value)
|
||||
{
|
||||
if (value != m_panY) {
|
||||
m_panY = value;
|
||||
emit cameraChanged();
|
||||
}
|
||||
}
|
||||
|
||||
void Camera::saveState()
|
||||
{
|
||||
m_savedXRot = m_xRot;
|
||||
m_savedYRot = m_yRot;
|
||||
m_savedPanX = m_panX;
|
||||
m_savedPanY = m_panY;
|
||||
m_savedZoom = m_zoom;
|
||||
}
|
||||
|
||||
void Camera::restoreState()
|
||||
{
|
||||
setXRotation(m_savedXRot);
|
||||
setYRotation(m_savedYRot);
|
||||
setPanX(m_savedPanX);
|
||||
setPanY(m_savedPanY);
|
||||
setZoom(m_savedZoom);
|
||||
}
|
||||
Reference in New Issue
Block a user