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

OpenGL

开发平台:

Windows_Unix

  1. #include "../../main.h"
  2. typedef struct _tagVECT
  3. {
  4.   float x;
  5.   float y;
  6.   float z;
  7. } VECT;
  8. typedef struct _tagTDPOINT
  9. {
  10.   float x;
  11.   float y;
  12.   float z;
  13. } TDPOINT,*LPTDPOINT;
  14. typedef struct _tagSTAR
  15. {
  16.   TDPOINT m_start;
  17.   VECT speed;
  18.   float m_curPos[3]; // a float[], so we can call glVertex3fv
  19.   float m_fColor[3];
  20.   float timeOffset;
  21. } STAR,*LPSTAR;
  22. #define EYE_Z 3.0f
  23. float m_fStarSpeed;
  24. float m_fTimeElapsed;
  25. int m_iNumStars;
  26. bool m_bStarted;
  27. bool m_bPointStars;
  28. bool m_bMultiSample;
  29. LPSTAR m_pStars;
  30. LARGE_INTEGER m_start;
  31. LARGE_INTEGER m_starStart;
  32. LARGE_INTEGER m_freq;
  33.   
  34. namespace Star 
  35. {
  36. // Returns a random number between min and max
  37. float GetRandom(float min,float max)
  38. {
  39.   float random = float(rand())/float(RAND_MAX);
  40.   return (min + ((max-min)*random));
  41. void InitStars()
  42. {
  43.   m_bStarted = false;
  44.   m_bMultiSample = false;
  45.   m_fStarSpeed = 10.0f;
  46.   m_iNumStars = 100;
  47.   m_bPointStars = false;
  48.   m_pStars = new STAR[100];
  49.   QueryPerformanceFrequency(&m_freq);
  50.   
  51.   srand(GetTickCount());
  52.   for (int i=0;i<m_iNumStars;++i)
  53.   {
  54. m_pStars[i].m_start.x = GetRandom(-5.0,5.0);
  55. m_pStars[i].m_start.y = GetRandom(-5.0,5.0);
  56. m_pStars[i].m_start.z = GetRandom(-10.0,1.0);
  57. m_pStars[i].speed.x = 0.0;
  58. m_pStars[i].speed.y = 0.0;
  59. m_pStars[i].speed.z = m_fStarSpeed;
  60. // 80% of the stars are white.  The rest are yellowish - redish
  61. #define PERCENTAGE_WHITE 0.8f
  62. m_pStars[i].m_fColor[0] = 1.0;
  63. if (GetRandom(0.0,1.0) > PERCENTAGE_WHITE)
  64. {
  65.   // make it a colorful star
  66.   m_pStars[i].m_fColor[1] = GetRandom(0.5,1.0);
  67.   m_pStars[i].m_fColor[2] = 0.0;
  68. }
  69. else
  70. {
  71.   // make it white
  72.   m_pStars[i].m_fColor[1] = 1.0;
  73.   m_pStars[i].m_fColor[2] = 1.0;
  74. }
  75. m_pStars[i].timeOffset = 0.0f;
  76.   }
  77. }
  78. /* Idle function.  Moves the text/stars using the current time */
  79. void Render()
  80. {
  81.   LARGE_INTEGER now;
  82.   // get current time
  83.   QueryPerformanceCounter(&now);
  84.   m_fTimeElapsed = ((float)(now.QuadPart - m_start.QuadPart)/(float)m_freq.QuadPart);
  85.   // move the stars, calculate new time based on star m_start time
  86.   m_fTimeElapsed = ((float)(now.QuadPart - m_starStart.QuadPart)/(float)m_freq.QuadPart);
  87.   for (int i=0;i<m_iNumStars;++i)
  88.   {
  89. // update their z position
  90. m_pStars[i].m_curPos[2] = m_pStars[i].m_start.z + m_pStars[i].speed.z * (m_fTimeElapsed - m_pStars[i].timeOffset);
  91. // ok they're out of view, respawn a new star
  92. if (m_pStars[i].m_curPos[2] >= EYE_Z)
  93. {
  94.   m_pStars[i].m_start.x = GetRandom(-5.0,5.0);
  95.   m_pStars[i].m_start.y = GetRandom(-5.0,5.0);
  96.   m_pStars[i].m_start.z = -10.0f;
  97.   m_pStars[i].timeOffset = m_fTimeElapsed;
  98. }
  99. else
  100. {
  101.   m_pStars[i].m_curPos[0] = m_pStars[i].m_start.x;
  102.   m_pStars[i].m_curPos[1] = m_pStars[i].m_start.y;
  103. }
  104.   }
  105. }
  106. /* Method to actually draw on the control */
  107. void vDraw()
  108. {
  109. Render();
  110.   
  111. glDisable(GL_BLEND);
  112. // now draw stars - as points
  113. glBegin(GL_POINTS);
  114. for (int i=0;i<m_iNumStars;++i)
  115. {
  116.   glColor3fv(m_pStars[i].m_fColor);
  117.   glVertex3fv(m_pStars[i].m_curPos);
  118. }
  119. glEnd();
  120. }
  121. }