From 94e405360849659ff951816a13cf510f11a7eee7 Mon Sep 17 00:00:00 2001 From: Alexander Schmidt Date: Thu, 14 Jul 2016 22:38:51 +0200 Subject: [PATCH 1/1] Initial commit --- .gitignore | 6 ++++ CMakeLists.txt | 10 +++++++ sea.cpp | 17 ++++++++++++ sea.h | 13 +++++++++ seamulator.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++++++ surfacepoint.cpp | 11 ++++++++ surfacepoint.h | 11 ++++++++ watersurface.cpp | 16 +++++++++++ watersurface.h | 17 ++++++++++++ 9 files changed, 172 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 sea.cpp create mode 100644 sea.h create mode 100644 seamulator.cpp create mode 100644 surfacepoint.cpp create mode 100644 surfacepoint.h create mode 100644 watersurface.cpp create mode 100644 watersurface.h diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1442d4e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*~ +CMakeCache.txt +CMakeFiles +Makefile +cmake_install.cmake +seamulator diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..aca8dab --- /dev/null +++ b/CMakeLists.txt @@ -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 index 0000000..37a6cd6 --- /dev/null +++ b/sea.cpp @@ -0,0 +1,17 @@ +#include "sea.h" + +#include + +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 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 index 0000000..6bb51c9 --- /dev/null +++ b/seamulator.cpp @@ -0,0 +1,71 @@ +#include + +#include + +#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 index 0000000..4e39d07 --- /dev/null +++ b/surfacepoint.cpp @@ -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 index 0000000..9a577f9 --- /dev/null +++ b/surfacepoint.h @@ -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 index 0000000..f9e7803 --- /dev/null +++ b/watersurface.cpp @@ -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 index 0000000..bb0c77a --- /dev/null +++ b/watersurface.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +#include "surfacepoint.h" + +class WaterSurface +{ + public: + WaterSurface(int size); + SurfacePoint& at(int x, int y); + int size() const; + + private: + std::vector m_points; + int m_size; +}; -- 2.39.5