Advertisement
Guest User

Updated GLWater

a guest
Oct 17th, 2011
36
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.37 KB | None | 0 0
  1. #define WIN32_LEAN_AND_MEAN
  2. #define WIN32_EXTRA_LEAN
  3. #include <windows.h>
  4. #include <cmath>
  5. #include <gl/gl.h>
  6. #include <gl/glu.h>
  7. #include "GLWater.h"
  8.  
  9. #define MAP_WIDTH       20
  10. #define MAP_HEIGHT      20
  11. #define MAP_SCALE       1
  12. #define WAVE_Y_SCALE    0.15f
  13.  
  14. float terrain[MAP_WIDTH][MAP_HEIGHT][3];
  15. float deformData[MAP_WIDTH][MAP_HEIGHT];
  16. DWORD lastTime;
  17. float timeCoefficient = 0.0f;
  18.  
  19. float x_pos = 0.0f;
  20. float y_pos = 5.0f;
  21. float z_pos = 20.0f;
  22. float x_look = 0.0f;
  23. float y_look = -5.0f;
  24.  
  25.  
  26. ///////////////////////////////////////////////////////////////////////////////
  27. // Fast lookup table
  28. #define MAX_CIRCLE_ANGLE            512
  29. #define HALF_MAX_CIRCLE_ANGLE       256
  30. #define RECIP_HALF_MAX_CIRCLE_ANGLE 0.00390625f
  31. #define QUARTER_MAX_CIRCLE_ANGLE    128
  32. #define MASK_MAX_CIRCLE_ANGLE       511
  33. #define PI                          3.1415926535897932f
  34. #define PI_RECIPRICAL               0.3183098861837907f
  35.  
  36. float fast_cossin_table[MAX_CIRCLE_ANGLE];
  37.  
  38. float FAST_SIN(float n) {
  39.     float f = n * HALF_MAX_CIRCLE_ANGLE * PI_RECIPRICAL;
  40.     int i = int(f);
  41.     if (i < 0)
  42.         return fast_cossin_table[(-((-i)&MASK_MAX_CIRCLE_ANGLE)) + MAX_CIRCLE_ANGLE];
  43.     return fast_cossin_table[i&MASK_MAX_CIRCLE_ANGLE];
  44. }
  45.  
  46. float FAST_COS(float n) {
  47.     float f = n * HALF_MAX_CIRCLE_ANGLE * PI_RECIPRICAL;
  48.     int i = int(f);
  49.     if (i < 0)
  50.         return fast_cossin_table[((-i) + QUARTER_MAX_CIRCLE_ANGLE)&MASK_MAX_CIRCLE_ANGLE];
  51.     return fast_cossin_table[(i + QUARTER_MAX_CIRCLE_ANGLE)&MASK_MAX_CIRCLE_ANGLE];
  52. }
  53.  
  54. inline void SetupSinCosLookupTable() {
  55.     for (int i = 0 ; i < MAX_CIRCLE_ANGLE ; i++) {
  56.         fast_cossin_table[i] = (float)sin((double)i * PI * RECIP_HALF_MAX_CIRCLE_ANGLE);
  57.     }
  58. }
  59. ///////////////////////////////////////////////////////////////////////////////
  60.  
  61.  
  62. void Initialize() {
  63.     SetupSinCosLookupTable();
  64.  
  65.     glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
  66.     timeCoefficient = 0.0f;
  67.  
  68.     for (int z = 0; z < MAP_WIDTH; ++z) {
  69.         for (int x = 0; x < MAP_HEIGHT; ++x) {
  70.             deformData[x][z] = (x == 0) ? 0.0f : float(FAST_SIN(x)) * WAVE_Y_SCALE;
  71.             deformData[x][z] += (z == 0) ? 0.0f : float(FAST_SIN(z)) * WAVE_Y_SCALE;
  72.  
  73.             terrain[x][z][0] = -10.0f +  x * MAP_SCALE;
  74.             terrain[x][z][1] = deformData[x][z];
  75.             terrain[x][z][2] = -1.0f * (-10.0f + z) * MAP_SCALE;
  76.         }
  77.     }
  78.  
  79.     lastTime = GetTickCount();
  80. }
  81.  
  82. void RenderWater() {
  83.     for (int z = 0; z < MAP_WIDTH - 1; ++z) {
  84.         glBegin(GL_TRIANGLE_STRIP);
  85.         for (int x = 0; x < MAP_HEIGHT - 1; ++x) {
  86.             glColor3f(1.0f, 0.0f, 0.0f);
  87.             glVertex3f(terrain[x][z][0], terrain[x][z][1], terrain[x][z][2]);
  88.  
  89.             glColor3f(1.0f, 0.0f, 0.0f);
  90.             glVertex3f(terrain[x + 1][z][0], terrain[x + 1][z][1], terrain[x + 1][z][2]);
  91.  
  92.             glColor3f(1.0f, 0.0f, 0.0f);
  93.             glVertex3f(terrain[x][z + 1][0], terrain[x][z + 1][1], terrain[x][z + 1][2]);
  94.  
  95.             glColor3f(1.0f, 0.0f, 0.0f);
  96.             glVertex3f(terrain[x + 1][z + 1][0], terrain[x + 1][z + 1][1], terrain[x + 1][z + 1][2]);
  97.         }
  98.         glEnd();
  99.     }
  100. }
  101.  
  102. void Update() {
  103.     DWORD thisTime = GetTickCount();
  104.     float deltaTime = (float)(thisTime - lastTime) * 0.001f;
  105.     lastTime = thisTime;
  106.  
  107.     timeCoefficient += deltaTime;
  108.  
  109.     for (int z = 0; z < MAP_WIDTH; ++z) {
  110.         for (int x = 0; x < MAP_HEIGHT; ++x) {
  111.             deformData[x][z] = float(FAST_SIN(x + timeCoefficient)) * WAVE_Y_SCALE;
  112.             deformData[x][z] += float(FAST_SIN(z + timeCoefficient)) * WAVE_Y_SCALE;
  113.  
  114.             terrain[x][z][1] = deformData[x][z];
  115.         }
  116.     }
  117.  
  118.     if (GetAsyncKeyState('W')) z_pos -= deltaTime * 3.0f;
  119.     else if (GetAsyncKeyState('S')) z_pos += deltaTime * 3.0f;
  120.     if (GetAsyncKeyState('A')) x_pos += deltaTime * 3.0f;
  121.     else if (GetAsyncKeyState('D')) x_pos -= deltaTime * 3.0f;
  122.     if (GetAsyncKeyState('Q')) y_pos += deltaTime * 3.0f;
  123.     else if (GetAsyncKeyState('E')) y_pos -= deltaTime * 3.0f;
  124.     if (GetAsyncKeyState('R')) y_look += deltaTime * 3.0f;
  125.     else if (GetAsyncKeyState('F')) y_look -= deltaTime * 3.0f;
  126.     if (GetAsyncKeyState('Z')) x_look += deltaTime * 3.0f;
  127.     else if (GetAsyncKeyState('X')) x_look -= deltaTime * 3.0f;
  128.     if (GetAsyncKeyState('C')) x_look = 0.0f;
  129.     if (GetAsyncKeyState('V')) y_look = -5.0f;
  130. }
  131.  
  132. void Shutdown() {
  133.  
  134. }
  135.  
  136. void Suspend(bool paused) {
  137.  
  138. }
  139.  
  140. void Render() {
  141.     glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
  142.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  143.  
  144.     glMatrixMode(GL_MODELVIEW);
  145.     glPushMatrix();
  146.     glLoadIdentity();
  147.  
  148.     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);
  149.    
  150.     RenderWater();
  151.    
  152.     glPopMatrix();
  153. }
  154.  
  155.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement