diff --git a/src/pulsaranimationwidget.cpp b/src/pulsaranimationwidget.cpp index 1e5e25d2a9c232d61046bda32e1ce33b243b4659..9dca1f7a6dde8f2bb8dd14482258ea27ca5b40d5 100644 --- a/src/pulsaranimationwidget.cpp +++ b/src/pulsaranimationwidget.cpp @@ -42,6 +42,15 @@ PulsarAnimationWidget::PulsarAnimationWidget(QWidget *parent) : setOrbitFrequency(0.2f); setOrbitRadius(4.0f); m_orbitRotationAngle = 0.0f; + + m_mouseLastX = 0; + m_mouseLastY = 0; + m_mouseAngleH = 90; + m_mouseAngleV = 30; + m_cameraZoom = 10.0f; + m_cameraZoomLBound = 2.0f; + + updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom); } PulsarAnimationWidget::~PulsarAnimationWidget() @@ -106,7 +115,9 @@ void PulsarAnimationWidget::paintGL() glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - gluLookAt(0.0, 6.0, 10.0, 0.0, 0.0, 0.0, 0.0, 2.0, -5.0); + gluLookAt(m_cameraPosX, m_cameraPosY, m_cameraPosZ, + 0.0, 0.0, 0.0, + 0.0, 2.0, -5.0); // TODO: should be located elsewhere static GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 }; @@ -199,6 +210,54 @@ void PulsarAnimationWidget::updateOrbit() } } +void PulsarAnimationWidget::mouseMoveEvent(QMouseEvent *event) +{ + Qt::MouseButtons buttons = event->buttons(); + if((buttons & Qt::LeftButton) == Qt::LeftButton) { + if(m_mouseLastX != 0) { + m_mouseAngleH -= (m_mouseLastX - event->x()) / 2; + m_mouseAngleH = m_mouseAngleH < 360? m_mouseAngleH : 0; + + } + if(m_mouseLastY != 0) { + m_mouseAngleV -= (m_mouseLastY - event->y()) / 2; + m_mouseAngleV = m_mouseAngleV < 90? m_mouseAngleV : 90; + m_mouseAngleV = m_mouseAngleV > -90? m_mouseAngleV : -90; + } + + m_mouseLastX = event->x(); + m_mouseLastY = event->y(); + } + else if((buttons & Qt::RightButton) == Qt::RightButton) { + if(m_mouseLastY != 0) { + m_cameraZoom -= (m_mouseLastY - event->y()) / 2; + m_cameraZoom = m_cameraZoom >= m_cameraZoomLBound? m_cameraZoom : m_cameraZoomLBound; + updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom); + } + + m_mouseLastY = event->y(); + } + + updateCameraPosition(m_mouseAngleH, m_mouseAngleV, m_cameraZoom); +} + +void PulsarAnimationWidget::mouseReleaseEvent(QMouseEvent *event) +{ + m_mouseLastX = 0; + m_mouseLastY = 0; +} + +void PulsarAnimationWidget::updateCameraPosition(const int angleH, const int angleV, const float zoom) +{ + static const float deg2rad = PI/180.0f; + + m_cameraPosX = sin(angleH * deg2rad) * zoom; + m_cameraPosY = sin(angleV * deg2rad) * zoom; + m_cameraPosZ = cos(angleH * deg2rad) * cos(abs(angleV * deg2rad)) * zoom; + + updateGL(); +} + void PulsarAnimationWidget::setFramePerSecond(const unsigned int fps) { m_framesPerSecond = fps; diff --git a/src/pulsaranimationwidget.h b/src/pulsaranimationwidget.h index b16dd990f6d77242c629005e02d2b5cf4bd14532..3dc5fa01b9e03148c5e1aca086816ae2a6eb9cb1 100644 --- a/src/pulsaranimationwidget.h +++ b/src/pulsaranimationwidget.h @@ -21,8 +21,13 @@ #ifndef PULSARANIMATIONWIDGET_H_ #define PULSARANIMATIONWIDGET_H_ +#include <cmath> + #include <QGLWidget> #include <QTimer> +#include <QMouseEvent> + +#define PI 3.14159265 class PulsarAnimationWidget : public QGLWidget { @@ -47,14 +52,15 @@ public slots: void updateOrbit(); protected: - void initializeGL(); - void resizeGL(int w, int h); - void paintGL(); -private: + void mouseMoveEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + + void updateCameraPosition(const int angleH, const int angleV, const float zoom); + QTimer m_frameTimer; QTimer m_pulsarSpinTimer; QTimer m_orbitTimer; @@ -71,6 +77,16 @@ private: float m_orbitRadius; float m_orbitFrequency; float m_orbitRotationAngle; + + int m_mouseLastX; + int m_mouseLastY; + int m_mouseAngleH; + int m_mouseAngleV; + float m_cameraZoom; + float m_cameraZoomLBound; + float m_cameraPosX; + float m_cameraPosY; + float m_cameraPosZ; }; #endif /* PULSARANIMATIONWIDGET_H_ */