X-Git-Url: http://git.treefish.org/~alex/seamulator.git/blobdiff_plain/ce5cb9e3b065ec3eabd2ffa79923043fdfb2087a..40fe15ee6190427f3bbc5db4ff640442626cc3bb:/src/seaview.cpp?ds=sidebyside diff --git a/src/seaview.cpp b/src/seaview.cpp new file mode 100644 index 0000000..035f557 --- /dev/null +++ b/src/seaview.cpp @@ -0,0 +1,62 @@ +#include "seaview.h" + +#include + +#include + +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); +}