]> git.treefish.org Git - seamulator.git/blob - seaview.cpp
035f557343c9bacebdf36b85e29bbfca1594293f
[seamulator.git] / seaview.cpp
1 #include "seaview.h"
2
3 #include <cmath>
4
5 #include <GL/glut.h>
6
7 SeaView::SeaView(double distance, double azimuth, double altitude) :
8   m_distance{distance},
9   m_azimuth{azimuth},
10   m_altitude{altitude}
11 {
12 }
13
14 void SeaView::onMouseEvent(int button, int state, int x, int y)
15 {
16   if (button == 3 && state == 0) {
17     m_distance += m_distance*DISTANCE_MULTIPLIER;
18     glutPostRedisplay();
19   }
20   else if (button == 4 && state == 0) {
21     m_distance -= m_distance*DISTANCE_MULTIPLIER;
22     glutPostRedisplay();
23   }
24   else if (button == 0 && state == 0) {
25     m_mouseDownPos[0] = x;
26     m_mouseDownPos[1] = y;
27     m_mouseDownAzimuth = m_azimuth;
28     m_mouseDownAltitude = m_altitude;
29   }
30 }
31
32 void SeaView::onMouseMove(int x, int y)
33 {
34   m_altitude =
35     fmod(m_mouseDownAltitude +
36          (double)((y - m_mouseDownPos[1]) *
37                   2*M_PI / glutGet(GLUT_WINDOW_HEIGHT)),
38          (double)(2*M_PI));
39
40   m_azimuth =
41     fmod(m_mouseDownAzimuth +
42          (double)((x - m_mouseDownPos[0]) *
43                   2*M_PI / glutGet(GLUT_WINDOW_WIDTH)),
44          (double)(2*M_PI));
45
46   glutPostRedisplay();
47 }
48
49 void SeaView::setupView() const
50 {
51   glMatrixMode(GL_MODELVIEW);
52   glLoadIdentity();
53
54   const double eyePos[3] =
55     {m_distance * cos(m_altitude) * sin(m_azimuth),
56      m_distance * cos(m_altitude) * cos(m_azimuth),
57      m_distance * sin(m_altitude)};
58
59   gluLookAt(eyePos[0], eyePos[1], eyePos[2],
60             0, 0, 0,
61             0, 0, 1);
62 }