Water.cpp
上传用户:sz83729876
上传日期:2013-03-07
资源大小:4140k
文件大小:11k
源码类别:

OpenGL

开发平台:

Windows_Unix

  1. #include "../../main.h"
  2. /////////////////////////////////////////////////////////////////////
  3. vec3_t eye = {68.0f, 0.0f, 100.0f};
  4. vec3_t rot = {45.0f, 45.0f, 0.0f};
  5. int texmode=1, envMap=1;
  6. #define SIZE 1.6f
  7. DWORD tCur, tFps;
  8. DWORD tf=0, nf=0;
  9. int speed=70;
  10. int size=60;
  11. int hw=1;
  12. int OldX,OldY;
  13. float dt=(float) 0.02;
  14. float tval=(float) 1.0f/25;
  15. float surf[100][100][3];
  16. float norm[100][100][3];
  17. float force[100][100];
  18. float veloc[100][100];
  19. float LightAmbient[]= { 1.0f, 1.0f, 1.0f, 1.0f };
  20. float LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f };
  21. float LightPosition[]= { 0.0f, 0.0f, -20.0f, 1.0f };
  22. extern int w_height;
  23. extern int w_width;
  24. extern float m_fAngle;
  25. extern NIMG texwater6,Chrome,texstar;
  26. //extern PARTICLE_SYSTEM star;
  27. NIMG Texture;
  28. extern int num_water;
  29. //extern CCamera objCamera; 
  30. bool INIT = true;
  31. extern NSCENE  NScene[NUM_SCENE];
  32. extern Naskel3D Naskel;
  33. extern CCamera objCamera; 
  34. GLfloat Throttlei;
  35. GLfloat Throttle = 5;
  36. GLfloat _Throttle = Throttle;
  37. GLfloat Speed = Throttle;
  38. GLfloat Speedi;
  39. GLfloat glow = .4;
  40. GLfloat glowp = 0;
  41. int loop;
  42. float cubeH = 7.0;
  43. #define MAX_PARTICLES_BURNER 1000 // Number Of Particles To Create
  44. GLfloat slowdown=.50f; // Slow Down Particles
  45. GLfloat xspeed; // Base X Speed (To Allow Keyboard Direction Of Tail)
  46. GLfloat yspeed; // Base Y Speed (To Allow Keyboard Direction Of Tail)
  47. GLfloat water_flow = 0;
  48. GLfloat V;
  49. GLfloat Angle_burner;
  50. GLfloat AngleZ;
  51. typedef struct // Create A Structure For Particle
  52. {
  53. bool active; // Active (Yes/No)
  54. GLfloat life; // Particle Life
  55. GLfloat fade; // Fade Speed
  56. GLfloat r; // Red Value
  57. GLfloat g; // Green Value
  58. GLfloat b; // Blue Value
  59. GLfloat x; // X Position
  60. GLfloat y; // Y Position
  61. GLfloat z; // Z Position
  62. GLfloat xi; // X Direction
  63. GLfloat yi; // Y Direction
  64. GLfloat zi; // Z Direction
  65. GLfloat xg; // X Gravity
  66. GLfloat yg; // Y Gravity
  67. GLfloat zg; // Z Gravity
  68. } particles; // Particles Structure
  69. particles particle[MAX_PARTICLES_BURNER]; // Particle Array (Room For Particle Info)
  70. static GLfloat colors[12][3]= // Rainbow Of Colors
  71. {
  72. {1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},
  73. {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},
  74. {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}
  75. };
  76. inline GLfloat Hypot(GLfloat A, GLfloat B)
  77. {
  78.   return sqrt(A*A+B*B);
  79. }
  80. inline GLfloat ABS(GLfloat A)
  81. {
  82.   if (A < 0)
  83.   A = -A; 
  84.   return A;
  85. }
  86. /////////////////////////////////////////////////////////////////////
  87. namespace water {
  88. void Display(void)
  89. {   
  90. float PosX = objCamera.mPos.x, PosY = objCamera.mPos.y, PosZ = objCamera.mPos.z;
  91. float ViewX = objCamera.mView.x, ViewY = objCamera.mView.y, ViewZ = objCamera.mView.z; 
  92. glDisable(GL_BLEND);
  93. glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST);
  94. glEnable(GL_LIGHTING); glEnable(GL_TEXTURE_GEN_S);
  95. glEnable(GL_TEXTURE_GEN_T); glEnable(GL_LIGHT1);
  96. glEnable(GL_LIGHTING);
  97. Naskel.SetMouse();
  98. DrawSurface();
  99. if (tCur-tFps>(DWORD)(1000/speed)) { MakeNorm(); Wave(); tFps = tCur; }
  100. tCur=timeGetTime(); if (tCur-tf>=1000) {tf=tCur;nf=0;} else nf++;
  101. glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST);
  102. glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_GEN_S);
  103. glDisable(GL_TEXTURE_GEN_T);
  104. }
  105. void copy(float vec0[3], float vec1[3])
  106. {
  107.     vec0[0] = vec1[0];
  108.     vec0[1] = vec1[1];
  109.     vec0[2] = vec1[2];
  110. }
  111. void sub(float vec0[3], float vec1[3], float vec2[3])
  112. {
  113.     vec0[0] = vec1[0] - vec2[0];
  114.     vec0[1] = vec1[1] - vec2[1];
  115.     vec0[2] = vec1[2] - vec2[2];
  116. }
  117. void add(float vec0[3], float vec1[3], float vec2[3])
  118. {
  119.     vec0[0] = vec1[0] + vec2[0];
  120.     vec0[1] = vec1[1] + vec2[1];
  121.     vec0[2] = vec1[2] + vec2[2];
  122. }
  123. void scalDiv(float vec[3], float c)
  124. {
  125.     vec[0] /= c; vec[1] /= c; vec[2] /= c;
  126. }
  127. void cross(float vec0[3], float vec1[3], float vec2[3])
  128. {
  129.     vec0[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1];
  130.     vec0[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2];
  131.     vec0[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0];
  132. }
  133. void normz(float vec[3])
  134. {
  135.     float c = sqrt(vec[0] * vec[0] + vec[1] * vec[1] + vec[2] * vec[2]);
  136.     scalDiv(vec, c); 
  137. }
  138. void ResetSurface(void)
  139. {
  140. int i,j;
  141. for(i=0; i<size; i++)
  142. for(j=0; j<size; j++)
  143. {
  144. surf[i][j][0] = (float)i/(float)size * 100;
  145. surf[i][j][1] = 0;
  146. surf[i][j][2] = (float)j/(float)size * 100;
  147. force[i][j] = 0;
  148. veloc[i][j] = 0;
  149. }
  150. }
  151. void DrawSurface(void)
  152. {
  153. int i, j;
  154. glColor3f(1, 1, 1);
  155. glBindTexture(GL_TEXTURE_2D, texwater6.ID);
  156. for(j=0; j<size-1; j++) {
  157.    glBegin(GL_TRIANGLE_STRIP);
  158.    for(i=0; i<size; i++) {
  159.       glTexCoord2f((float)i*tval, (float)j*tval);
  160.       glNormal3f((float)norm[i][j][0], (float)norm[i][j][1], (float)norm[i][j][2]);
  161.       glVertex3f((float)surf[i][j][0], (float)surf[i][j][1], (float)surf[i][j][2]);
  162.       glTexCoord2f((float)i*tval, (float)(j+1)*tval);
  163.       glNormal3f((float)norm[i][j+1][0], (float)norm[i][j+1][1], (float)norm[i][j+1][2]);
  164.       glVertex3f((float)surf[i][j+1][0], (float)surf[i][j+1][1], (float)surf[i][j+1][2]);
  165.    }
  166.    glEnd();
  167. }
  168. int m = (int)((float)OldX/w_width * size);
  169. int n = (int)((float)OldY/w_height * size);
  170. glPushMatrix();
  171. glRotatef(m_fAngle, surf[m][n][0],10.0f-cubeH, surf[m][n][2]); m_fAngle +=0.8f;
  172. CreateCube(surf[m][n][0],10.0f-cubeH,surf[m][n][2], 2.0f);
  173. glPopMatrix();
  174. }
  175. void Move(int x, int y) 
  176. {
  177. int m, n; OldX = x; OldY = y;
  178. m = (int)((float)x/w_width * size);
  179. n = (int)((float)y/w_height * size);
  180. surf[m][n][1] = hw;
  181. surf[m][n+1][1] = hw;
  182. surf[m+1][n][1] = hw;
  183. surf[m+1][n+1][1] = hw;
  184. }
  185. void MakeNorm(void)
  186. {
  187. int i, j;
  188. float a[3],b[3],c[3];
  189. for(i=0; i<size; i++)
  190. for(j=0; j<size; j++)
  191. {
  192. if (i!=size-1 && j!=size-1)
  193. {
  194. sub(a, surf[i][j+1], surf[i][j]);
  195. sub(b, surf[i+1][j], surf[i][j]);
  196. }
  197. else
  198. {
  199. sub(a, surf[i][j-1], surf[i][j]);
  200. sub(b, surf[i-1][j], surf[i][j]);
  201. }
  202. cross(c, a, b);
  203. normz(c);
  204. if (i==0 && j==size-1)
  205. {
  206. sub(a, surf[i][j-1], surf[i][j]);
  207. sub(b, surf[i+1][j], surf[i][j]);
  208. cross(c, a, b);
  209. normz(c);
  210. c[0]=-c[0]; c[1]=-c[1]; c[2]=-c[2];
  211. }
  212. if (i==size-1 && j==0)
  213. {
  214. sub(a, surf[i-1][j], surf[i][j]);
  215. sub(b, surf[i][j+1], surf[i][j]);
  216. cross(c, a, b);
  217. normz(c);
  218. }
  219. copy(norm[i][j], c);
  220.    }
  221. }
  222. void Wave(void)
  223. {
  224. int i,j;
  225. float d;
  226. for(i=0; i<size; i++)
  227. for(j=0; j<size; j++)
  228. force[i][j] = 0.0f;
  229. for(i=1; i<size-1; i++)
  230. for(j=1; j<size-1; j++)
  231. {
  232. d=surf[i][j][1]-surf[i][j-1][1];
  233. force[i][j] -= d;
  234. force[i][j-1] += d;
  235. d=surf[i-1][j][1]-surf[i-1][j][1];
  236. force[i][j] -= d;
  237. force[i-1][j] += d;
  238. d=surf[i][j][1]-surf[i][j+1][1];
  239. force[i][j] -= d;
  240. force[i][j+1] += d;
  241. d=surf[i][j][1]-surf[i+1][j][1];
  242. force[i][j] -= d;
  243. force[i+1][j] += d;
  244. d=(surf[i][j][1]-surf[i+1][j+1][1])*SQRTOFTWOINV;
  245. force[i][j] -= d;
  246. force[i+1][j+1] += d;
  247. d=(surf[i][j][1]-surf[i-1][j-1][1])*SQRTOFTWOINV;
  248. force[i][j] -= d;
  249. force[i-1][j-1] += d;
  250. d=(surf[i][j][1]-surf[i+1][j-1][1])*SQRTOFTWOINV;
  251. force[i][j] -= d;
  252. force[i+1][j-1] += d;
  253. d=(surf[i][j][1]-surf[i+1][j-1][1])*SQRTOFTWOINV;
  254. force[i][j] -= d;
  255. force[i+1][j-1] += d;
  256. }
  257. for(i=0; i<size; i++)
  258. for(j=0; j<size; j++)
  259. veloc[i][j] += force[i][j] * dt;
  260. for(i=0; i<size; i++)
  261. for(j=0; j<size; j++)
  262. {
  263. surf[i][j][1] += veloc[i][j];
  264. if (surf[i][j][1]>0) surf[i][j][1] -= surf[i][j][1]/size;
  265. else surf[i][j][1] -= surf[i][j][1]/size;
  266. }
  267. }
  268. void Init(NIMG texwater)
  269. {
  270. Texture = texwater;
  271. glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
  272. glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
  273. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  274. glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient);
  275. glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);
  276. glLightfv(GL_LIGHT1, GL_POSITION,LightPosition);
  277. glBindTexture(GL_TEXTURE_2D, texwater6.ID);
  278. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  279.  
  280. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  281. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  282. ResetSurface();
  283. // Camera Pos
  284. objCamera.PositionCamera(
  285. 15.88, 8.20,87.90, 43.48, -20.01, 43.48, 0.00, 1.00, 0.00
  286. );  
  287. }
  288. void CreateCube(float x, float y, float z, float radius)
  289. {
  290. // Here we create 6 QUADS (Rectangles) to form a cube
  291. // With the passed in radius, we determine the width and height of the cube
  292. // You will notice, I add some color at each vertice to make it more interesting
  293. glPushMatrix();
  294. glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST);
  295. glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_GEN_S);
  296. glDisable(GL_TEXTURE_GEN_T);
  297. glBegin(GL_QUADS);
  298. // These vertices create the Back Side
  299. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  300. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z);
  301. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z); 
  302. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z);
  303. // These vertices create the Front Side
  304. glColor3ub(0, 0, 255);   glVertex3f(x, y, z + radius);
  305. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z + radius);
  306. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  307. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z + radius);
  308. // These vertices create the Bottom Face
  309. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  310. glColor3ub(255, 0, 255); glVertex3f(x, y, z + radius);
  311. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z + radius); 
  312. glColor3ub(0, 255, 255); glVertex3f(x + radius, y, z);
  313. // These vertices create the Top Face
  314. glColor3ub(0, 0, 255);   glVertex3f(x, y + radius, z);
  315. glColor3ub(255, 0, 255); glVertex3f(x, y + radius, z + radius);
  316. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  317. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z);
  318. // These vertices create the Left Face
  319. glColor3ub(0, 0, 255);   glVertex3f(x, y, z);
  320. glColor3ub(255, 0, 255); glVertex3f(x, y, z + radius);
  321. glColor3ub(0, 255, 255); glVertex3f(x, y + radius, z + radius); 
  322. glColor3ub(0, 255, 255); glVertex3f(x, y + radius, z);
  323. // These vertices create the Right Face
  324. glColor3ub(0, 0, 255);   glVertex3f(x + radius, y, z);
  325. glColor3ub(255, 0, 255); glVertex3f(x + radius, y, z + radius);
  326. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z + radius); 
  327. glColor3ub(0, 255, 255); glVertex3f(x + radius, y + radius, z);
  328. glEnd();
  329. glPopMatrix();
  330. }
  331. }