]> git.treefish.org Git - seamulator.git/commitdiff
Initial commit
authorAlexander Schmidt <alex@treefish.org>
Thu, 14 Jul 2016 20:38:51 +0000 (22:38 +0200)
committerAlexander Schmidt <alex@treefish.org>
Thu, 14 Jul 2016 20:38:51 +0000 (22:38 +0200)
.gitignore [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
sea.cpp [new file with mode: 0644]
sea.h [new file with mode: 0644]
seamulator.cpp [new file with mode: 0644]
surfacepoint.cpp [new file with mode: 0644]
surfacepoint.h [new file with mode: 0644]
watersurface.cpp [new file with mode: 0644]
watersurface.h [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..1442d4e
--- /dev/null
@@ -0,0 +1,6 @@
+*~
+CMakeCache.txt
+CMakeFiles
+Makefile
+cmake_install.cmake
+seamulator
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..aca8dab
--- /dev/null
@@ -0,0 +1,10 @@
+cmake_minimum_required(VERSION 2.8)
+
+project(seamulator)
+
+find_package(OpenGL REQUIRED)
+find_package(GLUT REQUIRED)
+include_directories(${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS})
+
+add_executable(seamulator seamulator.cpp sea.cpp watersurface.cpp surfacepoint.cpp)
+target_link_libraries(seamulator ${OPENGL_LIBRARIES} ${GLUT_LIBRARY})
diff --git a/sea.cpp b/sea.cpp
new file mode 100644 (file)
index 0000000..37a6cd6
--- /dev/null
+++ b/sea.cpp
@@ -0,0 +1,17 @@
+#include "sea.h"
+
+#include <cstdlib>
+
+Sea::Sea(WaterSurface& surface) : m_surface{surface}
+{
+}
+
+void Sea::update()
+{
+  for (int y = 0; y < m_surface.size(); ++y) {
+    for (int x = 0; x < m_surface.size(); ++x) {
+      m_surface.at(x, y)
+       .setHeight(((double)std::rand()/(double)RAND_MAX));
+    }
+  }
+}
diff --git a/sea.h b/sea.h
new file mode 100644 (file)
index 0000000..6a9cd0a
--- /dev/null
+++ b/sea.h
@@ -0,0 +1,13 @@
+#pragma once
+
+#include "watersurface.h"
+
+class Sea
+{
+ public:
+  Sea(WaterSurface& surface);
+  void update();
+
+ private:
+  WaterSurface& m_surface;
+};
diff --git a/seamulator.cpp b/seamulator.cpp
new file mode 100644 (file)
index 0000000..6bb51c9
--- /dev/null
@@ -0,0 +1,71 @@
+#include <ctime>
+
+#include <GL/glut.h>
+
+#include "sea.h"
+#include "watersurface.h"
+
+const int LATTICE_SIZE = 10;
+const int LATTICE_UNIT = 1;
+
+WaterSurface surface(LATTICE_SIZE);
+Sea sea(surface);
+
+void drawSingleTile(int x, int y)
+{
+  glBegin(GL_TRIANGLES);
+
+  glVertex3f(x, y, surface.at(x, y).getHeight());
+  glVertex3f(x+1, y, surface.at(x+1, y).getHeight());
+  glVertex3f(x+1, y+1, surface.at(x+1, y+1).getHeight());
+
+  glVertex3f(x, y, surface.at(x, y).getHeight());
+  glVertex3f(x, y+1, surface.at(x, y+1).getHeight());
+  glVertex3f(x+1, y+1, surface.at(x+1, y+1).getHeight());
+
+  glEnd();
+}
+
+void displayMe(void)
+{
+  glMatrixMode(GL_PROJECTION); // Switch to the projection matrix so that we can manipulate how our scene is viewed  
+  glLoadIdentity(); // Reset the projection matrix to the identity matrix so that we don't get any artifacts (cleaning up)
+  gluPerspective(50, (GLfloat)300 / (GLfloat)300, 0, 1000); // Set the Field of view angle (in degrees), the aspect ratio of our window, and the new and far planes
+  gluLookAt(0,-10,10, 0,0,0, 0,1,0);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  glClear(GL_COLOR_BUFFER_BIT);
+
+  sea.update();
+
+  glScalef(LATTICE_UNIT, LATTICE_UNIT, 1.0f);
+  glTranslatef(-(float)(LATTICE_SIZE-1)/2, -(float)(LATTICE_SIZE-1)/2, 0);
+  for (int y = 0; y < LATTICE_SIZE-1; ++y) {
+    for (int x = 0; x < LATTICE_SIZE-1; ++x) {
+      drawSingleTile(x, y);
+    }
+  }
+
+  glFlush();
+
+  glutPostRedisplay();
+}
+
+int main(int argc, char** argv)
+{
+  std::srand(std::time(0));
+
+  glutInit(&argc, argv);
+  glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
+  glEnable(GL_DEPTH_TEST);
+  glutInitWindowSize(300, 300);
+  glutInitWindowPosition(100, 100);
+  glutCreateWindow("seamulator");
+
+  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+  glutDisplayFunc(displayMe);
+  glutMainLoop();
+  return 0;
+}
diff --git a/surfacepoint.cpp b/surfacepoint.cpp
new file mode 100644 (file)
index 0000000..4e39d07
--- /dev/null
@@ -0,0 +1,11 @@
+#include "surfacepoint.h"
+
+double SurfacePoint::getHeight() const
+{
+  return m_height;
+}
+
+void SurfacePoint::setHeight(double height)
+{
+  m_height = height;
+}
diff --git a/surfacepoint.h b/surfacepoint.h
new file mode 100644 (file)
index 0000000..9a577f9
--- /dev/null
@@ -0,0 +1,11 @@
+#pragma once
+
+class SurfacePoint
+{
+ public:
+  double getHeight() const;
+  void setHeight(double height);
+
+ private:
+  double m_height = 0;
+};
diff --git a/watersurface.cpp b/watersurface.cpp
new file mode 100644 (file)
index 0000000..f9e7803
--- /dev/null
@@ -0,0 +1,16 @@
+#include "watersurface.h"
+
+WaterSurface::WaterSurface(int size) : m_size{size}
+{
+  m_points.resize(size*size);
+}
+
+SurfacePoint& WaterSurface::at(int x, int y)
+{
+  return m_points.at(x + m_size*y);
+}
+
+int WaterSurface::size() const
+{
+  return m_size;
+}
diff --git a/watersurface.h b/watersurface.h
new file mode 100644 (file)
index 0000000..bb0c77a
--- /dev/null
@@ -0,0 +1,17 @@
+#pragma once
+
+#include <vector>
+
+#include "surfacepoint.h"
+
+class WaterSurface
+{
+ public:
+  WaterSurface(int size);
+  SurfacePoint& at(int x, int y);
+  int size() const;
+
+ private:
+  std::vector<SurfacePoint> m_points;
+  int m_size;
+};