]> git.treefish.org Git - seamulator.git/blobdiff - seaview.cpp
Moved view code to separate class
[seamulator.git] / seaview.cpp
diff --git a/seaview.cpp b/seaview.cpp
new file mode 100644 (file)
index 0000000..035f557
--- /dev/null
@@ -0,0 +1,62 @@
+#include "seaview.h"
+
+#include <cmath>
+
+#include <GL/glut.h>
+
+SeaView::SeaView(double distance, double azimuth, double altitude) :
+  m_distance{distance},
+  m_azimuth{azimuth},
+  m_altitude{altitude}
+{
+}
+
+void SeaView::onMouseEvent(int button, int state, int x, int y)
+{
+  if (button == 3 && state == 0) {
+    m_distance += m_distance*DISTANCE_MULTIPLIER;
+    glutPostRedisplay();
+  }
+  else if (button == 4 && state == 0) {
+    m_distance -= m_distance*DISTANCE_MULTIPLIER;
+    glutPostRedisplay();
+  }
+  else if (button == 0 && state == 0) {
+    m_mouseDownPos[0] = x;
+    m_mouseDownPos[1] = y;
+    m_mouseDownAzimuth = m_azimuth;
+    m_mouseDownAltitude = m_altitude;
+  }
+}
+
+void SeaView::onMouseMove(int x, int y)
+{
+  m_altitude =
+    fmod(m_mouseDownAltitude +
+        (double)((y - m_mouseDownPos[1]) *
+                 2*M_PI / glutGet(GLUT_WINDOW_HEIGHT)),
+        (double)(2*M_PI));
+
+  m_azimuth =
+    fmod(m_mouseDownAzimuth +
+        (double)((x - m_mouseDownPos[0]) *
+                 2*M_PI / glutGet(GLUT_WINDOW_WIDTH)),
+        (double)(2*M_PI));
+
+  glutPostRedisplay();
+}
+
+void SeaView::setupView() const
+{
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  const double eyePos[3] =
+    {m_distance * cos(m_altitude) * sin(m_azimuth),
+     m_distance * cos(m_altitude) * cos(m_azimuth),
+     m_distance * sin(m_altitude)};
+
+  gluLookAt(eyePos[0], eyePos[1], eyePos[2],
+           0, 0, 0,
+           0, 0, 1);
+}