From: Alexander Schmidt Date: Thu, 14 Jul 2016 20:38:51 +0000 (+0200) Subject: Initial commit X-Git-Url: http://git.treefish.org/~alex/seamulator.git/commitdiff_plain/94e405360849659ff951816a13cf510f11a7eee7 Initial commit --- 94e405360849659ff951816a13cf510f11a7eee7 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; +};