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

OpenGL

开发平台:

Windows_Unix

  1. //
  2. // a64ki
  3. // Copyright (c) 2002 Henrik Carlgren
  4. // http://ziruz.cjb.net
  5. // ziruz@hotpop.com
  6. //
  7. #include <windows.h>
  8. #include <glgl.h>
  9. #include "tunnel.h"
  10. #include "misc.h"
  11. #include "vector.h"
  12. #include "texture.h"
  13. #include "cube.h"
  14. typedef VECTOR circle32[32];
  15. circle32 g_tunnel[512];
  16. extern GLuint texture[TEXTURE_COUNT];
  17. void tunnelInit(void)
  18. {
  19. int i, j;
  20. for(i = 0; i < 512; i++)
  21. {
  22. for(j = 0; j < 32; j++)
  23. {
  24. g_tunnel[i][j].x = 0.5f * sinf(i * 0.1f) + 2.0f * cosf(((2.0f * 3.1415f) /32.0f) * j);
  25. g_tunnel[i][j].y = 0.5f * cosf(i * 0.3f) + 2.0f * sinf(((2.0f * 3.1415f) /32.0f) * j);
  26. g_tunnel[i][j].z = float(-i)*0.25f;
  27. }
  28. }
  29. }
  30. void tunnelCycle(int a_time, int a_delta)
  31. {
  32. int i, j, k;
  33. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  34. glEnable(GL_TEXTURE_2D);
  35. glBindTexture(GL_TEXTURE_2D, texture[TEXTURE_BG0]);
  36. ortho();
  37. glColor4f(0.25f, 0.25f, 0.25f, 1.0f);
  38. glBegin(GL_QUADS);
  39. glTexCoord2f(0, 0);
  40. glVertex2i(0, 0);
  41. glTexCoord2f(0, 24 + 8*sinf(a_time*0.001f));
  42. glVertex2i(0, 600);
  43. glTexCoord2f(12 + 4*sinf(a_time*0.001f), 24 + 8*sinf(a_time*0.001f));
  44. glVertex2i(800, 600);
  45. glTexCoord2f(12 + 4*sinf(a_time*0.001f), 0);
  46. glVertex2i(800, 0);
  47. glEnd();
  48. glDisable(GL_TEXTURE_2D);
  49. //
  50. // TUNNEL
  51. //
  52. perspective();
  53. glTranslatef( 0.4f * cosf(a_time*0.002f),
  54. 0.6f * sinf(a_time*0.001f),
  55. 64.0f + 16.0f * sinf(a_time*0.0001f));
  56. glRotatef(float(a_time)*0.1f, 0.0f, 0.0f, 1.0f);
  57. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  58. glDisable(GL_DEPTH_TEST);
  59. glEnable(GL_BLEND);
  60. glEnable(GL_LINE_SMOOTH);
  61. glBegin(GL_LINE_STRIP);
  62. for(i = 0; i < 512; i++)
  63. {
  64. for(j = 0; j < 32; j++)
  65. {
  66. glColor4f(1.0f+sinf(i*0.1f), 0.01f*(i%100+j%10), 1.0f, 0.75f);
  67. glVertex3f( g_tunnel[i][j].x,
  68. g_tunnel[i][j].y,
  69. g_tunnel[i][j].z);
  70. }
  71. }
  72. glEnd();
  73. glDisable(GL_LINE_SMOOTH);
  74. glDisable(GL_BLEND);
  75. glEnable(GL_DEPTH_TEST);
  76. //
  77. // DANCING CUBES =)
  78. //
  79. perspective();
  80. glTranslatef(5.0f, 3.0f, -8.0f);
  81. glRotatef(float(0.01f * a_time), 1.0f, 0.0f, 0.0f);
  82. glRotatef(float(0.02f * a_time), 0.0f, 1.0f, 0.0f);
  83. glRotatef(float(0.04f * a_time), 0.0f, 0.0f, 1.0f);
  84. glColor4f(1.0f, 1.0f, 1.0f, 0.05f);
  85. glDisable(GL_TEXTURE_2D);
  86. glDisable(GL_DEPTH_TEST);
  87. glEnable(GL_BLEND);
  88. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  89. for(i = 1; i <= 12; i++)
  90. {
  91. for(j = 1; j <= 12; j++)
  92. {
  93. for(k = 1; k <= 12; k++)
  94. {
  95. glPushMatrix();
  96. glTranslatef(float(i-6)*0.3f, float(j-6)*0.3f, float(k-6)*0.3f);
  97. renderCube(0.1f);
  98. glPopMatrix();
  99. }
  100. }
  101. }
  102. perspective();
  103. glTranslatef(2.5f*sinf(a_time*0.001f),-4.0f, -6.0f);
  104. glColor4f(0.0f, 0.0f, 1.0f, 0.15f);
  105. for(i = 1; i <= 32; i++)
  106. {
  107. glPushMatrix();
  108. glTranslatef(float(i-16)*0.75f, 0.0f, 0.0f);
  109. glRotatef(a_time * 0.02f, 1.0f, 0.0f, 0.0f);
  110. glRotatef(a_time * 0.04f, 0.0f, 1.0f, 0.0f);
  111. glRotatef(a_time * 0.08f, 0.0f, 0.0f, 1.0f);
  112. renderCube(0.5f);
  113. glPopMatrix();
  114. }
  115. glDisable(GL_BLEND);
  116. glEnable(GL_DEPTH_TEST);
  117. glEnable(GL_TEXTURE_2D);
  118. //
  119. // SOFT INTRO
  120. //
  121. if(a_time < 2500.0f)
  122. {
  123. fadeOut(2500.0f, 2500.0f - a_time);
  124. }
  125. //
  126. // FADEOUT
  127. //
  128. if(a_time > 22500.0)
  129. {
  130. fadeOut(2500.0, a_time-22500.0);
  131. }
  132. SwapBuffers(wglGetCurrentDC());
  133. }