X-Git-Url: http://git.treefish.org/~alex/seamulator.git/blobdiff_plain/444591b1b4dcd7ea0fa37b6db29ac20d4722a72c..e19dd20d04a2a92b3d91bd25a69210a2351b08c9:/seamulator.cpp diff --git a/seamulator.cpp b/seamulator.cpp index 92567f8..1c1ff67 100644 --- a/seamulator.cpp +++ b/seamulator.cpp @@ -1,24 +1,27 @@ #include #include +#include #include #include "sea.h" +#include "seaview.h" #include "watersurface.h" -const int LATTICE_SIZE = 10; -const double LATTICE_UNIT = 1; +const int LATTICE_SIZE{10}; +const double LATTICE_EXTEND{10}; +const int INIT_WINDOW_POS_X{100}; +const int INIT_WINDOW_POS_Y{100}; +const int INIT_WINDOW_WIDTH{300}; +const int INIT_WINDOW_HEIGHT{300}; +const double INIT_VIEW_DISTANCE{LATTICE_EXTEND * 1.5}; +const double INIT_VIEW_AZIMUTH{0}; +const double INIT_VIEW_ALTITUDE{M_PI / 4}; +const char WINDOW_TITLE[]{"seamulator"}; SeaPtr sea; WaterSurfacePtr surface; - -struct -{ - float lookRadius = LATTICE_SIZE*LATTICE_UNIT*1.5; - float lookAz = 0; - float lookAlt = M_PI/4; - float fstMouseAngle[2], oldLookAz, oldLookAlt; -} view; +std::unique_ptr seaView; void glDisplayFunc(); void glReshapeFunc(int width, int height); @@ -29,15 +32,16 @@ int main(int argc, char** argv) { std::srand(std::time(0)); - surface = std::make_shared(LATTICE_SIZE, LATTICE_UNIT); + surface = std::make_shared(LATTICE_SIZE, LATTICE_EXTEND); sea = std::make_shared(surface); + seaView = std::make_unique(INIT_VIEW_DISTANCE, INIT_VIEW_AZIMUTH, + INIT_VIEW_ALTITUDE); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE); - glutInitWindowSize(300, 300); - glutInitWindowPosition(100, 100); - glutCreateWindow("seamulator"); - + glutInitWindowSize(INIT_WINDOW_WIDTH, INIT_WINDOW_HEIGHT); + glutInitWindowPosition(INIT_WINDOW_POS_X, INIT_WINDOW_POS_Y); + glutCreateWindow(WINDOW_TITLE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glutDisplayFunc(glDisplayFunc); @@ -52,79 +56,30 @@ int main(int argc, char** argv) void glDisplayFunc() { - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glClear(GL_COLOR_BUFFER_BIT); + seaView->setupView(); sea->update(); surface->draw(); glutSwapBuffers(); - glutPostRedisplay(); } -void updateView(int width, int height) +void glReshapeFunc(int width, int height) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(50.0, ((float)width/(float)height), 0, 1000.0); glViewport(0, 0, width, height); - - float eyePos[3]; - eyePos[0] = view.lookRadius*cos(view.lookAlt)*sin(view.lookAz); - eyePos[1] = view.lookRadius*cos(view.lookAlt)*cos(view.lookAz); - eyePos[2] = view.lookRadius*sin(view.lookAlt); - - gluLookAt(eyePos[0], eyePos[1], eyePos[2], - 0, 0, 0, - 0, 0, 1); -} - -void updateView() -{ - updateView(glutGet(GLUT_WINDOW_WIDTH), glutGet(GLUT_WINDOW_HEIGHT)); -} - -void glReshapeFunc(int width, int height) -{ - updateView(width, height); } void glMouseFunc(int button, int state, int x, int y) { - if (button == 3 && state == 0) - { - view.lookRadius += view.lookRadius*0.1; - updateView(); - } - - else if (button == 4 && state == 0) - { - view.lookRadius -= view.lookRadius*0.1; - updateView(); - } - - else if (button == 0 && state == 0) { - view.fstMouseAngle[0] = x; - view.fstMouseAngle[1] = y; - view.oldLookAz = view.lookAz; - view.oldLookAlt = view.lookAlt; - } - + seaView->onMouseEvent(button, state, x, y); } void glMotionFunc(int x, int y) { - view.lookAlt = fmod(view.oldLookAlt + - (float)((y-view.fstMouseAngle[1])*2*M_PI/glutGet(GLUT_WINDOW_HEIGHT)), - (float)(2*M_PI)); - - view.lookAz = fmod(view.oldLookAz + - (float)((x-view.fstMouseAngle[0])*2*M_PI/glutGet(GLUT_WINDOW_WIDTH)), - (float)(2*M_PI)); - - updateView(); + seaView->onMouseMove(x, y); }