X-Git-Url: http://git.treefish.org/~alex/seamulator.git/blobdiff_plain/40fe15ee6190427f3bbc5db4ff640442626cc3bb..114b763f99b178bfa8a5adc0b214a425914fdc31:/src/seamulator.cpp?ds=inline diff --git a/src/seamulator.cpp b/src/seamulator.cpp index c5f7936..aec8da1 100644 --- a/src/seamulator.cpp +++ b/src/seamulator.cpp @@ -1,20 +1,39 @@ +/** + * Copyright (C) 2016 Alexander Schmidt + * + * This file is part of Seamulator. + * + * Seamulator is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Seamulator is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Seamulator. If not, see . + */ + #include #include +#include #include +#include #include #include "sea.h" #include "seaview.h" +#include "synthesizer.h" #include "watersurface.h" -const int LATTICE_SIZE{128}; -const double LATTICE_EXTEND{10}; const int INIT_WINDOW_POS_X{50}; const int INIT_WINDOW_POS_Y{50}; const int INIT_WINDOW_WIDTH{800}; const int INIT_WINDOW_HEIGHT{600}; -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"}; @@ -22,20 +41,37 @@ const char WINDOW_TITLE[]{"seamulator"}; SeaPtr sea; WaterSurfacePtr surface; std::unique_ptr seaView; +std::unique_ptr synthesizer; + +struct Settings { + double windSpeed; + int latticeSize; + double latticeExtend; + double amplitudeFactor; +}; void glDisplayFunc(); void glReshapeFunc(int width, int height); void glMouseFunc(int button, int state, int x, int y); void glMotionFunc(int x, int y); +Settings parseArguments(int argc, char** argv); + +namespace po = boost::program_options; int main(int argc, char** argv) { - std::srand(std::time(0)); + Settings settings = parseArguments(argc, argv); - 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); + std::srand(std::time(0)); + surface = std::make_shared(settings.latticeSize, + settings.latticeExtend); + sea = std::make_shared(surface, + settings.windSpeed, + settings.amplitudeFactor); + seaView = std::make_unique(settings.latticeExtend * 1.5, + INIT_VIEW_AZIMUTH, + INIT_VIEW_ALTITUDE); + synthesizer = std::make_unique(surface); glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE); @@ -54,6 +90,46 @@ int main(int argc, char** argv) return 0; } +Settings parseArguments(int argc, char** argv) +{ + po::options_description desc("Available options"); + desc.add_options() + ("help,h", "show this help") + ("windspeed,w", po::value()->default_value(10), + "wind speed (m/s)") + ("size,s", po::value()->default_value('s'), + "lattice size (s|l)") + ("amplitude,a", po::value()->default_value(1), + "amplitude multiplicator") + ; + + po::variables_map vm; + po::store(po::parse_command_line(argc, argv, desc), vm); + po::notify(vm); + + if (vm.count("help")) { + std::cout << desc << "\n"; + exit(1); + } + + Settings settings; + + settings.windSpeed = vm["windspeed"].as(); + + if (vm["size"].as() == 'l') { + settings.latticeSize = 256; + settings.latticeExtend = 20; + settings.amplitudeFactor = vm["amplitude"].as() * 0.00000004; + } + else { + settings.latticeSize = 128; + settings.latticeExtend = 10; + settings.amplitudeFactor = vm["amplitude"].as() * 0.0000001; + } + + return settings; +} + void glDisplayFunc() { glClear(GL_COLOR_BUFFER_BIT); @@ -61,6 +137,7 @@ void glDisplayFunc() seaView->setupView(); sea->update(); surface->draw(); + synthesizer->tick(); glutSwapBuffers(); glutPostRedisplay();