Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define WIN32_LEAN_AND_MEAN
- #define WIN32_EXTRA_LEAN
- #include <windows.h>
- #include <cmath>
- #include <gl/gl.h>
- #include <gl/glu.h>
- #include "GLWater.h"
- #define MAP_WIDTH 20
- #define MAP_HEIGHT 20
- #define MAP_SCALE 1
- #define WAVE_Y_SCALE 0.15f
- float terrain[MAP_WIDTH][MAP_HEIGHT][3];
- float deformData[MAP_WIDTH][MAP_HEIGHT];
- DWORD lastTime;
- float timeCoefficient = 0.0f;
- float x_pos = 0.0f;
- float y_pos = 5.0f;
- float z_pos = 20.0f;
- float x_look = 0.0f;
- float y_look = -5.0f;
- ///////////////////////////////////////////////////////////////////////////////
- // Fast lookup table
- #define MAX_CIRCLE_ANGLE 512
- #define HALF_MAX_CIRCLE_ANGLE 256
- #define RECIP_HALF_MAX_CIRCLE_ANGLE 0.00390625f
- #define QUARTER_MAX_CIRCLE_ANGLE 128
- #define MASK_MAX_CIRCLE_ANGLE 511
- #define PI 3.1415926535897932f
- #define PI_RECIPRICAL 0.3183098861837907f
- float fast_cossin_table[MAX_CIRCLE_ANGLE];
- float FAST_SIN(float n) {
- float f = n * HALF_MAX_CIRCLE_ANGLE * PI_RECIPRICAL;
- int i = int(f);
- if (i < 0)
- return fast_cossin_table[(-((-i)&MASK_MAX_CIRCLE_ANGLE)) + MAX_CIRCLE_ANGLE];
- return fast_cossin_table[i&MASK_MAX_CIRCLE_ANGLE];
- }
- float FAST_COS(float n) {
- float f = n * HALF_MAX_CIRCLE_ANGLE * PI_RECIPRICAL;
- int i = int(f);
- if (i < 0)
- return fast_cossin_table[((-i) + QUARTER_MAX_CIRCLE_ANGLE)&MASK_MAX_CIRCLE_ANGLE];
- return fast_cossin_table[(i + QUARTER_MAX_CIRCLE_ANGLE)&MASK_MAX_CIRCLE_ANGLE];
- }
- inline void SetupSinCosLookupTable() {
- for (int i = 0 ; i < MAX_CIRCLE_ANGLE ; i++) {
- fast_cossin_table[i] = (float)sin((double)i * PI * RECIP_HALF_MAX_CIRCLE_ANGLE);
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- void Initialize() {
- SetupSinCosLookupTable();
- glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
- timeCoefficient = 0.0f;
- for (int z = 0; z < MAP_WIDTH; ++z) {
- for (int x = 0; x < MAP_HEIGHT; ++x) {
- deformData[x][z] = (x == 0) ? 0.0f : float(FAST_SIN(x)) * WAVE_Y_SCALE;
- deformData[x][z] += (z == 0) ? 0.0f : float(FAST_SIN(z)) * WAVE_Y_SCALE;
- terrain[x][z][0] = -10.0f + x * MAP_SCALE;
- terrain[x][z][1] = deformData[x][z];
- terrain[x][z][2] = -1.0f * (-10.0f + z) * MAP_SCALE;
- }
- }
- lastTime = GetTickCount();
- }
- void RenderWater() {
- for (int z = 0; z < MAP_WIDTH - 1; ++z) {
- glBegin(GL_TRIANGLE_STRIP);
- for (int x = 0; x < MAP_HEIGHT - 1; ++x) {
- glColor3f(1.0f, 0.0f, 0.0f);
- glVertex3f(terrain[x][z][0], terrain[x][z][1], terrain[x][z][2]);
- glColor3f(1.0f, 0.0f, 0.0f);
- glVertex3f(terrain[x + 1][z][0], terrain[x + 1][z][1], terrain[x + 1][z][2]);
- glColor3f(1.0f, 0.0f, 0.0f);
- glVertex3f(terrain[x][z + 1][0], terrain[x][z + 1][1], terrain[x][z + 1][2]);
- glColor3f(1.0f, 0.0f, 0.0f);
- glVertex3f(terrain[x + 1][z + 1][0], terrain[x + 1][z + 1][1], terrain[x + 1][z + 1][2]);
- }
- glEnd();
- }
- }
- void Update() {
- DWORD thisTime = GetTickCount();
- float deltaTime = (float)(thisTime - lastTime) * 0.001f;
- lastTime = thisTime;
- timeCoefficient += deltaTime;
- for (int z = 0; z < MAP_WIDTH; ++z) {
- for (int x = 0; x < MAP_HEIGHT; ++x) {
- deformData[x][z] = float(FAST_SIN(x + timeCoefficient)) * WAVE_Y_SCALE;
- deformData[x][z] += float(FAST_SIN(z + timeCoefficient)) * WAVE_Y_SCALE;
- terrain[x][z][1] = deformData[x][z];
- }
- }
- if (GetAsyncKeyState('W')) z_pos -= deltaTime * 3.0f;
- else if (GetAsyncKeyState('S')) z_pos += deltaTime * 3.0f;
- if (GetAsyncKeyState('A')) x_pos += deltaTime * 3.0f;
- else if (GetAsyncKeyState('D')) x_pos -= deltaTime * 3.0f;
- if (GetAsyncKeyState('Q')) y_pos += deltaTime * 3.0f;
- else if (GetAsyncKeyState('E')) y_pos -= deltaTime * 3.0f;
- if (GetAsyncKeyState('R')) y_look += deltaTime * 3.0f;
- else if (GetAsyncKeyState('F')) y_look -= deltaTime * 3.0f;
- if (GetAsyncKeyState('Z')) x_look += deltaTime * 3.0f;
- else if (GetAsyncKeyState('X')) x_look -= deltaTime * 3.0f;
- if (GetAsyncKeyState('C')) x_look = 0.0f;
- if (GetAsyncKeyState('V')) y_look = -5.0f;
- }
- void Shutdown() {
- }
- void Suspend(bool paused) {
- }
- void Render() {
- glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glLoadIdentity();
- gluLookAt(x_pos, y_pos, z_pos, x_pos + x_look, y_pos + y_look, z_pos - 20.0f, 0.0f, 1.0f, 0.0f);
- RenderWater();
- glPopMatrix();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement