X-Git-Url: http://git.treefish.org/~alex/seamulator.git/blobdiff_plain/40fe15ee6190427f3bbc5db4ff640442626cc3bb..refs/heads/noise:/src/seamulator.cpp
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();