fork download
  1. // Based on SphereWorld4.cpp
  2.  
  3. #include <GLTools.h>
  4. #include <GLShaderManager.h>
  5. #include <GLFrustum.h>
  6. #include <GLBatch.h>
  7. #include <GLFrame.h>
  8. #include <GLMatrixStack.h>
  9. #include <GLGeometryTransform.h>
  10. #include <StopWatch.h>
  11.  
  12. #include <math.h>
  13. #include <math3d.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <iostream>
  18. #include <fstream>
  19. #include <sstream>
  20.  
  21. #include <iostream>
  22. #include "md2model.h"
  23.  
  24. using namespace std;
  25.  
  26. //#ifdef __APPLE__ // Don't need on Windows
  27. //#include <glut/glut.h>
  28. //#else
  29. #define FREEGLUT_STATIC
  30. #include <GL/glut.h>
  31. //#endif
  32.  
  33.  
  34. // ** GLOBALS **
  35.  
  36. GLShaderManager shaderManager; // Shader Manager
  37. GLMatrixStack modelViewMatrix; // Modelview Matrix
  38. GLMatrixStack projectionMatrix; // Projection Matrix
  39. GLFrustum viewFrustum; // View Frustum
  40. GLGeometryTransform transformPipeline; // Geometry Transform Pipeline
  41.  
  42. GLBatch floorBatch;
  43. GLBatch backWallBatch;
  44. GLBatch frontWallBatch;
  45. GLBatch leftWallBatch;
  46. GLBatch rightWallBatch;
  47. GLFrame cameraFrame;
  48. GLFrame modelFrame;
  49. md2model model1;
  50. GLuint currentAnim = MD2_STAND;
  51.  
  52. // Skybox objects
  53. GLuint textures[10];
  54. GLBatch boxPosX;
  55. GLBatch boxNegX;
  56. GLBatch boxPosY;
  57. GLBatch boxNegY;
  58. GLBatch boxPosZ;
  59. GLBatch boxNegZ;
  60.  
  61.  
  62. // ** FUNCTIONS **
  63.  
  64. //////////////////////////////////////////////////////////////////
  65. // TEXTURE LOADER
  66. GLuint loadTexture(char *fname, GLuint *texID)
  67. {
  68. // generate texture ID
  69. glGenTextures(1, texID);
  70. // texture dimensions and data buffer
  71. GLint width, height, components;
  72. GLenum format;
  73. GLbyte *pBytes;
  74.  
  75. // load file - using GLTools library
  76. pBytes = gltReadTGABits(fname, &width, &height, &components, &format);
  77. if (pBytes == NULL)
  78. {
  79. cerr << "Something went wrong loading texture " << fname << endl;
  80. }
  81.  
  82. // bind texture and set parameters
  83. glBindTexture(GL_TEXTURE_2D, *texID);
  84. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  85. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  86. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // GL_REPEAT
  87. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  88. glTexImage2D(GL_TEXTURE_2D,0,components,width, height, 0,
  89. format, GL_UNSIGNED_BYTE, pBytes);
  90. //glGenerateMipmap(GL_TEXTURE_2D);
  91.  
  92. // texture loaded, free the temporary buffer
  93. free(pBytes);
  94.  
  95. return *texID; // return value of texure ID - redundant
  96.  
  97. }
  98.  
  99. //////////////////////////////////////////////////////////////////
  100. // This function does any needed initialization on the rendering
  101. // context.
  102. void SetupRC()
  103. {
  104. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  105.  
  106. // Initialze Shader Manager
  107. shaderManager.InitializeStockShaders();
  108. glShadeModel (GL_SMOOTH);
  109. glEnable(GL_DEPTH_TEST);
  110. glEnable (GL_TEXTURE_2D);
  111.  
  112. //////////////////////////////////////////////////////////////////
  113. // LOAD TEXTURES
  114. textures[0] = loadTexture("pos_x.tga", &textures[0]);
  115. textures[1] = loadTexture("neg_x.tga", &textures[1]);
  116. textures[2] = loadTexture("pos_y.tga", &textures[2]);
  117. textures[3] = loadTexture("neg_y.tga", &textures[3]);
  118. textures[4] = loadTexture("pos_z.tga", &textures[4]);
  119. textures[5] = loadTexture("neg_z.tga", &textures[5]);
  120. textures[6] = loadTexture("grass.tga", &textures[6]);
  121. textures[7] = loadTexture("brick.tga", &textures[7]);
  122. textures[8] = loadTexture("skeleton.tga", &textures[8]);
  123. if (!model1.ReadMD2Model ("skeleton.md2"))
  124. exit (EXIT_FAILURE);
  125. // END
  126. //////////////////////////////////////////////////////////////////
  127.  
  128. //////////////////////////////////////////////////////////////////
  129. // SKYBOX
  130. boxPosX.Begin(GL_TRIANGLE_FAN,4,1);
  131. boxPosX.MultiTexCoord2f(0,0.0f,0.0f);
  132. boxPosX.Vertex3f(10.0f,-10.0f,-10.0f);
  133. boxPosX.MultiTexCoord2f(0,1.0f,0.0f);
  134. boxPosX.Vertex3f(10.0f,-10.0f,10.0f);
  135. boxPosX.MultiTexCoord2f(0,1.0f,1.0f);
  136. boxPosX.Vertex3f(10.0f,10.0f,10.0f);
  137. boxPosX.MultiTexCoord2f(0,0.0f,1.0f);
  138. boxPosX.Vertex3f(10.0f,10.0f,-10.0f);
  139. boxPosX.End();
  140.  
  141. boxNegX.Begin(GL_TRIANGLE_FAN,4,1);
  142. boxNegX.MultiTexCoord2f(0,0.0f,0.0f);
  143. boxNegX.Vertex3f(-10.0f,-10.0f,10.0f);
  144. boxNegX.MultiTexCoord2f(0,1.0f,0.0f);
  145. boxNegX.Vertex3f(-10.0f,-10.0f,-10.0f);
  146. boxNegX.MultiTexCoord2f(0,1.0f,1.0f);
  147. boxNegX.Vertex3f(-10.0f,10.0f,-10.0f);
  148. boxNegX.MultiTexCoord2f(0,0.0f,1.0f);
  149. boxNegX.Vertex3f(-10.0f,10.0f,10.0f);
  150. boxNegX.End();
  151.  
  152. boxPosY.Begin(GL_TRIANGLE_FAN,4,1);
  153. boxPosY.MultiTexCoord2f(0,0.0f,0.0f);
  154. boxPosY.Vertex3f(-10.0f,10.0f,-10.0f);
  155. boxPosY.MultiTexCoord2f(0,1.0f,0.0f);
  156. boxPosY.Vertex3f(10.0f,10.0f,-10.0f);
  157. boxPosY.MultiTexCoord2f(0,1.0f,1.0f);
  158. boxPosY.Vertex3f(10.0f,10.0f,10.0f);
  159. boxPosY.MultiTexCoord2f(0,0.0f,1.0f);
  160. boxPosY.Vertex3f(-10.0f,10.0f,10.0f);
  161. boxPosY.End();
  162.  
  163. boxNegY.Begin(GL_TRIANGLE_FAN,4,1);
  164. boxNegY.MultiTexCoord2f(0,0.0f,0.0f);
  165. boxNegY.Vertex3f(-10.0f,-10.0f,10.0f);
  166. boxNegY.MultiTexCoord2f(0,1.0f,0.0f);
  167. boxNegY.Vertex3f(10.0f,-10.0f,10.0f);
  168. boxNegY.MultiTexCoord2f(0,1.0f,1.0f);
  169. boxNegY.Vertex3f(10.0f,-10.0f,-10.0f);
  170. boxNegY.MultiTexCoord2f(0,0.0f,1.0f);
  171. boxNegY.Vertex3f(-10.0f,-10.0f,-10.0f);
  172. boxNegY.End();
  173.  
  174. boxPosZ.Begin(GL_TRIANGLE_FAN,4,1);
  175. boxPosZ.MultiTexCoord2f(0,0.0f,0.0f);
  176. boxPosZ.Vertex3f(10.0f,-10.0f,10.0f);
  177. boxPosZ.MultiTexCoord2f(0,1.0f,0.0f);
  178. boxPosZ.Vertex3f(-10.0f,-10.0f,10.0f);
  179. boxPosZ.MultiTexCoord2f(0,1.0f,1.0f);
  180. boxPosZ.Vertex3f(-10.0f,10.0f,10.0f);
  181. boxPosZ.MultiTexCoord2f(0,0.0f,1.0f);
  182. boxPosZ.Vertex3f(10.0f,10.0f,10.0f);
  183. boxPosZ.End();
  184.  
  185. boxNegZ.Begin(GL_TRIANGLE_FAN,4,1);
  186. boxNegZ.MultiTexCoord2f(0,0.0f,0.0f);
  187. boxNegZ.Vertex3f(-10.0f,-10.0f,-10.0f);
  188. boxNegZ.MultiTexCoord2f(0,1.0f,0.0f);
  189. boxNegZ.Vertex3f(10.0f,-10.0f,-10.0f);
  190. boxNegZ.MultiTexCoord2f(0,1.0f,1.0f);
  191. boxNegZ.Vertex3f(10.0f,10.0f,-10.0f);
  192. boxNegZ.MultiTexCoord2f(0,0.0f,1.0f);
  193. boxNegZ.Vertex3f(-10.0f,10.0f,-10.0f);
  194. boxNegZ.End();
  195. // END
  196. //////////////////////////////////////////////////////////////////
  197.  
  198. //////////////////////////////////////////////////////////////////
  199. // FLOOR
  200. GLfloat texSize = 10.0f;
  201. floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1);
  202. floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
  203. floorBatch.Vertex3f(-20.0f, -0.41f, 20.0f);
  204.  
  205. floorBatch.MultiTexCoord2f(0, texSize, 0.0f);
  206. floorBatch.Vertex3f(20.0f, -0.41f, 20.0f);
  207.  
  208. floorBatch.MultiTexCoord2f(0, texSize, texSize);
  209. floorBatch.Vertex3f(20.0f, -0.41f, -20.0f);
  210.  
  211. floorBatch.MultiTexCoord2f(0, 0.0f, texSize);
  212. floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f);
  213. floorBatch.End();
  214. // END
  215. //////////////////////////////////////////////////////////////////
  216.  
  217. //////////////////////////////////////////////////////////////////
  218. // WALLS
  219.  
  220. GLfloat wallTexSizeH = 0.5f; // Height of texture
  221. GLfloat wallTexSizeW = 20.0f; // Width of texture
  222.  
  223. // BACK
  224. backWallBatch.Begin(GL_TRIANGLE_FAN, 4, 1);
  225. backWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
  226. backWallBatch.Vertex3f(-20.0f, -0.41f, 20.0f);
  227.  
  228. backWallBatch.MultiTexCoord2f(0, wallTexSizeW, 0.0f);
  229. backWallBatch.Vertex3f(20.0f, -0.41f, 20.0f);
  230.  
  231. backWallBatch.MultiTexCoord2f(0, wallTexSizeW, wallTexSizeH);
  232. backWallBatch.Vertex3f(20.0f, 0.41f, 20.0f);
  233.  
  234. backWallBatch.MultiTexCoord2f(0, 0.0f, wallTexSizeH);
  235. backWallBatch.Vertex3f(-20.0f, 0.41f, 20.0f);
  236. backWallBatch.End();
  237.  
  238. // FRONT
  239. frontWallBatch.Begin(GL_TRIANGLE_FAN, 4, 1);
  240. frontWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
  241. frontWallBatch.Vertex3f(-20.0f, -0.41f, -20.0f);
  242.  
  243. frontWallBatch.MultiTexCoord2f(0, wallTexSizeW, 0.0f);
  244. frontWallBatch.Vertex3f(20.0f, -0.41f, -20.0f);
  245.  
  246. frontWallBatch.MultiTexCoord2f(0, wallTexSizeW, wallTexSizeH);
  247. frontWallBatch.Vertex3f(20.0f, 0.41f, -20.0f);
  248.  
  249. frontWallBatch.MultiTexCoord2f(0, 0.0f, wallTexSizeH);
  250. frontWallBatch.Vertex3f(-20.0f, 0.41f, -20.0f);
  251. frontWallBatch.End();
  252.  
  253. // LEFT
  254. leftWallBatch.Begin(GL_TRIANGLE_FAN, 4, 1);
  255. leftWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
  256. leftWallBatch.Vertex3f(-20.0f, -0.41f, 20.0f);
  257.  
  258. leftWallBatch.MultiTexCoord2f(0, wallTexSizeW, 0.0f);
  259. leftWallBatch.Vertex3f(-20.0f, -0.41f, -20.0f);
  260.  
  261. leftWallBatch.MultiTexCoord2f(0, wallTexSizeW, wallTexSizeH);
  262. leftWallBatch.Vertex3f(-20.0f, 0.41f, -20.0f);
  263.  
  264. leftWallBatch.MultiTexCoord2f(0, 0.0f, wallTexSizeH);
  265. leftWallBatch.Vertex3f(-20.0f, 0.41f, 20.0f);
  266. leftWallBatch.End();
  267.  
  268. // RIGHT
  269. rightWallBatch.Begin(GL_TRIANGLE_FAN, 4, 1);
  270. rightWallBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
  271. rightWallBatch.Vertex3f(20.0f, -0.41f, -20.0f);
  272.  
  273. rightWallBatch.MultiTexCoord2f(0, wallTexSizeW, 0.0f);
  274. rightWallBatch.Vertex3f(20.0f, -0.41f, 20.0f);
  275.  
  276. rightWallBatch.MultiTexCoord2f(0, wallTexSizeW, wallTexSizeH);
  277. rightWallBatch.Vertex3f(20.0f, 0.41f, 20.0f);
  278.  
  279. rightWallBatch.MultiTexCoord2f(0, 0.0f, wallTexSizeH);
  280. rightWallBatch.Vertex3f(20.0f, 0.41f, -20.0f);
  281. rightWallBatch.End();
  282. // END
  283. //////////////////////////////////////////////////////////////////
  284. }
  285.  
  286. //////////////////////////////////////////////////////////////////
  287. // Clean up model data after exiting
  288. void Cleanup()
  289. {
  290. model1.FreeModel();
  291. }
  292.  
  293.  
  294. //////////////////////////////////////////////////////////////////
  295. // Screen changes size or is initialized
  296. void ChangeSize(int nWidth, int nHeight)
  297. {
  298. glViewport(0, 0, nWidth, nHeight);
  299.  
  300. // Create the projection matrix, and load it on the projection matrix stack
  301. viewFrustum.SetPerspective(35.0f, float(nWidth)/float(nHeight), 1.0f, 100.0f);
  302. projectionMatrix.LoadMatrix(viewFrustum.GetProjectionMatrix());
  303.  
  304. // Set the transformation pipeline to use the two matrix stacks
  305. transformPipeline.SetMatrixStacks(modelViewMatrix, projectionMatrix);
  306. }
  307.  
  308. //////////////////////////////////////////////////////////////////
  309. // Called to draw scene
  310. void RenderScene(void)
  311. {
  312. //
  313. static float interp = 0.0;
  314. static double current_time = 0;
  315. static double last_time = 0;
  316. float dt;
  317. GLfloat vColour[] = { 1.0f, 1.0f, 1.0f, 1.0f};
  318. GLfloat vLightPos[] = {0.0f, 2.0f, -1.0f};
  319. //
  320.  
  321. // Color values
  322. static GLfloat vTexColour[] = { 1.0f, 1.0f, 1.0f, 1.0f}; // white colour for accurate walls
  323. static GLfloat vCylColour[] = { 0.2f, 1.0f, 1.0f, 1.0f}; // Cylinder colour
  324.  
  325. // Clear the color and depth buffers
  326. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  327.  
  328. //
  329. last_time = current_time;
  330. current_time = (double)glutGet (GLUT_ELAPSED_TIME) / 100.0;
  331.  
  332. /* Animate model from frames 0 to num_frames-1 */
  333. interp += (current_time - last_time);
  334. dt = (current_time - last_time);
  335. //
  336.  
  337. // Save the current modelview matrix (the identity matrix)
  338. modelViewMatrix.PushMatrix();
  339.  
  340. M3DMatrix44f mCamera;
  341. cameraFrame.GetCameraMatrix(mCamera);
  342. modelViewMatrix.PushMatrix(mCamera);
  343. //cameraFrame.MoveUp(0.0f);
  344.  
  345. // Transform the light position into eye coordinates
  346. //M3DVector4f vLightPos = { 0.0f, 10.0f, 5.0f, 1.0f };
  347. M3DVector4f vLightEyePos;
  348. m3dTransformVector4(vLightEyePos, vLightPos, mCamera);
  349.  
  350. //////////////////////////////////////////////////////////////////
  351. // SKYBOX
  352.  
  353. modelViewMatrix.PushMatrix();
  354.  
  355. // Set up the MVP matrix for drawing the skybox
  356. // Get the current camera facing, but ignore its position
  357. cameraFrame.GetCameraMatrix(mCamera,true);
  358. modelViewMatrix.LoadMatrix(mCamera);
  359.  
  360. // Now set shader - this step is where the MVP matrix
  361. // is set for any rendering
  362. shaderManager.UseStockShader(GLT_SHADER_SHADED,
  363. transformPipeline.GetModelViewProjectionMatrix());
  364.  
  365. // Disable Depth Testing then draw, so skybox renders in the distance
  366. glDisable(GL_DEPTH_TEST);
  367.  
  368. glBindTexture(GL_TEXTURE_2D,textures[0]);
  369. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
  370. boxPosX.Draw();
  371.  
  372. glBindTexture(GL_TEXTURE_2D,textures[1]);
  373. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
  374. boxNegX.Draw();
  375.  
  376. glBindTexture(GL_TEXTURE_2D,textures[2]);
  377. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
  378. boxPosY.Draw();
  379.  
  380. glBindTexture(GL_TEXTURE_2D,textures[3]);
  381. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
  382. boxNegY.Draw();
  383.  
  384. glBindTexture(GL_TEXTURE_2D,textures[4]);
  385. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
  386. boxPosZ.Draw();
  387.  
  388. glBindTexture(GL_TEXTURE_2D,textures[5]);
  389. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
  390. boxNegZ.Draw();
  391.  
  392. // Re-enable Depth Testing, so other objects load correctly in environment
  393. glEnable(GL_DEPTH_TEST);
  394.  
  395. modelViewMatrix.PopMatrix();
  396.  
  397. // END
  398. //////////////////////////////////////////////////////////////////
  399.  
  400. //////////////////////////////////////////////////////////////////
  401. // FLOOR
  402.  
  403. modelViewMatrix.PushMatrix();
  404.  
  405. glBindTexture(GL_TEXTURE_2D, textures[6]);
  406. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  407. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);
  408. floorBatch.Draw();
  409.  
  410. modelViewMatrix.PopMatrix();
  411.  
  412. //END
  413. //////////////////////////////////////////////////////////////////
  414.  
  415. //////////////////////////////////////////////////////////////////
  416. // WALLS
  417.  
  418. // BACK
  419.  
  420. modelViewMatrix.PushMatrix();
  421.  
  422. glBindTexture(GL_TEXTURE_2D, textures[7]);
  423. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  424. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE, transformPipeline.GetModelViewProjectionMatrix(), vTexColour, 0);
  425. backWallBatch.Draw();
  426.  
  427. modelViewMatrix.PopMatrix();
  428.  
  429. // FRONT
  430.  
  431. modelViewMatrix.PushMatrix();
  432.  
  433. glBindTexture(GL_TEXTURE_2D, textures[7]);
  434. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  435. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE, transformPipeline.GetModelViewProjectionMatrix(), vTexColour, 0);
  436. frontWallBatch.Draw();
  437.  
  438. modelViewMatrix.PopMatrix();
  439.  
  440. // LEFT
  441.  
  442. modelViewMatrix.PushMatrix();
  443.  
  444. glBindTexture(GL_TEXTURE_2D, textures[7]);
  445. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  446. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE, transformPipeline.GetModelViewProjectionMatrix(), vTexColour, 0);
  447. leftWallBatch.Draw();
  448.  
  449. modelViewMatrix.PopMatrix();
  450.  
  451. // RIGHT
  452.  
  453. modelViewMatrix.PushMatrix();
  454.  
  455. glBindTexture(GL_TEXTURE_2D, textures[7]);
  456. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  457. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE, transformPipeline.GetModelViewProjectionMatrix(), vTexColour, 0);
  458. rightWallBatch.Draw();
  459.  
  460. modelViewMatrix.PopMatrix();
  461.  
  462. //END
  463. //////////////////////////////////////////////////////////////////
  464.  
  465. //////////////////////////////////////////////////////////////////
  466. // MODEL
  467. modelViewMatrix.PushMatrix();
  468. modelViewMatrix.MultMatrix(modelFrame);
  469. modelFrame.SetOrigin(0.0f, 0.0f, -1.0f);
  470. modelViewMatrix.Rotate(-90,1.0f,0.0f,0.0f); // turn upright
  471. modelViewMatrix.Rotate(-90,0.0f,0.0f,1.0f); // turn to face
  472. modelViewMatrix.Scale(0.005f,0.005f,0.005f);
  473. shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
  474. modelViewMatrix.GetMatrix(), projectionMatrix.GetMatrix(),
  475. vLightPos, vColour, 0);
  476. glBindTexture(GL_TEXTURE_2D,textures[8]);
  477. model1.Animate (currentAnim, dt);
  478. model1.RenderFrameItp();
  479. modelViewMatrix.PopMatrix();
  480. // END
  481. //////////////////////////////////////////////////////////////////
  482.  
  483. // Restore the previous modleview matrix (the identity matrix)
  484. modelViewMatrix.PopMatrix();
  485. modelViewMatrix.PopMatrix();
  486.  
  487. //cameraFrame.SetOrigin(0.0f, 0.0f, 1.0f);
  488.  
  489. if (interp >= 1.0f)
  490. interp = 0.0f;
  491.  
  492. // Do the buffer Swap
  493. glutSwapBuffers();
  494.  
  495. // Tell GLUT to do it again
  496. glutPostRedisplay();
  497. }
  498.  
  499. void Keyboard(unsigned char key, int x, int y)
  500. {
  501. /* Escape */
  502. //if (key == 27)
  503. //exit (0);
  504. //if (currentAnim >19)
  505. //currentAnim = 0;
  506.  
  507. float linear = 0.1f;
  508. float angular = float(m3dDegToRad(5.0f));
  509.  
  510. float CAMx, CAMy, CAMz;
  511. CAMx = cameraFrame.GetOriginX();
  512. CAMy = cameraFrame.GetOriginY();
  513. CAMz = cameraFrame.GetOriginZ();
  514.  
  515. switch(key)
  516. {
  517. case('w'):
  518. {
  519. cameraFrame.MoveForward(linear);
  520. modelFrame.MoveForward(linear);
  521. currentAnim = MD2_RUN;
  522. break;
  523. }
  524. case('s'):
  525. {
  526. cameraFrame.MoveForward(-linear);
  527. modelFrame.MoveForward(-linear);
  528. currentAnim = MD2_RUN;
  529. break;
  530. }
  531.  
  532. case('a'):
  533. {
  534. cameraFrame.RotateWorld(angular, 0.0f, 1.0f, 0.0f);
  535. modelFrame.RotateLocalY(angular);
  536. break;
  537. }
  538.  
  539. case('d'):
  540. {
  541. cameraFrame.RotateWorld(-angular, 0.0f, 1.0f, 0.0f);
  542. modelFrame.RotateLocalY(-angular);
  543. break;
  544. }
  545. default:
  546. currentAnim = MD2_STAND;
  547. }
  548. }
  549.  
  550. void KeyboardUp (unsigned char key, int x, int y)
  551. {
  552. currentAnim = MD2_STAND;
  553. }
  554.  
  555. int main(int argc, char* argv[])
  556. {
  557. //gltSetWorkingDirectory(argv[0]); // Don't need on Windows.
  558.  
  559. glutInit(&argc, argv);
  560. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  561. glutInitWindowSize(1280,720);
  562.  
  563. glutCreateWindow("Equilibrium Alpha");
  564.  
  565. glutKeyboardFunc(Keyboard);
  566. glutKeyboardUpFunc(KeyboardUp);
  567. glutReshapeFunc(ChangeSize);
  568. glutDisplayFunc(RenderScene);
  569.  
  570. GLenum err = glewInit();
  571. if (GLEW_OK != err)
  572. {
  573. fprintf(stderr, "GLEW Error: %s\n", glewGetErrorString(err));
  574. return 1;
  575. }
  576.  
  577. atexit(Cleanup);
  578. SetupRC();
  579. glutMainLoop();
  580. return 0;
  581. }
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty