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

OpenGL

开发平台:

Windows_Unix

  1. //
  2. // a64ki
  3. // Copyright (c) 2002 Henrik Carlgren
  4. // http://ziruz.cjb.net
  5. // ziruz@hotpop.com
  6. //
  7. //
  8. // INCLUDE FILES
  9. //
  10. #include "funky.h"
  11. #include "misc.h"
  12. #include "vector.h"
  13. #include "texture.h"
  14. #include "cube.h"
  15. #include <windows.h>
  16. #include <glgl.h>
  17. #include <math.h>
  18. //
  19. // GLOBAL VARIABLES
  20. //
  21. const int numCircleCoords = 192;
  22. VECTOR circleCoords[numCircleCoords];
  23. const float PI = 3.1415926535f;
  24. extern GLuint texture[TEXTURE_COUNT];
  25. //
  26. // FUNCTION: funkyStartup
  27. //
  28. void funkyStartup(void)
  29. {
  30. int i;
  31. float c,t;
  32. c = (2.0f*PI)/float(numCircleCoords-1.0f);
  33. for(i = 0; i < numCircleCoords; i++)
  34. {
  35. t = c*float(i);
  36. circleCoords[i].x = cosf(t);
  37. circleCoords[i].y = sinf(t);
  38. circleCoords[i].z = 0.0f;
  39. }
  40. }
  41. void funkyCleanup(void)
  42. {
  43. }
  44. void funkyCycle(long double time, long double delta)
  45. {
  46. VECTOR cCC[2][numCircleCoords];
  47. VECTOR faceNormal;
  48. int i,j,k,s;
  49. //
  50. // PRE
  51. //
  52. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  53. for(i = 0; i < numCircleCoords; i++)
  54. {
  55. cCC[0][i].x = circleCoords[i].x;
  56. cCC[0][i].y = circleCoords[i].y;
  57. cCC[0][i].z = circleCoords[i].z;
  58. cCC[1][i].x = circleCoords[i].x;
  59. cCC[1][i].y = circleCoords[i].y;
  60. cCC[1][i].z = circleCoords[i].z;
  61. }
  62. //
  63. // BACKGROUND
  64. //
  65. ortho();
  66. glDisable(GL_DEPTH_TEST);
  67. glEnable(GL_TEXTURE_2D);
  68. glBindTexture(GL_TEXTURE_2D, texture[TEXTURE_ENV1]);
  69. //glColor4f(0.0f, 0.7f, 0.9f, 1.0f);
  70. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  71. glBegin(GL_QUADS);
  72. glTexCoord2i(0, 0);
  73. glVertex2i(0, 0);
  74. glTexCoord2i(1, 0);
  75. glVertex2i(800, 0);
  76. glTexCoord2i(1, 1);
  77. glVertex2i(800, 600);
  78. glTexCoord2i(0, 1);
  79. glVertex2i(0, 600);
  80. glEnd();
  81. //
  82. // CUBES
  83. //
  84. perspective();
  85. glTranslatef(0.0f, 0.0f, -8.0f);
  86. glRotatef(float(0.01f * time), 1.0f, 0.0f, 0.0f);
  87. glRotatef(float(0.02f * time), 0.0f, 1.0f, 0.0f);
  88. glRotatef(float(0.04f * time), 0.0f, 0.0f, 1.0f);
  89. glColor4f(1.0f, 1.0f, 1.0f, 0.05f);
  90. glDisable(GL_TEXTURE_2D);
  91. glDisable(GL_DEPTH_TEST);
  92. glEnable(GL_BLEND);
  93. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  94. for(i = 1; i <= 12; i++)
  95. {
  96. for(j = 1; j <= 12; j++)
  97. {
  98. for(k = 1; k <= 12; k++)
  99. {
  100. glPushMatrix();
  101. glTranslatef(float(i-6), float(j-6), float(k-6));
  102. renderCube(0.3f);
  103. glPopMatrix();
  104. }
  105. }
  106. }
  107. glDisable(GL_BLEND);
  108. glEnable(GL_DEPTH_TEST);
  109. glEnable(GL_TEXTURE_2D);
  110. //
  111. // TUBE
  112. //
  113. perspective();
  114. glTranslatef(4.0f, -5.5f, -4.0f);
  115. glRotatef(75.0f, 0.0f, 1.0f, 0.0f);
  116. glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
  117. glDisable(GL_BLEND);
  118. glEnable(GL_DEPTH_TEST);
  119. glDisable(GL_BLEND);
  120. glEnable(GL_TEXTURE_2D);
  121. glBindTexture(GL_TEXTURE_2D, texture[TEXTURE_CWL0]);
  122. glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  123. glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
  124. glTexGeni(GL_S, GL_SPHERE_MAP, 0);
  125. glTexGeni(GL_T, GL_SPHERE_MAP, 0);
  126. glEnable(GL_TEXTURE_GEN_S);
  127. glEnable(GL_TEXTURE_GEN_T);
  128. //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  129. //glColor4f(9.0f, 0.7f, 0.0f, 0.25f);
  130. glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
  131. glBegin(GL_TRIANGLES);
  132. for(s = 0; s < 44; s++)
  133. {
  134. for(i = 0; i < numCircleCoords; i++)
  135. {
  136. cCC[1][i].x = cCC[0][i].x;
  137. cCC[1][i].y = cCC[0][i].y;
  138. cCC[1][i].z = cCC[0][i].z;
  139. cCC[0][i].x = circleCoords[i].x * (1.0f-(sinf(float(time+s*100)*0.001f)*0.5f));
  140. cCC[0][i].y = circleCoords[i].y * (2.0f-(sinf(float(time+s*100)*0.001f)*0.5f));
  141. cCC[0][i].z = circleCoords[i].z - s*0.25f;
  142. }
  143. for(i = 1; i < numCircleCoords; i++)
  144. {
  145. float c = 1.0f / float(numCircleCoords);
  146. //
  147. // Triangle 1
  148. //
  149. calcNormal(cCC[0][i - 1], cCC[1][i], cCC[1][i - 1], faceNormal);
  150. glNormal3f(faceNormal.x, faceNormal.y, faceNormal.z);
  151. glVertex3f(cCC[0][i - 1].x, cCC[0][i - 1].y, cCC[0][i - 1].z);
  152. glVertex3f(cCC[1][i].x, cCC[1][i].y, cCC[1][i].z);
  153. glVertex3f(cCC[1][i - 1].x, cCC[1][i - 1].y, cCC[1][i - 1].z);
  154. //
  155. // Triangle 2
  156. //
  157. calcNormal(cCC[0][i - 1], cCC[0][i], cCC[1][i], faceNormal);
  158. glNormal3f(faceNormal.x, faceNormal.y, faceNormal.z);
  159. glVertex3f(cCC[0][i - 1].x, cCC[0][i - 1].y, cCC[0][i - 1].z);
  160. glVertex3f(cCC[0][i].x, cCC[0][i].y, cCC[0][i].z);
  161. glVertex3f(cCC[1][i].x, cCC[1][i].y, cCC[1][i].z);
  162. }
  163. }
  164. glEnd();
  165. glDisable(GL_TEXTURE_GEN_S);
  166. glDisable(GL_TEXTURE_GEN_T);
  167. glDisable(GL_TEXTURE_2D);
  168. //
  169. // SOFT INTRO
  170. //
  171. if(time < 2500.0f)
  172. {
  173. fadeOut(2500.0f, 2500.0f - time);
  174. }
  175. //
  176. // FADEOUT
  177. //
  178. if(time > 22500.0)
  179. {
  180. fadeOut(2500.0, time-22500.0);
  181. }
  182. //
  183. // END
  184. //
  185. SwapBuffers(wglGetCurrentDC());
  186. }