BackUp_03.txt
上传用户:mywjrx
上传日期:2008-01-23
资源大小:703k
文件大小:94k
源码类别:

射击游戏

开发平台:

Visual C++

  1. //Game AI, all walls+ All Detect Collision on Walls + Separate Function + 6 Monsters + 99.1%
  2. #include <windows.h> // Header File For Windows
  3. #include <math.h> // Math Library Header File
  4. #include <stdio.h> // Header File For Standard Input/Output
  5. #include <glgl.h> // Header File For The OpenGL32 Library
  6. #include <glglu.h> // Header File For The GLu32 Library
  7. #include <glglaux.h> // Header File For The Glaux Library
  8. #include <stdlib.h>
  9. #include <mmsystem.h>
  10. #include "main.h"
  11. #include "Md2.h"
  12. #pragma comment( lib, "opengl32.lib") // Search For OpenGL32.lib While Linking
  13. #pragma comment( lib, "glu32.lib")
  14. #pragma comment( lib, "glaux.lib")
  15. #pragma comment( lib, "winmm.lib")
  16. HDC hDC=NULL; // Private GDI Device Context
  17. HGLRC hRC=NULL; // Permanent Rendering Context
  18. HWND hWnd=NULL; // Holds Our Window Handle
  19. HINSTANCE hInstance; // Holds The Instance Of The Application
  20. GLdouble WIDTH;
  21. GLdouble HEIGHT;
  22. bool  keys[256]; // Array Used For The Keyboard Routine
  23. bool  fp;
  24. bool  ip;
  25. bool active=TRUE; // Window Active Flag Set To TRUE By Default
  26. bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default
  27. bool gameOver;
  28. bool gameOverOnX;
  29. bool gameOverOnZ;
  30. GLdouble mouse_x, mouse_y;
  31. GLdouble mouse_3d_x, mouse_3d_y;
  32. int mouse_wrap_x = 0;
  33. int mouse_wrap_y = 0;
  34. bool invert_mouse = false;  // Used to invert the y-axis for the mouse
  35. GLdouble sensitivity = 64;  // the higher the #, the lower mouse the sensitivity.
  36. const CELL = 256;
  37. #define MAX_PARTICLES 45
  38. #define MAX_SHOTS_FIRED 45
  39. #define FILE_NAME  "tris.md2" // This is the 3D file we will load.
  40. #define TEXTURE_NAME "hobgoblin.bmp"
  41. CLoadMD2 g_LoadMd2; // This is MD2 class.  This should go in a good model class.
  42. t3DModel g_3DModel; // This holds the 3D Model info that we load in
  43. typedef struct
  44. bool  trigger;
  45. bool  hitStatus;
  46. int   hitCount;
  47. float transX;
  48. float transXSpeed;
  49. float transXSpare;
  50. float transY; 
  51. float transZ;
  52. float transZSpeed;
  53. float transZSpare;
  54. float rotateY;
  55. float rotateYSpeed;
  56. float fall;
  57. float rotateX;
  58. float rotateXSpeed;
  59. float XMultiplier ;  
  60. }
  61. Monsters;
  62. Monsters Monster[6];
  63. GLdouble yrot=0; // Y Rotation
  64. const GLdouble piover180 = 0.0174532925f;
  65. GLdouble XP=0;
  66. GLdouble ZP=0;
  67. GLdouble sceneroty;
  68. GLdouble heading;
  69. GLdouble _heading = 0;
  70. GLdouble zprot;
  71. int frames = 0;
  72. GLdouble FPS = 0;
  73. GLdouble fire_x = 0;
  74. GLdouble fire_y = 10;
  75. GLdouble fire_xp, fire_yp;
  76. GLdouble fire_z = 0;
  77. GLdouble fire_zp = 0;
  78. GLdouble fire_delay = 0;
  79. int shots_fired = 0;
  80. typedef struct // Create A Structure For Particle
  81. {
  82. GLdouble life; // Particle Life
  83. GLdouble fade; // Fade Speed
  84. GLdouble size; // Fade Speed
  85. GLdouble triangle_x1; // X vertex
  86. GLdouble triangle_x2; // X vertex
  87. GLdouble triangle_x3; // X vertex
  88. GLdouble triangle_y1; // Y vertex
  89. GLdouble triangle_y2; // Y vertex
  90. GLdouble triangle_y3; // Y vertex
  91. GLdouble triangle_z1; // Z vertex
  92. GLdouble triangle_z2; // Z vertex
  93. GLdouble triangle_z3; // Z vertex
  94. GLdouble triangle_rotate_x; // X Rotate
  95. GLdouble triangle_rotate_y; // X Rotate
  96. GLdouble triangle_rotate_z; // X Rotate
  97. GLdouble triangle_rotate_xi; // X Rotate
  98. GLdouble triangle_rotate_yi; // X Rotate
  99. GLdouble triangle_rotate_zi; // X Rotate
  100. GLdouble x; // X Position
  101. GLdouble y; // Y Position
  102. GLdouble z; // Z Position
  103. GLdouble xi; // X Direction
  104. GLdouble yi; // Y Direction
  105. GLdouble zi; // Z Direction
  106. }
  107. particles; // Particles Structure
  108. particles particle[MAX_PARTICLES][MAX_SHOTS_FIRED];
  109. float m16_kick = 0;
  110. float m16_kicki = 0; 
  111. bool isFire = false;
  112. bool isFireComplete = true;
  113. bool isRicochet = false;
  114. GLdouble BlankNum = 0;
  115. BOOL done=FALSE; // Bool Variable To Exit Loop
  116. bool isFPS=FALSE;
  117. GLuint texture[6];
  118. // Absolute value function(comes in handy later).
  119. inline GLdouble ABS(GLdouble A)
  120. {
  121.   if (A < 0)
  122.   A = -A; 
  123.   return A;
  124. }
  125. // Hypotenuse Function
  126. inline GLdouble Hypot(GLdouble a, GLdouble b)
  127. {
  128.   return sqrt((a*a)+(b*b));
  129. }
  130. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc
  131. GLvoid KillGLWindow(GLvoid);
  132. typedef struct // Create A Structure
  133. {
  134. GLubyte *imageData; // Image Data (Up To 32 Bits)
  135. GLuint bpp; // Image Color Depth In Bits Per Pixel.
  136. GLuint width; // Image Width
  137. GLuint height; // Image Height
  138. GLuint texID; // Texture ID Used To Select A Texture
  139. } TextureImage; // Structure Name
  140. GLuint base; // Base Display List For The Font
  141. TextureImage textures[1];
  142. bool LoadTGA(TextureImage *texture, char *filename) // Loads A TGA File Into Memory
  143. {    
  144. GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; // Uncompressed TGA Header
  145. GLubyte TGAcompare[12]; // Used To Compare TGA Header
  146. GLubyte header[6]; // First 6 Useful Bytes From The Header
  147. GLuint bytesPerPixel; // Holds Number Of Bytes Per Pixel Used In The TGA File
  148. GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
  149. GLuint temp; // Temporary Variable
  150. GLuint type=GL_RGBA; // Set The Default GL Mode To RBGA (32 BPP)
  151. FILE *file = fopen(filename, "rb"); // Open The TGA File
  152. if( file==NULL || // Does File Even Exist?
  153. fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) || // Are There 12 Bytes To Read?
  154. memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 || // Does The Header Match What We Want?
  155. fread(header,1,sizeof(header),file)!=sizeof(header)) // If So Read Next 6 Header Bytes
  156. {
  157. if (file == NULL) // Did The File Even Exist? *Added Jim Strong*
  158. return false; // Return False
  159. else
  160. {
  161. fclose(file); // If Anything Failed, Close The File
  162. return false; // Return False
  163. }
  164. }
  165. texture->width  = header[1] * 256 + header[0]; // Determine The TGA Width (highbyte*256+lowbyte)
  166. texture->height = header[3] * 256 + header[2]; // Determine The TGA Height (highbyte*256+lowbyte)
  167.     
  168.   if( texture->width <=0 || // Is The Width Less Than Or Equal To Zero
  169. texture->height <=0 || // Is The Height Less Than Or Equal To Zero
  170. (header[4]!=24 && header[4]!=32)) // Is The TGA 24 or 32 Bit?
  171. {
  172. fclose(file); // If Anything Failed, Close The File
  173. return false; // Return False
  174. }
  175. texture->bpp = header[4]; // Grab The TGA's Bits Per Pixel (24 or 32)
  176. bytesPerPixel = texture->bpp/8; // Divide By 8 To Get The Bytes Per Pixel
  177. imageSize = texture->width*texture->height*bytesPerPixel; // Calculate The Memory Required For The TGA Data
  178. texture->imageData=(GLubyte *)malloc(imageSize); // Reserve Memory To Hold The TGA Data
  179. if( texture->imageData==NULL || // Does The Storage Memory Exist?
  180. fread(texture->imageData, 1, imageSize, file)!=imageSize) // Does The Image Size Match The Memory Reserved?
  181. {
  182. if(texture->imageData!=NULL) // Was Image Data Loaded
  183. free(texture->imageData); // If So, Release The Image Data
  184. fclose(file); // Close The File
  185. return false; // Return False
  186. }
  187. for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) // Loop Through The Image Data
  188. { // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
  189. temp=texture->imageData[i]; // Temporarily Store The Value At Image Data 'i'
  190. texture->imageData[i] = texture->imageData[i + 2]; // Set The 1st Byte To The Value Of The 3rd Byte
  191. texture->imageData[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
  192. }
  193. fclose (file); // Close The File
  194. // Build A Texture From The Data
  195. glGenTextures(1, &texture[0].texID); // Generate OpenGL texture IDs
  196. glBindTexture(GL_TEXTURE_2D, texture[0].texID); // Bind Our Texture
  197. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Filtered
  198. glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Filtered
  199. if (texture[0].bpp==24) // Was The TGA 24 Bits
  200. {
  201. type=GL_RGB; // If So Set The 'type' To GL_RGB
  202. }
  203.     gluBuild2DMipmaps(GL_TEXTURE_2D, type, texture[0].width, texture[0].height, type, GL_UNSIGNED_BYTE, texture[0].imageData);           
  204. return true; // Texture Building Went Ok, Return True
  205. }
  206. GLvoid BuildFont(GLvoid) // Build Our Font Display List
  207. {
  208. base=glGenLists(256); // Creating 256 Display Lists
  209. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  210. for (int loop1=0; loop1<256; loop1++) // Loop Through All 256 Lists
  211. {
  212. float cx=float(loop1%16)/16.0f; // X Position Of Current Character
  213. float cy=float(loop1/16)/16.0f; // Y Position Of Current Character
  214. glNewList(base+loop1,GL_COMPILE); // Start Building A List
  215. glBegin(GL_QUADS); // Use A Quad For Each Character
  216. glTexCoord2f(cx,1.0f-cy-0.0625f); // Texture Coord (Bottom Left)
  217. glVertex2d(0,16); // Vertex Coord (Bottom Left)
  218. glTexCoord2f(cx+0.0625f,1.0f-cy-0.0625f); // Texture Coord (Bottom Right)
  219. glVertex2i(16,16); // Vertex Coord (Bottom Right)
  220. glTexCoord2f(cx+0.0625f,1.0f-cy-0.001f); // Texture Coord (Top Right)
  221. glVertex2i(16,0); // Vertex Coord (Top Right)
  222. glTexCoord2f(cx,1.0f-cy-0.001f); // Texture Coord (Top Left)
  223. glVertex2i(0,0); // Vertex Coord (Top Left)
  224. glEnd(); // Done Building Our Quad (Character)
  225. glTranslated(14,0,0); // Move To The Right Of The Character
  226. glEndList(); // Done Building The Display List
  227. } // Loop Until All 256 Are Built
  228. }
  229. GLvoid KillFont(GLvoid) // Delete The Font From Memory
  230. {
  231. glDeleteLists(base,256); // Delete All 256 Display Lists
  232. }
  233. GLvoid glPrint(GLint x, GLint y, int set, const char *fmt, ...) // Where The Printing Happens
  234. {
  235. char text[1024]; // Holds Our String
  236. va_list ap; // Pointer To List Of Arguments
  237. if (fmt == NULL) // If There's No Text
  238. return; // Do Nothing
  239. va_start(ap, fmt); // Parses The String For Variables
  240.     vsprintf(text, fmt, ap); // And Converts Symbols To Actual Numbers
  241. va_end(ap); // Results Are Stored In Text
  242. if (set>1) // Did User Choose An Invalid Character Set?
  243. {
  244. set=1; // If So, Select Set 1 (Italic)
  245. }
  246. glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
  247. glLoadIdentity(); // Reset The Modelview Matrix
  248. glTranslated(x,y,-500); // Position The Text (0,0 - Top Left)
  249. glRotatef(180,0,0,1);
  250. glRotatef(180,0,1,0);
  251. glListBase(base-32+(128*set)); // Choose The Font Set (0 or 1)
  252. glCallLists(strlen(text),GL_UNSIGNED_BYTE, text); // Write The Text To The Screen
  253. glDisable(GL_TEXTURE_2D); // Disable Texture Mapping
  254. }
  255. AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image
  256. {
  257. FILE *File=NULL; // File Handle
  258. if (!Filename) // Make Sure A Filename Was Given
  259. {
  260. return NULL; // If Not Return NULL
  261. }
  262. File=fopen(Filename,"r"); // Check To See If The File Exists
  263. if (File) // Does The File Exist?
  264. {
  265. fclose(File); // Close The Handle
  266. return auxDIBImageLoad(Filename); // Load The Bitmap And Return A Pointer
  267. }
  268. return NULL; // If Load Failed Return NULL
  269. }
  270. // Create A Structure For The Timer Information
  271. struct
  272. {
  273.   __int64       frequency;          // Timer Frequency
  274.   GLdouble            resolution;          // Timer Resolution
  275.   unsigned long mm_timer_start;     
  276.   
  277.   // Multimedia Timer Start Value
  278.   unsigned long mm_timer_elapsed;      // Multimedia Timer Elapsed Time
  279.   bool   performance_timer;    
  280.   
  281.   // Using The Performance Timer?
  282.   __int64       performance_timer_start;      // Performance Timer Start Value
  283.   __int64       performance_timer_elapsed; // Performance Timer Elapsed Time
  284. } timer;
  285. // Initialize Our Timer
  286. void TimerInit(void)
  287. {
  288.      memset(&timer, 0, sizeof(timer));   
  289.  // Clear Our Timer Structure
  290.      // Check To See If A Performance Counter Is Available
  291.      // If One Is Available The Timer Frequency Will Be Updated
  292.      if (!QueryPerformanceFrequency((LARGE_INTEGER *) &timer.frequency))
  293.      {
  294.           // No Performace Counter Available
  295.           timer.performance_timer = FALSE;                      // Set Performance Timer To FALSE
  296.           timer.mm_timer_start = timeGetTime();                 // Use timeGetTime()
  297.           timer.resolution  = 1.0f/1000.0f;                           // Set Our Timer Resolution To .001f
  298.           timer.frequency   = 1000;                                     // Set Our Timer Frequency To 1000
  299.           timer.mm_timer_elapsed = timer.mm_timer_start; // Set The Elapsed Time
  300.      }
  301.      else
  302.      {
  303.           // Performance Counter Is Available, Use It Instead Of The Multimedia Timer
  304.           // Get The Current Time And Store It In performance_timer_start
  305.           QueryPerformanceCounter((LARGE_INTEGER *) &timer.performance_timer_start);
  306.           timer.performance_timer   = TRUE;    // Set Performance Timer To TRUE
  307.           // Calculate The Timer Resolution Using The Timer Frequency
  308.           timer.resolution    = (GLdouble) (((double)1.0f)/((double)timer.frequency));
  309.           // Set The Elapsed Time To The Current Time
  310.           timer.performance_timer_elapsed = timer.performance_timer_start;
  311.      }
  312. }
  313. // Get Time In Milliseconds
  314. inline GLdouble TimerGetTime()
  315. {
  316.   __int64 time;                                  // 'time' Will Hold A 64 Bit Integer
  317.   if (timer.performance_timer)           // Are We Using The Performance Timer?
  318.   {
  319.     QueryPerformanceCounter((LARGE_INTEGER *) &time); // Current Performance Time
  320.     // Return The Time Elapsed since TimerInit was called
  321.     return ( (GLdouble) ( time - timer.performance_timer_start) * timer.resolution)*1000.0f;
  322.   }
  323.   else
  324.   {
  325.     // Return The Time Elapsed since TimerInit was called
  326.     return ( (GLdouble) ( timeGetTime() - timer.mm_timer_start) * timer.resolution)*1000.0f;
  327.   }
  328. }
  329. int LoadGLTextures() // Load Bitmap And Convert To A Texture
  330. {
  331.   int Status=FALSE; // Status Indicator
  332.   AUX_RGBImageRec *TextureImage[1]; // Create Storage Space For The Textures
  333.   memset(TextureImage,0,sizeof(void *)*1); // Set The Pointer To NULL
  334.   if (TextureImage[0]=LoadBMP("Data/walls.bmp")) // Load Particle Texture
  335.   {
  336.     Status=TRUE; // Set The Status To TRUE
  337.     glGenTextures(1, &texture[1]); // Create One Texture
  338.     // Create MipMapped Texture
  339.     glBindTexture(GL_TEXTURE_2D, texture[1]);
  340.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  341.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  342.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  343.   }
  344.   if (TextureImage[0]=LoadBMP("Data/crosshair.bmp")) // Load Particle Texture
  345.   {
  346.     Status=TRUE; // Set The Status To TRUE
  347.     glGenTextures(1, &texture[2]); // Create One Texture
  348.     // Create MipMapped Texture
  349.     glBindTexture(GL_TEXTURE_2D, texture[2]);
  350.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  351.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  352.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  353.   }
  354.   if (TextureImage[0]=LoadBMP("Data/smoke.bmp")) // Load Particle Texture
  355.   {
  356.     Status=TRUE; // Set The Status To TRUE
  357.     glGenTextures(1, &texture[3]); // Create One Texture
  358.     // Create MipMapped Texture
  359.     glBindTexture(GL_TEXTURE_2D, texture[3]);
  360.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  361.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  362.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  363.   }
  364.   if (TextureImage[0]=LoadBMP("hobgoblin.bmp")) // Load Particle Texture
  365.   {
  366.     Status=TRUE; // Set The Status To TRUE
  367.     glGenTextures(1, &texture[4]); // Create One Texture
  368.     // Create MipMapped Texture
  369.     glBindTexture(GL_TEXTURE_2D, texture[4]);
  370.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  371.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  372.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  373.   }
  374.   if (TextureImage[0]=LoadBMP("Data/exit.bmp")) // Load Particle Texture
  375.   {
  376.     Status=TRUE; // Set The Status To TRUE
  377.     glGenTextures(1, &texture[5]); // Create One Texture
  378.     // Create MipMapped Texture
  379.     glBindTexture(GL_TEXTURE_2D, texture[5]);
  380.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  381.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  382.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  383.   }
  384.   if (TextureImage[0]=LoadBMP("Data/floor.bmp")) // Load Particle Texture
  385.   {
  386.     Status=TRUE; // Set The Status To TRUE
  387.     glGenTextures(1, &texture[6]); // Create One Texture
  388.     // Create MipMapped Texture
  389.     glBindTexture(GL_TEXTURE_2D, texture[6]);
  390.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  391.     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
  392.     gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);           
  393.   }
  394.   if (TextureImage[0]) // If Texture Exists
  395. {
  396.     if (TextureImage[0]->data) // If Texture Image Exists
  397.     {
  398.       free(TextureImage[0]->data); // Free The Texture Image Memory
  399.     }
  400.     free(TextureImage[0]); // Free The Image Structure
  401.   }
  402.   return Status; // Return The Status
  403. }
  404. GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window
  405. {
  406. if (height==0) // Prevent A Divide By Zero By
  407. {
  408. height=1; // Making Height Equal One
  409. }
  410. WIDTH=width;
  411. HEIGHT=height;
  412. glViewport(0,0,width,height); // Reset The Current Viewport
  413. glMatrixMode(GL_PROJECTION); // Select The Projection Matrix
  414. glLoadIdentity(); // Reset The Projection Matrix
  415. // Calculate The Aspect Ratio Of The Window
  416. glLoadIdentity(); // Reset The Modelview Matrix
  417. gluPerspective(60.0f,(GLdouble)width/(GLdouble)height,1.0f,1250.0f);
  418. glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix
  419. glLoadIdentity(); // Reset The Modelview Matrix
  420. }
  421. static GLuint ROOM[18], MODEL; // Storage For The Room Display List
  422. GLdouble xtrans2 = CELL*5-40.0f; // fail if 80.0f?
  423. GLdouble ytrans2 = 10;
  424. GLdouble ztrans2 = CELL*7-40.0f;
  425. GLdouble xtrans = 0;
  426. GLdouble ztrans = 0;
  427. // Build Cube Display Lists
  428. GLvoid BuildLists()
  429. ROOM[0]=glGenLists(18); // IDENTITY[IJ=1 1], Generate 18 Different Lists
  430.     glNewList(ROOM[0],GL_COMPILE); // Start With The Box List
  431.     
  432. glBindTexture(GL_TEXTURE_2D, texture[6]); 
  433.    
  434. glBegin(GL_QUADS);//bottom
  435. glTexCoord2d(20,28);  glVertex3d(CELL*5,0,CELL*7);
  436. glTexCoord2d(20,0);  glVertex3d(CELL*5,0,0);
  437. glTexCoord2d(0,0);  glVertex3d(0,0,0);
  438. glTexCoord2d(0,28);  glVertex3d(0,0,CELL*7);
  439. glEnd();
  440. glBegin(GL_QUADS);//top
  441. glTexCoord2d(20,28);  glVertex3d(CELL*5,CELL/4,CELL*7);
  442. glTexCoord2d(20,0);  glVertex3d(CELL*5,CELL/4,0);
  443. glTexCoord2d(0,0);  glVertex3d(0,CELL/4,0);
  444. glTexCoord2d(0,28);  glVertex3d(0,CELL/4,CELL*7);
  445. glEnd(); 
  446. /////////////////////////Wall Start///////////////////////////////////
  447.  
  448. glBindTexture(GL_TEXTURE_2D, texture[1]); 
  449. glBegin(GL_QUADS);//front
  450. glTexCoord2d(4,1);  glVertex3d(CELL*5,CELL/4,CELL*6);
  451. glTexCoord2d(4,0);  glVertex3d(CELL*5,0,CELL*6);
  452. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*6);
  453. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*6);
  454. glEnd();
  455. glBegin(GL_QUADS);//back
  456. glTexCoord2d(4,1);  glVertex3d(CELL*5,CELL/4,CELL*7);
  457. glTexCoord2d(4,0);  glVertex3d(CELL*5,0,CELL*7);
  458. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*7);
  459. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*7);
  460. glEnd();
  461. glBegin(GL_QUADS);//right
  462. glTexCoord2d(4,1);  glVertex3d(CELL*5,CELL/4,CELL*7);
  463. glTexCoord2d(4,0);  glVertex3d(CELL*5,0,CELL*7);
  464. glTexCoord2d(0,0);  glVertex3d(CELL*5,0,CELL*6);
  465. glTexCoord2d(0,1);  glVertex3d(CELL*5,CELL/4,CELL*6);
  466. glEnd();
  467. /////////////////////////Wall End///////////////////////////////////
  468.     glEndList();
  469. ROOM[1]=ROOM[0]+1;//IDENTITY[IJ=2 1]
  470. glNewList(ROOM[1],GL_COMPILE);
  471.  
  472. glBegin(GL_QUADS);//back
  473. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*7);
  474. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*7);
  475. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*7);
  476. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*7);
  477. glEnd();
  478. glBegin(GL_QUADS);//right
  479. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*7);
  480. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*7);
  481. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*6);
  482. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*6);
  483. glEnd();
  484. /////////////////////////Wall End///////////////////////////////////
  485.     glEndList();
  486. ROOM[2]=ROOM[1]+1;//IDENTITY[IJ=2 2]
  487. glNewList(ROOM[2],GL_COMPILE);  
  488.  
  489. glBegin(GL_QUADS);//right
  490. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*6);
  491. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*6);
  492. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*5);
  493. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*5);
  494. glEnd();
  495. /////////////////////////Wall End///////////////////////////////////
  496.     glEndList();
  497. ROOM[3]=ROOM[2]+1;//IDENTITY[IJ=2 3]
  498. glNewList(ROOM[3],GL_COMPILE); 
  499.  
  500. glBegin(GL_QUADS);//left
  501. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*5);
  502. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*5);
  503. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*4);
  504. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*4);
  505. glEnd();  
  506. glBegin(GL_QUADS);//right
  507. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*5);
  508. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*5);
  509. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*4);
  510. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*4);
  511. glEnd();
  512. /////////////////////////Wall End///////////////////////////////////
  513.     glEndList();
  514. ROOM[4]=ROOM[3]+1;//IDENTITY[IJ=2 4]
  515. glNewList(ROOM[4],GL_COMPILE); 
  516.  
  517. glBegin(GL_QUADS);//front
  518. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  519. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*3);
  520. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*3);
  521. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*3);
  522. glEnd(); 
  523. glBegin(GL_QUADS);//right
  524. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*4);
  525. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*4);
  526. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*3);
  527. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  528. glEnd();
  529. /////////////////////////Wall End///////////////////////////////////
  530.     glEndList();
  531. ROOM[4]=ROOM[3]+1;//IDENTITY[IJ=2 4]
  532. glNewList(ROOM[4],GL_COMPILE); 
  533.  
  534. glBegin(GL_QUADS);//front
  535. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  536. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*3);
  537. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*3);
  538. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*3);
  539. glEnd(); 
  540. glBegin(GL_QUADS);//right
  541. glTexCoord2d(4,1);  glVertex3d(CELL*4,CELL/4,CELL*4);
  542. glTexCoord2d(4,0);  glVertex3d(CELL*4,0,CELL*4);
  543. glTexCoord2d(0,0);  glVertex3d(CELL*4,0,CELL*3);
  544. glTexCoord2d(0,1);  glVertex3d(CELL*4,CELL/4,CELL*3);
  545. glEnd();
  546. /////////////////////////Wall End///////////////////////////////////
  547.     glEndList();
  548. ROOM[5]=ROOM[4]+1;//IDENTITY[IJ=3 2]
  549. glNewList(ROOM[5],GL_COMPILE); 
  550.  
  551. glBegin(GL_QUADS);//front
  552. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*5);
  553. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*5);
  554. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*5);
  555. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*5);
  556. glEnd(); 
  557. glBegin(GL_QUADS);//back
  558. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*6);
  559. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*6);
  560. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*6);
  561. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*6);
  562. glEnd();
  563. /////////////////////////Wall End///////////////////////////////////
  564.     glEndList();
  565. ROOM[6]=ROOM[5]+1;//IDENTITY[IJ=3 4]
  566. glNewList(ROOM[6],GL_COMPILE); 
  567.  
  568. glBegin(GL_QUADS);//back
  569. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*4);
  570. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*4);
  571. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*4);
  572. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*4);
  573. glEnd();  
  574. /////////////////////////Wall End///////////////////////////////////
  575.     glEndList();
  576. ROOM[7]=ROOM[6]+1;//IDENTITY[IJ=3 5]
  577. glNewList(ROOM[7],GL_COMPILE); 
  578.  
  579. glBegin(GL_QUADS);//left
  580. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*3);
  581. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*3);
  582. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL*2);
  583. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL*2);
  584. glEnd(); 
  585. glBegin(GL_QUADS);//right
  586. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*3);
  587. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*3);
  588. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL*2);
  589. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL*2);
  590. glEnd();
  591. /////////////////////////Wall End///////////////////////////////////
  592.     glEndList();
  593. ROOM[8]=ROOM[7]+1;//IDENTITY[IJ=3 6]
  594. glNewList(ROOM[8],GL_COMPILE); 
  595.  
  596. glBegin(GL_QUADS);//front
  597. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL);
  598. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL);
  599. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL);
  600. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL);
  601. glEnd(); 
  602. glBegin(GL_QUADS);//left
  603. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*2);
  604. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*2);
  605. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,CELL);
  606. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,CELL);
  607. glEnd(); 
  608. glBegin(GL_QUADS);//right
  609. glTexCoord2d(4,1);  glVertex3d(CELL*3,CELL/4,CELL*2);
  610. glTexCoord2d(4,0);  glVertex3d(CELL*3,0,CELL*2);
  611. glTexCoord2d(0,0);  glVertex3d(CELL*3,0,CELL);
  612. glTexCoord2d(0,1);  glVertex3d(CELL*3,CELL/4,CELL);
  613. glEnd();
  614. /////////////////////////Wall End///////////////////////////////////
  615.     glEndList();
  616. ROOM[9]=ROOM[8]+1;//IDENTITY[IJ=4 2]
  617. glNewList(ROOM[9],GL_COMPILE); 
  618.  
  619. glBegin(GL_QUADS);//front
  620. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*5);
  621. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*5);
  622. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*5);
  623. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*5);
  624. glEnd(); 
  625. glBegin(GL_QUADS);//back
  626. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*6);
  627. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*6);
  628. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*6);
  629. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*6);
  630. glEnd();
  631. /////////////////////////Wall End///////////////////////////////////
  632.     glEndList();
  633. ROOM[10]=ROOM[9]+1;//IDENTITY[IJ=4 4]
  634. glNewList(ROOM[10],GL_COMPILE); 
  635.  
  636. glBegin(GL_QUADS);//front
  637. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*3);
  638. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*3);
  639. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*3);
  640. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*3);
  641. glEnd(); 
  642. glBegin(GL_QUADS);//back
  643. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*4);
  644. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*4);
  645. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*4);
  646. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*4);
  647. glEnd();
  648. /////////////////////////Wall End///////////////////////////////////
  649.     glEndList();
  650. ROOM[11]=ROOM[10]+1;//IDENTITY[IJ=4 6]
  651. glNewList(ROOM[11],GL_COMPILE); 
  652.  
  653. glBegin(GL_QUADS);//back
  654. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL*2);
  655. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL*2);
  656. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*2);
  657. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*2);
  658. glEnd(); 
  659. /////////////////////////Wall End///////////////////////////////////
  660.     glEndList();
  661. ROOM[12]=ROOM[11]+1;//IDENTITY[IJ=4 7]
  662. glNewList(ROOM[12],GL_COMPILE); 
  663. glBindTexture(GL_TEXTURE_2D, texture[5]); 
  664. glBegin(GL_QUADS);//front
  665. glTexCoord2d(1,1);  glVertex3d(CELL*2-CELL*3/8,CELL/4,0);
  666. glTexCoord2d(1,0);  glVertex3d(CELL*2-CELL*3/8,0,0);
  667. glTexCoord2d(0,0);  glVertex3d(CELL+CELL*3/8,0,0);
  668. glTexCoord2d(0,1);  glVertex3d(CELL+CELL*3/8,CELL/4,0);
  669. glEnd(); 
  670.  
  671. glBindTexture(GL_TEXTURE_2D, texture[1]);
  672. glBegin(GL_QUADS);//front left
  673. glTexCoord2d(1.5,1);  glVertex3d(CELL+CELL*3/8,CELL/4,0);
  674. glTexCoord2d(1.5,0);  glVertex3d(CELL+CELL*3/8,0,0);
  675. glTexCoord2d(0,0);  glVertex3d(CELL,0,0);
  676. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,0);
  677. glEnd();
  678. glBegin(GL_QUADS);//front right
  679. glTexCoord2d(1.5,1);  glVertex3d(CELL*2,CELL/4,0);
  680. glTexCoord2d(1.5,0);  glVertex3d(CELL*2,0,0);
  681. glTexCoord2d(0,0);  glVertex3d(CELL*2-CELL*3/8,0,0);
  682. glTexCoord2d(0,1);  glVertex3d(CELL*2-CELL*3/8,CELL/4,0);
  683. glEnd();
  684. glBegin(GL_QUADS);//left
  685. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL);
  686. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL);
  687. glTexCoord2d(0,0);  glVertex3d(CELL,0,0);
  688. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,0);
  689. glEnd();  
  690. glBegin(GL_QUADS);//right
  691. glTexCoord2d(4,1);  glVertex3d(CELL*2,CELL/4,CELL);
  692. glTexCoord2d(4,0);  glVertex3d(CELL*2,0,CELL);
  693. glTexCoord2d(0,0);  glVertex3d(CELL*2,0,0);
  694. glTexCoord2d(0,1);  glVertex3d(CELL*2,CELL/4,0);
  695. glEnd();
  696. /////////////////////////Wall End///////////////////////////////////
  697.     glEndList();
  698. ROOM[13]=ROOM[12]+1;//IDENTITY[IJ=5 2]
  699. glNewList(ROOM[13],GL_COMPILE); 
  700.  
  701. glBegin(GL_QUADS);//back
  702. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*6);
  703. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*6);
  704. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*6);
  705. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*6);
  706. glEnd(); 
  707. glBegin(GL_QUADS);//left
  708. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*6);
  709. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*6);
  710. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*5);
  711. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*5);
  712. glEnd();  
  713. /////////////////////////Wall End///////////////////////////////////
  714.     glEndList();
  715. ROOM[14]=ROOM[13]+1;//IDENTITY[IJ=5 3]
  716. glNewList(ROOM[14],GL_COMPILE); 
  717.  
  718. glBegin(GL_QUADS);//front
  719. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*4);
  720. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*4);
  721. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*4);
  722. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*4);
  723. glEnd(); 
  724. glBegin(GL_QUADS);//left
  725. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*5);
  726. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*5);
  727. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*4);
  728. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*4);
  729. glEnd(); 
  730. glBegin(GL_QUADS);//right
  731. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*5);
  732. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*5);
  733. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*4);
  734. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*4);
  735. glEnd();
  736. /////////////////////////Wall End///////////////////////////////////
  737.     glEndList();
  738. ROOM[15]=ROOM[14]+1;//IDENTITY[IJ=5 4]
  739. glNewList(ROOM[15],GL_COMPILE); 
  740.  
  741. glBegin(GL_QUADS);//left
  742. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*4);
  743. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*4);
  744. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*3);
  745. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*3);
  746. glEnd();  
  747. /////////////////////////Wall End///////////////////////////////////
  748.     glEndList();
  749. ROOM[16]=ROOM[15]+1;//IDENTITY[IJ=5 5]
  750. glNewList(ROOM[16],GL_COMPILE); 
  751.  
  752. glBegin(GL_QUADS);//left
  753. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*3);
  754. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*3);
  755. glTexCoord2d(0,0);  glVertex3d(0,0,CELL*2);
  756. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL*2);
  757. glEnd(); 
  758. glBegin(GL_QUADS);//right
  759. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL*3);
  760. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL*3);
  761. glTexCoord2d(0,0);  glVertex3d(CELL,0,CELL*2);
  762. glTexCoord2d(0,1);  glVertex3d(CELL,CELL/4,CELL*2);
  763. glEnd();
  764. /////////////////////////Wall End///////////////////////////////////
  765.     glEndList();
  766. ROOM[17]=ROOM[16]+1;//IDENTITY[IJ=5 6]
  767. glNewList(ROOM[17],GL_COMPILE); 
  768.  
  769. glBegin(GL_QUADS);//front
  770. glTexCoord2d(4,1);  glVertex3d(CELL,CELL/4,CELL);
  771. glTexCoord2d(4,0);  glVertex3d(CELL,0,CELL);
  772. glTexCoord2d(0,0);  glVertex3d(0,0,CELL);
  773. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL);
  774. glEnd(); 
  775. glBegin(GL_QUADS);//left
  776. glTexCoord2d(4,1);  glVertex3d(0,CELL/4,CELL*2);
  777. glTexCoord2d(4,0);  glVertex3d(0,0,CELL*2);
  778. glTexCoord2d(0,0);  glVertex3d(0,0,CELL);
  779. glTexCoord2d(0,1);  glVertex3d(0,CELL/4,CELL);
  780. glEnd();  
  781. /////////////////////////Wall End///////////////////////////////////
  782.     glEndList();
  783. //glEnable(GL_BLEND);
  784. }
  785. GLvoid BuildLists1()
  786. {
  787. MODEL=glGenLists(1); // Generate 2 Different Lists
  788.     glNewList(MODEL,GL_COMPILE); // Start With The Box List
  789. glDisable(GL_BLEND);
  790. //////////// *** NEW *** ////////// *** NEW *** ///////////// *** NEW *** ////////////////////
  791. glBindTexture(GL_TEXTURE_2D, texture[4]);
  792. if(g_3DModel.pObject.size() > 0)
  793. {
  794. // Get the current object that we are displaying
  795. t3DObject *pObject = &g_3DModel.pObject[0];
  796. // Render lines or normal triangles mode, depending on the global variable
  797. glBegin(GL_TRIANGLES);
  798. // Go through all of the faces (polygons) of the object and draw them
  799. for(int j = 0; j < pObject->numOfFaces; j++)
  800. {
  801. // Go through each corner of the triangle and draw it.
  802. for(int whichVertex = 0; whichVertex < 3; whichVertex++)
  803. {
  804. // Get the index for each point in the face
  805. int index = pObject->pFaces[j].vertIndex[whichVertex];
  806. // Get the index for each texture coord in the face
  807. int index2 = pObject->pFaces[j].coordIndex[whichVertex];
  808. // Give OpenGL the normal for this vertex.  Notice that we put a 
  809. // - sign in front.  It appears that because of the ordering of Quake2's
  810. // polygons, we need to invert the normal
  811. glNormal3f(-pObject->pNormals[ index ].x, -pObject->pNormals[ index ].y, -pObject->pNormals[ index ].z);
  812. // Make sure there was a UVW map applied to the object or else it won't have tex coords.
  813. if(pObject->pTexVerts) 
  814. {
  815. glTexCoord2f(pObject->pTexVerts[ index2 ].x, pObject->pTexVerts[ index2 ].y);
  816. }
  817. // Pass in the current vertex of the object (Corner of current face)
  818. glVertex3f(pObject->pVerts[ index ].x, pObject->pVerts[ index ].y, pObject->pVerts[ index ].z);
  819. }
  820. }
  821. glEnd();
  822. }
  823. glEnable(GL_BLEND);
  824. glEndList();
  825. }
  826. GLdouble Time1;
  827. GLdouble Time2;
  828. GLdouble DiffTime;
  829. GLdouble StartTime;
  830. LPARAM lParam;
  831. int InitGL(GLvoid) // All Setup For OpenGL Goes Here
  832. {
  833. if (!g_LoadMd2.ImportMD2(&g_3DModel, FILE_NAME, TEXTURE_NAME)) // KEY of Clashing
  834.       return false; 
  835. if (!LoadTGA(&textures[0],"Data/Font.TGA")) // Load The Font Texture
  836. {
  837. return false; // If Loading Failed, Return False
  838. }
  839. if (!LoadGLTextures()) // Jump To Texture Loading Routine
  840.       return false;  
  841. //LPARAM lParam;
  842. SetCursorPos(322,240);
  843. float temp_mouse_x = LOWORD(lParam);
  844. float temp_mouse_y = HIWORD(lParam);
  845. SetCursorPos(320,240);
  846.   BuildLists();
  847.   BuildLists1();
  848.   glEnable(GL_TEXTURE_2D); // Enable Texture Mapping
  849. glClearColor(0, 0, 0, 1.0f); // Black Background
  850.   glEnable(GL_DEPTH_TEST);
  851.   glDepthFunc(GL_LEQUAL);
  852. glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
  853.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  854.   TimerInit(); //initialize timer
  855.   BuildFont();   
  856.   StartTime = TimerGetTime()/1000; 
  857. return TRUE; // Initialization Went OK
  858. }
  859. // Detect collision and reflect movement if collision is detected
  860. // cx = x position; cy = y position; cz = z position;
  861. // cxi = x increment; cyi = y increment; czi = z increment;
  862. // padding = a square border around the object.  your value will be 1/2 the length of one side of the square
  863. // bounce = bounce coefficient -- 0 = no bounce; 1 = perfect bounce
  864. inline bool Collision11(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  865. {
  866.   bool Status = false;
  867.   if (cx > CELL*5-padding) //right
  868.   {
  869.     cx = CELL*5-padding; 
  870.     cxi = -cxi;
  871.     cxi *= bounce; 
  872.     Status = true;
  873.   }
  874.   if (cy > CELL/4-padding) //top
  875.   {
  876.     cy = CELL/4-padding; 
  877.     cyi = -cyi;
  878.     cyi *= bounce; 
  879.     Status = true;
  880.   }
  881.   else if (cy < 0+padding) //bottom
  882.   {
  883.     cy = 0+padding; 
  884.     cyi = -cyi;
  885.     cyi *= bounce; 
  886.     Status = true;
  887.   }
  888.   if (cz > CELL*7-padding) //back
  889.   {
  890.     cz = CELL*7-padding; 
  891.     czi = -czi;
  892.     czi *= bounce; 
  893.     Status = true;
  894.   }
  895.   else if (cz < CELL*6+padding) //front
  896.   {
  897.     cz = CELL*6+padding; 
  898.     czi = -czi;
  899.     czi *= bounce; 
  900.     Status = true;
  901.   }
  902.   return Status;
  903. }
  904. inline bool Collision21(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  905. {
  906.   bool Status = false;
  907.   if (cx < CELL*3+padding)//left
  908.   {
  909.     cx = CELL*3+padding; 
  910.     cxi = -cxi;
  911.     cxi *= bounce; 
  912.     Status = true;
  913.   }
  914.   if (cy > CELL/4-padding) //top
  915.   {
  916.     cy = CELL/4-padding; 
  917.     cyi = -cyi;
  918.     cyi *= bounce; 
  919.     Status = true;
  920.   }
  921.   else if (cy < 0+padding) //bottom
  922.   {
  923.     cy = 0+padding; 
  924.     cyi = -cyi;
  925.     cyi *= bounce; 
  926.     Status = true;
  927.   }
  928.   if (cz > CELL*7-padding) //back
  929.   {
  930.     cz = CELL*7-padding; 
  931.     czi = -czi;
  932.     czi *= bounce; 
  933.     Status = true;
  934.   } 
  935.   return Status;
  936. }
  937. inline bool Collision22(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  938. {
  939.   bool Status = false;
  940.   if (cx > CELL*4-padding)//right
  941.   {
  942.     cx = CELL*4-padding; 
  943.     cxi = -cxi;
  944.     cxi *= bounce; 
  945.     Status = true;
  946.   }
  947.   if (cy > CELL/4-padding) //top
  948.   {
  949.     cy = CELL/4-padding; 
  950.     cyi = -cyi;
  951.     cyi *= bounce; 
  952.     Status = true;
  953.   }
  954.   else if (cy < 0+padding) //bottom
  955.   {
  956.     cy = 0+padding; 
  957.     cyi = -cyi;
  958.     cyi *= bounce; 
  959.     Status = true;
  960.   } 
  961.   return Status;
  962. }
  963. inline bool Collision23(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  964. {
  965.   bool Status = false;
  966.   if (cx < CELL*3+padding)//left
  967.   {
  968.     cx = CELL*3+padding; 
  969.     cxi = -cxi;
  970.     cxi *= bounce; 
  971.     Status = true;
  972.   }
  973.   else if (cx > CELL*4-padding)//right
  974.   {
  975.     cx = CELL*4-padding; 
  976.     cxi = -cxi;
  977.     cxi *= bounce; 
  978.     Status = true;
  979.   }
  980.   if (cy > CELL/4-padding) //top
  981.   {
  982.     cy = CELL/4-padding; 
  983.     cyi = -cyi;
  984.     cyi *= bounce; 
  985.     Status = true;
  986.   }
  987.   else if (cy < 0+padding) //bottom
  988.   {
  989.     cy = 0+padding; 
  990.     cyi = -cyi;
  991.     cyi *= bounce; 
  992.     Status = true;
  993.   }
  994.   return Status;
  995. }
  996. inline bool Collision24(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  997. {
  998.   bool Status = false;
  999.   if (cx > CELL*4-padding)//right
  1000.   {
  1001.     cx = CELL*4-padding; 
  1002.     cxi = -cxi;
  1003.     cxi *= bounce; 
  1004.     Status = true;
  1005.   }
  1006.   if (cy > CELL/4-padding) //top
  1007.   {
  1008.     cy = CELL/4-padding; 
  1009.     cyi = -cyi;
  1010.     cyi *= bounce; 
  1011.     Status = true;
  1012.   }
  1013.   else if (cy < 0+padding) //bottom
  1014.   {
  1015.     cy = 0+padding; 
  1016.     cyi = -cyi;
  1017.     cyi *= bounce; 
  1018.     Status = true;
  1019.   }
  1020.   if (cz < CELL*3+padding) //front
  1021.   {
  1022.     cz = CELL*3+padding; 
  1023.     czi = -czi;
  1024.     czi *= bounce; 
  1025.     Status = true;
  1026.   }
  1027.   return Status;
  1028. }
  1029. inline bool Collision32(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1030. {
  1031.   bool Status = false; 
  1032.   if (cy > CELL/4-padding) //top
  1033.   {
  1034.     cy = CELL/4-padding; 
  1035.     cyi = -cyi;
  1036.     cyi *= bounce; 
  1037.     Status = true;
  1038.   }
  1039.   else if (cy < 0+padding) //bottom
  1040.   {
  1041.     cy = 0+padding; 
  1042.     cyi = -cyi;
  1043.     cyi *= bounce; 
  1044.     Status = true;
  1045.   }
  1046.   if (cz > CELL*6-padding) //back
  1047.   {
  1048.     cz = CELL*6-padding; 
  1049.     czi = -czi;
  1050.     czi *= bounce; 
  1051.     Status = true;
  1052.   }
  1053.   else if (cz < CELL*5+padding) //front
  1054.   {
  1055.     cz = CELL*5+padding; 
  1056.     czi = -czi;
  1057.     czi *= bounce; 
  1058.     Status = true;
  1059.   }
  1060.   return Status;
  1061. }
  1062. inline bool Collision34(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1063. {
  1064.   bool Status = false; 
  1065.   if (cy > CELL/4-padding) //top
  1066.   {
  1067.     cy = CELL/4-padding; 
  1068.     cyi = -cyi;
  1069.     cyi *= bounce; 
  1070.     Status = true;
  1071.   }
  1072.   else if (cy < 0+padding) //bottom
  1073.   {
  1074.     cy = 0+padding; 
  1075.     cyi = -cyi;
  1076.     cyi *= bounce; 
  1077.     Status = true;
  1078.   }
  1079.   if (cz > CELL*4-padding) //back
  1080.   {
  1081.     cz = CELL*4-padding; 
  1082.     czi = -czi;
  1083.     czi *= bounce; 
  1084.     Status = true;
  1085.   } 
  1086.   return Status;
  1087. }
  1088. inline bool Collision35(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1089. {
  1090.   bool Status = false;
  1091.   if (cx < CELL*2+padding)//left
  1092.   {
  1093.     cx = CELL*2+padding; 
  1094.     cxi = -cxi;
  1095.     cxi *= bounce; 
  1096.     Status = true;
  1097.   }
  1098.   else if (cx > CELL*3-padding)//right
  1099.   {
  1100.     cx = CELL*3-padding; 
  1101.     cxi = -cxi;
  1102.     cxi *= bounce; 
  1103.     Status = true;
  1104.   }
  1105.   if (cy > CELL/4-padding) //top
  1106.   {
  1107.     cy = CELL/4-padding; 
  1108.     cyi = -cyi;
  1109.     cyi *= bounce; 
  1110.     Status = true;
  1111.   }
  1112.   else if (cy < 0+padding) //bottom
  1113.   {
  1114.     cy = 0+padding; 
  1115.     cyi = -cyi;
  1116.     cyi *= bounce; 
  1117.     Status = true;
  1118.   }
  1119.   return Status;
  1120. }
  1121. inline bool Collision36(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1122. {
  1123.   bool Status = false;
  1124.   if (cx < CELL*2+padding)//left
  1125.   {
  1126.     cx = CELL*2+padding; 
  1127.     cxi = -cxi;
  1128.     cxi *= bounce; 
  1129.     Status = true;
  1130.   }
  1131.   else if (cx > CELL*3-padding)//right
  1132.   {
  1133.     cx = CELL*3-padding; 
  1134.     cxi = -cxi;
  1135.     cxi *= bounce; 
  1136.     Status = true;
  1137.   }
  1138.   if (cy > CELL/4-padding) //top
  1139.   {
  1140.     cy = CELL/4-padding; 
  1141.     cyi = -cyi;
  1142.     cyi *= bounce; 
  1143.     Status = true;
  1144.   }
  1145.   else if (cy < 0+padding) //bottom
  1146.   {
  1147.     cy = 0+padding; 
  1148.     cyi = -cyi;
  1149.     cyi *= bounce; 
  1150.     Status = true;
  1151.   }
  1152.   if (cz < CELL+padding) //front
  1153.   {
  1154.     cz = CELL+padding; 
  1155.     czi = -czi;
  1156.     czi *= bounce; 
  1157.     Status = true;
  1158.   }
  1159.   return Status;
  1160. }
  1161. inline bool Collision42(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1162. {
  1163.   bool Status = false; 
  1164.   if (cy > CELL/4-padding) //top
  1165.   {
  1166.     cy = CELL/4-padding; 
  1167.     cyi = -cyi;
  1168.     cyi *= bounce; 
  1169.     Status = true;
  1170.   }
  1171.   else if (cy < 0+padding) //bottom
  1172.   {
  1173.     cy = 0+padding; 
  1174.     cyi = -cyi;
  1175.     cyi *= bounce; 
  1176.     Status = true;
  1177.   }
  1178.   if (cz > CELL*6-padding) //back
  1179.   {
  1180.     cz = CELL*6-padding; 
  1181.     czi = -czi;
  1182.     czi *= bounce; 
  1183.     Status = true;
  1184.   }
  1185.   else if (cz < CELL*5+padding) //front
  1186.   {
  1187.     cz = CELL*5+padding; 
  1188.     czi = -czi;
  1189.     czi *= bounce; 
  1190.     Status = true;
  1191.   }
  1192.   return Status;
  1193. }
  1194. inline bool Collision44(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1195. {
  1196.   bool Status = false;
  1197.   if (cy > CELL/4-padding) //top
  1198.   {
  1199.     cy = CELL/4-padding; 
  1200.     cyi = -cyi;
  1201.     cyi *= bounce; 
  1202.     Status = true;
  1203.   }
  1204.   else if (cy < 0+padding) //bottom
  1205.   {
  1206.     cy = 0+padding; 
  1207.     cyi = -cyi;
  1208.     cyi *= bounce; 
  1209.     Status = true;
  1210.   }
  1211.   if (cz > CELL*4-padding) //back
  1212.   {
  1213.     cz = CELL*4-padding; 
  1214.     czi = -czi;
  1215.     czi *= bounce; 
  1216.     Status = true;
  1217.   }
  1218.   else if (cz < CELL*3+padding) //front
  1219.   {
  1220.     cz = CELL*3+padding; 
  1221.     czi = -czi;
  1222.     czi *= bounce; 
  1223.     Status = true;
  1224.   }
  1225.   return Status;
  1226. }
  1227. inline bool Collision46(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1228. {
  1229.   bool Status = false;
  1230.   if (cx > CELL*2-padding) //right
  1231.   {
  1232.     cx = CELL*2-padding; 
  1233.     cxi = -cxi;
  1234.     cxi *= bounce; 
  1235.     Status = true;
  1236.   }
  1237.   if (cy > CELL/4-padding) //top
  1238.   {
  1239.     cy = CELL/4-padding; 
  1240.     cyi = -cyi;
  1241.     cyi *= bounce; 
  1242.     Status = true;
  1243.   }
  1244.   else if (cy < 0+padding) //bottom
  1245.   {
  1246.     cy = 0+padding; 
  1247.     cyi = -cyi;
  1248.     cyi *= bounce; 
  1249.     Status = true;
  1250.   }
  1251.   if (cz > CELL*2-padding) //back
  1252.   {
  1253.     cz = CELL*2-padding; 
  1254.     czi = -czi;
  1255.     czi *= bounce; 
  1256.     Status = true;
  1257.   } 
  1258.   return Status;
  1259. }
  1260. inline bool Collision47(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1261. {
  1262.   bool Status = false;
  1263.   if (cx < CELL+padding)//left
  1264.   {
  1265.     cx = CELL+padding; 
  1266.     cxi = -cxi;
  1267.     cxi *= bounce; 
  1268.     Status = true;
  1269.   }
  1270.   else if (cx > CELL*2-padding)//right
  1271.   {
  1272.     cx = CELL*2-padding; 
  1273.     cxi = -cxi;
  1274.     cxi *= bounce; 
  1275.     Status = true;
  1276.   }
  1277.   if (cy > CELL/4-padding) //top
  1278.   {
  1279.     cy = CELL/4-padding; 
  1280.     cyi = -cyi;
  1281.     cyi *= bounce; 
  1282.     Status = true;
  1283.   }
  1284.   else if (cy < 0+padding) //bottom
  1285.   {
  1286.     cy = 0+padding; 
  1287.     cyi = -cyi;
  1288.     cyi *= bounce; 
  1289.     Status = true;
  1290.   } 
  1291.   if (cz < 0+padding && 
  1292. (cx < CELL*1+CELL*3/8+padding || 
  1293. cx > CELL*2-CELL*3/8-padding)) //[4 7]front door
  1294.   {
  1295.     cz = 0+padding;
  1296.     czi = -czi;
  1297.     czi *= bounce; 
  1298.     Status = true;
  1299.   }
  1300.   return Status;
  1301. }
  1302. inline bool Collision52(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1303. {
  1304.   bool Status = false;
  1305.   if (cx < 0+padding) //left
  1306.   {
  1307.     cx = 0+padding; 
  1308.     cxi = -cxi;
  1309.     cxi *= bounce; 
  1310.     Status = true;
  1311.   }
  1312.   if (cy > CELL/4-padding) //top
  1313.   {
  1314.     cy = CELL/4-padding; 
  1315.     cyi = -cyi;
  1316.     cyi *= bounce; 
  1317.     Status = true;
  1318.   }
  1319.   else if (cy < 0+padding) //bottom
  1320.   {
  1321.     cy = 0+padding; 
  1322.     cyi = -cyi;
  1323.     cyi *= bounce; 
  1324.     Status = true;
  1325.   }
  1326.   if (cz > CELL*6-padding) //back
  1327.   {
  1328.     cz = CELL*6-padding; 
  1329.     czi = -czi;
  1330.     czi *= bounce; 
  1331.     Status = true;
  1332.   } 
  1333.   return Status;
  1334. }
  1335. inline bool Collision53(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1336. {
  1337.   bool Status = false;
  1338.   if (cx < 0+padding)//left
  1339.   {
  1340.     cx = 0+padding; 
  1341.     cxi = -cxi;
  1342.     cxi *= bounce; 
  1343.     Status = true;
  1344.   }
  1345.   else if (cx > CELL-padding)//right
  1346.   {
  1347.     cx = CELL-padding; 
  1348.     cxi = -cxi;
  1349.     cxi *= bounce; 
  1350.     Status = true;
  1351.   }
  1352.   if (cy > CELL/4-padding) //top
  1353.   {
  1354.     cy = CELL/4-padding; 
  1355.     cyi = -cyi;
  1356.     cyi *= bounce; 
  1357.     Status = true;
  1358.   }
  1359.   else if (cy < 0+padding) //bottom
  1360.   {
  1361.     cy = 0+padding; 
  1362.     cyi = -cyi;
  1363.     cyi *= bounce; 
  1364.     Status = true;
  1365.   }
  1366.   if (cz < CELL*4+padding) //front
  1367.   {
  1368.     cz = CELL*4+padding; 
  1369.     czi = -czi;
  1370.     czi *= bounce; 
  1371.     Status = true;
  1372.   }
  1373.   return Status;
  1374. }
  1375. inline bool Collision54(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1376. {
  1377.   bool Status = false;
  1378.   if (cx < 0+padding) //left
  1379.   {
  1380.     cx = 0+padding; 
  1381.     cxi = -cxi;
  1382.     cxi *= bounce; 
  1383.     Status = true;
  1384.   }
  1385.   if (cy > CELL/4-padding) //top
  1386.   {
  1387.     cy = CELL/4-padding; 
  1388.     cyi = -cyi;
  1389.     cyi *= bounce; 
  1390.     Status = true;
  1391.   }
  1392.   else if (cy < 0+padding) //bottom
  1393.   {
  1394.     cy = 0+padding; 
  1395.     cyi = -cyi;
  1396.     cyi *= bounce; 
  1397.     Status = true;
  1398.   }
  1399.   if (cz > CELL*4-padding) //back
  1400.   {
  1401.     cz = CELL*4-padding; 
  1402.     czi = -czi;
  1403.     czi *= bounce; 
  1404.     Status = true;
  1405.   }
  1406.   return Status;
  1407. }
  1408. inline bool Collision55(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1409. {
  1410.   bool Status = false;
  1411.   if (cx < 0+padding)//left
  1412.   {
  1413.     cx = 0+padding; 
  1414.     cxi = -cxi;
  1415.     cxi *= bounce; 
  1416.     Status = true;
  1417.   }
  1418.   else if (cx > CELL-padding)//right
  1419.   {
  1420.     cx = CELL-padding; 
  1421.     cxi = -cxi;
  1422.     cxi *= bounce; 
  1423.     Status = true;
  1424.   }
  1425.   if (cy > CELL/4-padding) //top
  1426.   {
  1427.     cy = CELL/4-padding; 
  1428.     cyi = -cyi;
  1429.     cyi *= bounce; 
  1430.     Status = true;
  1431.   }
  1432.   else if (cy < 0+padding) //bottom
  1433.   {
  1434.     cy = 0+padding; 
  1435.     cyi = -cyi;
  1436.     cyi *= bounce; 
  1437.     Status = true;
  1438.   }
  1439.  
  1440.   return Status;
  1441. }
  1442. inline bool Collision56(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1443. {
  1444.   bool Status = false;
  1445.   if (cx < 0+padding)//left
  1446.   {
  1447.     cx = 0+padding; 
  1448.     cxi = -cxi;
  1449.     cxi *= bounce; 
  1450.     Status = true;
  1451.   }
  1452.   if (cy > CELL/4-padding) //top
  1453.   {
  1454.     cy = CELL/4-padding; 
  1455.     cyi = -cyi;
  1456.     cyi *= bounce; 
  1457.     Status = true;
  1458.   }
  1459.   else if (cy < 0+padding) //bottom
  1460.   {
  1461.     cy = 0+padding; 
  1462.     cyi = -cyi;
  1463.     cyi *= bounce; 
  1464.     Status = true;
  1465.   }
  1466.   if (cz < CELL+padding) //front
  1467.   {
  1468.     cz = CELL+padding; 
  1469.     czi = -czi;
  1470.     czi *= bounce; 
  1471.     Status = true;
  1472.   }
  1473.   return Status;
  1474. }
  1475. inline bool CollisionAll(GLdouble &cx, GLdouble &cy, GLdouble &cz, GLdouble &cxi, GLdouble &cyi, GLdouble &czi, GLdouble padding, GLdouble bounce)
  1476. {
  1477. bool Status = false;
  1478. if( xtrans2 > CELL*3 && xtrans2 < CELL*5 &&
  1479. ztrans2 > CELL*6 && ztrans2 < CELL*7 ) //[11][21]
  1480. {
  1481. if (cx > CELL*5-padding) //right
  1482. {
  1483. cx = CELL*5-padding; 
  1484. cxi = -cxi;
  1485. cxi *= bounce; 
  1486. Status = true;
  1487. }
  1488. else if (cx < CELL*3+padding)//left
  1489. {
  1490. cx = CELL*3+padding; 
  1491. cxi = -cxi;
  1492. cxi *= bounce; 
  1493. Status = true;
  1494. }
  1495. if (cy > CELL/4-padding) //top
  1496. {
  1497. cy = CELL/4-padding; 
  1498. cyi = -cyi;
  1499. cyi *= bounce; 
  1500. Status = true;
  1501. }
  1502. else if (cy < 0+padding) //bottom
  1503. {
  1504. cy = 0+padding; 
  1505. cyi = -cyi;
  1506. cyi *= bounce; 
  1507. Status = true;
  1508. }
  1509. if (cz > CELL*7-padding) //back
  1510. {
  1511. cz = CELL*7-padding; 
  1512. czi = -czi;
  1513. czi *= bounce; 
  1514. Status = true;
  1515. }
  1516. else if (cz < CELL*6+padding) //front
  1517. {
  1518. cz = CELL*6+padding; 
  1519. czi = -czi;
  1520. czi *= bounce; 
  1521. Status = true;
  1522. }
  1523. }
  1524. else if( xtrans2 > 0 && xtrans2 < CELL*4 &&
  1525. ztrans2 > CELL*5 && ztrans2 < CELL*6 ) //[22][32][42][52]
  1526. {
  1527. if (cx > CELL*4-padding) //right
  1528. {
  1529. cx = CELL*4-padding; 
  1530. cxi = -cxi;
  1531. cxi *= bounce; 
  1532. Status = true;
  1533. }
  1534. else if (cx < 0+padding)//left
  1535. {
  1536. cx = 0+padding; 
  1537. cxi = -cxi;
  1538. cxi *= bounce; 
  1539. Status = true;
  1540. }
  1541. if (cy > CELL/4-padding) //top
  1542. {
  1543. cy = CELL/4-padding; 
  1544. cyi = -cyi;
  1545. cyi *= bounce; 
  1546. Status = true;
  1547. }
  1548. else if (cy < 0+padding) //bottom
  1549. {
  1550. cy = 0+padding; 
  1551. cyi = -cyi;
  1552. cyi *= bounce; 
  1553. Status = true;
  1554. }
  1555. if (cz > CELL*6-padding) //back
  1556. {
  1557. cz = CELL*6-padding; 
  1558. czi = -czi;
  1559. czi *= bounce; 
  1560. Status = true;
  1561. }
  1562. else if (cz < CELL*5+padding) //front
  1563. {
  1564. cz = CELL*5+padding; 
  1565. czi = -czi;
  1566. czi *= bounce; 
  1567. Status = true;
  1568. }
  1569. }
  1570. else if( xtrans2 > CELL*3 && xtrans2 < CELL*4 &&
  1571. ztrans2 > CELL*3 && ztrans2 < CELL*5 ) //[23][24]
  1572. {
  1573. if (cx > CELL*4-padding) //right
  1574. {
  1575. cx = CELL*4-padding; 
  1576. cxi = -cxi;
  1577. cxi *= bounce; 
  1578. Status = true;
  1579. }
  1580. else if (cx < CELL*3+padding)//left
  1581. {
  1582. cx = CELL*3+padding; 
  1583. cxi = -cxi;
  1584. cxi *= bounce; 
  1585. Status = true;
  1586. }
  1587. if (cy > CELL/4-padding) //top
  1588. {
  1589. cy = CELL/4-padding; 
  1590. cyi = -cyi;
  1591. cyi *= bounce; 
  1592. Status = true;
  1593. }
  1594. else if (cy < 0+padding) //bottom
  1595. {
  1596. cy = 0+padding; 
  1597. cyi = -cyi;
  1598. cyi *= bounce; 
  1599. Status = true;
  1600. }
  1601. if (cz > CELL*5-padding) //back
  1602. {
  1603. cz = CELL*5-padding; 
  1604. czi = -czi;
  1605. czi *= bounce; 
  1606. Status = true;
  1607. }
  1608. else if (cz < CELL*3+padding) //front
  1609. {
  1610. cz = CELL*3+padding; 
  1611. czi = -czi;
  1612. czi *= bounce; 
  1613. Status = true;
  1614. }
  1615. }
  1616. else if( xtrans2 > 0 && xtrans2 < CELL &&
  1617. ztrans2 > CELL*4 && ztrans2 < CELL*5 ) //[53]
  1618. {
  1619. if (cx > CELL-padding) //right
  1620. {
  1621. cx = CELL-padding; 
  1622. cxi = -cxi;
  1623. cxi *= bounce; 
  1624. Status = true;
  1625. }
  1626. else if (cx < 0+padding)//left
  1627. {
  1628. cx = 0+padding; 
  1629. cxi = -cxi;
  1630. cxi *= bounce; 
  1631. Status = true;
  1632. }
  1633. if (cy > CELL/4-padding) //top
  1634. {
  1635. cy = CELL/4-padding; 
  1636. cyi = -cyi;
  1637. cyi *= bounce; 
  1638. Status = true;
  1639. }
  1640. else if (cy < 0+padding) //bottom
  1641. {
  1642. cy = 0+padding; 
  1643. cyi = -cyi;
  1644. cyi *= bounce; 
  1645. Status = true;
  1646. }
  1647. if (cz > CELL*5-padding) //back
  1648. {
  1649. cz = CELL*5-padding; 
  1650. czi = -czi;
  1651. czi *= bounce; 
  1652. Status = true;
  1653. }
  1654. else if (cz < CELL*4+padding) //front
  1655. {
  1656. cz = CELL*4+padding; 
  1657. czi = -czi;
  1658. czi *= bounce; 
  1659. Status = true;
  1660. }
  1661. }
  1662. else if( xtrans2 > CELL*2 && xtrans2 < CELL*3 &&
  1663. ztrans2 > CELL && ztrans2 < CELL*4 ) //[34][35][36]
  1664. {
  1665. if (cx > CELL*3-padding) //right
  1666. {
  1667. cx = CELL*3-padding; 
  1668. cxi = -cxi;
  1669. cxi *= bounce; 
  1670. Status = true;
  1671. }
  1672. else if (cx < CELL*2+padding)//left
  1673. {
  1674. cx = CELL*2+padding; 
  1675. cxi = -cxi;
  1676. cxi *= bounce; 
  1677. Status = true;
  1678. }
  1679. if (cy > CELL/4-padding) //top
  1680. {
  1681. cy = CELL/4-padding; 
  1682. cyi = -cyi;
  1683. cyi *= bounce; 
  1684. Status = true;
  1685. }
  1686. else if (cy < 0+padding) //bottom
  1687. {
  1688. cy = 0+padding; 
  1689. cyi = -cyi;
  1690. cyi *= bounce; 
  1691. Status = true;
  1692. }
  1693. if (cz > CELL*4-padding) //back
  1694. {
  1695. cz = CELL*4-padding; 
  1696. czi = -czi;
  1697. czi *= bounce; 
  1698. Status = true;
  1699. }
  1700. else if (cz < CELL+padding) //front
  1701. {
  1702. cz = CELL+padding; 
  1703. czi = -czi;
  1704. czi *= bounce; 
  1705. Status = true;
  1706. }
  1707. }
  1708. else if( xtrans2 > CELL && xtrans2 < CELL*2 &&
  1709. ztrans2 > CELL*3 && ztrans2 < CELL*4 ) //[44]
  1710. {
  1711. if (cx > CELL*2-padding) //right
  1712. {
  1713. cx = CELL*2-padding; 
  1714. cxi = -cxi;
  1715. cxi *= bounce; 
  1716. Status = true;
  1717. }
  1718. else if (cx < CELL+padding)//left
  1719. {
  1720. cx = CELL+padding; 
  1721. cxi = -cxi;
  1722. cxi *= bounce; 
  1723. Status = true;
  1724. }
  1725. if (cy > CELL/4-padding) //top
  1726. {
  1727. cy = CELL/4-padding; 
  1728. cyi = -cyi;
  1729. cyi *= bounce; 
  1730. Status = true;
  1731. }
  1732. else if (cy < 0+padding) //bottom
  1733. {
  1734. cy = 0+padding; 
  1735. cyi = -cyi;
  1736. cyi *= bounce; 
  1737. Status = true;
  1738. }
  1739. if (cz > CELL*4-padding) //back
  1740. {
  1741. cz = CELL*4-padding; 
  1742. czi = -czi;
  1743. czi *= bounce; 
  1744. Status = true;
  1745. }
  1746. else if (cz < CELL*3+padding) //front
  1747. {
  1748. cz = CELL*3+padding; 
  1749. czi = -czi;
  1750. czi *= bounce; 
  1751. Status = true;
  1752. }
  1753. }
  1754. else if( xtrans2 > 0 && xtrans2 < CELL &&
  1755. ztrans2 > CELL && ztrans2 < CELL*4 ) //[54][55][56]
  1756. {
  1757. if (cx > CELL-padding) //right
  1758. {
  1759. cx = CELL-padding; 
  1760. cxi = -cxi;
  1761. cxi *= bounce; 
  1762. Status = true;
  1763. }
  1764. else if (cx < 0+padding)//left
  1765. {
  1766. cx = 0+padding; 
  1767. cxi = -cxi;
  1768. cxi *= bounce; 
  1769. Status = true;
  1770. }
  1771. if (cy > CELL/4-padding) //top
  1772. {
  1773. cy = CELL/4-padding; 
  1774. cyi = -cyi;
  1775. cyi *= bounce; 
  1776. Status = true;
  1777. }
  1778. else if (cy < 0+padding) //bottom
  1779. {
  1780. cy = 0+padding; 
  1781. cyi = -cyi;
  1782. cyi *= bounce; 
  1783. Status = true;
  1784. }
  1785. if (cz > CELL*4-padding) //back
  1786. {
  1787. cz = CELL*4-padding; 
  1788. czi = -czi;
  1789. czi *= bounce; 
  1790. Status = true;
  1791. }
  1792. else if (cz < CELL+padding) //front
  1793. {
  1794. cz = CELL+padding; 
  1795. czi = -czi;
  1796. czi *= bounce; 
  1797. Status = true;
  1798. }
  1799. }
  1800. else if( xtrans2 > CELL && xtrans2 < CELL*2 &&
  1801. ztrans2 > 0 && ztrans2 < CELL*2 ) //[46][47]
  1802. {
  1803. if (cx > CELL*2-padding) //right
  1804. {
  1805. cx = CELL*2-padding; 
  1806. cxi = -cxi;
  1807. cxi *= bounce; 
  1808. Status = true;
  1809. }
  1810. else if (cx < CELL+padding)//left
  1811. {
  1812. cx = CELL+padding; 
  1813. cxi = -cxi;
  1814. cxi *= bounce; 
  1815. Status = true;
  1816. }
  1817. if (cy > CELL/4-padding) //top
  1818. {
  1819. cy = CELL/4-padding; 
  1820. cyi = -cyi;
  1821. cyi *= bounce; 
  1822. Status = true;
  1823. }
  1824. else if (cy < 0+padding) //bottom
  1825. {
  1826. cy = 0+padding; 
  1827. cyi = -cyi;
  1828. cyi *= bounce; 
  1829. Status = true;
  1830. }
  1831. if (cz > CELL*2-padding) //back
  1832. {
  1833. cz = CELL*2-padding; 
  1834. czi = -czi;
  1835. czi *= bounce; 
  1836. Status = true;
  1837. }
  1838. else if (cz < 0+padding) //front
  1839. {
  1840. cz = 0+padding; 
  1841. czi = -czi;
  1842. czi *= bounce; 
  1843. Status = true;
  1844. }
  1845. }
  1846.   return Status;
  1847. }
  1848. inline void Ricochet()
  1849. {
  1850.   int i;
  1851.   
  1852.   for (i = 0; i < MAX_PARTICLES; i++)
  1853.   {
  1854.     if (i == 0)
  1855.       particle[i][shots_fired].size = 2;
  1856.     else
  1857.       particle[i][shots_fired].size = GLdouble((rand()%25)+25)/50;
  1858.     
  1859.     particle[i][shots_fired].triangle_x1 = GLdouble((rand()%50)-25)/75.f;
  1860.     particle[i][shots_fired].triangle_x2 = GLdouble((rand()%50)-25)/75.f;
  1861.     particle[i][shots_fired].triangle_x3 = GLdouble((rand()%50)-25)/75.f;
  1862.     particle[i][shots_fired].triangle_y1 = GLdouble((rand()%50)-25)/75.f;
  1863.     particle[i][shots_fired].triangle_y2 = GLdouble((rand()%50)-25)/75.f;
  1864.     particle[i][shots_fired].triangle_y3 = GLdouble((rand()%50)-25)/75.f;
  1865.     
  1866.     particle[i][shots_fired].triangle_z1 = GLdouble((rand()%50)-25)/75.f;
  1867.     particle[i][shots_fired].triangle_z2 = GLdouble((rand()%50)-25)/75.f;
  1868.     particle[i][shots_fired].triangle_z3 = GLdouble((rand()%50)-25)/75.f;
  1869.     particle[i][shots_fired].triangle_rotate_x = rand()%360;
  1870.     particle[i][shots_fired].triangle_rotate_y = rand()%360;
  1871.     particle[i][shots_fired].triangle_rotate_z = rand()%360;
  1872.     particle[i][shots_fired].triangle_rotate_xi = GLdouble((rand()%50)-25)/5;
  1873.     particle[i][shots_fired].triangle_rotate_yi = GLdouble((rand()%50)-25)/5;
  1874.     particle[i][shots_fired].triangle_rotate_zi = GLdouble((rand()%50)-25)/5;
  1875.     particle[i][shots_fired].life = 1;
  1876.     particle[i][shots_fired].fade = GLdouble(rand()%100)/5000 + .02f;
  1877.     particle[i][shots_fired].x = fire_x;
  1878.     particle[i][shots_fired].y = fire_y;
  1879.     particle[i][shots_fired].z = fire_z;
  1880.     GLdouble angle = rand()%360;
  1881.     GLdouble angle2 = rand()%360;
  1882.     GLdouble speed = GLdouble(rand()%100) / 500;
  1883.     GLdouble Hyp = Hypot(angle,angle2);
  1884.     particle[i][shots_fired].xi = sin(Hypot(angle,Hyp))*speed + fire_xp;
  1885.     particle[i][shots_fired].yi = cos(Hypot(angle,Hyp))*speed + fire_yp;
  1886.     particle[i][shots_fired].zi = cos(Hypot(angle2,Hyp))*speed + fire_zp;
  1887.   }
  1888. }
  1889. void LoadMonster( int ID,float xPosition, float yPosition, float zPosition)
  1890.   Monster[ID].transX = xPosition;
  1891.   Monster[ID].transY = yPosition;
  1892.   Monster[ID].transZ = zPosition;
  1893. if(Monster[ID].trigger == true )
  1894. {   
  1895.   if( Monster[ID].hitStatus == false )
  1896.   {  
  1897. //glPushMatrix();
  1898. //////////// *** NEW *** //////////  START GAME AI ///////////// *** NEW *** ///////////////
  1899. if((xtrans2 - Monster[ID].transX ) > 15) //if on the left, move towards right
  1900. {
  1901. Monster[ID].transXSpeed += 0.5f;
  1902. gameOverOnX = false;
  1903. }else if((Monster[ID].transX - xtrans2) > 15) //if on the right, move towards left
  1904. {
  1905. Monster[ID].transXSpeed -= 0.5f;
  1906. gameOverOnX = false;
  1907. }else
  1908. {
  1909. Monster[ID].transXSpeed = 0.0f; 
  1910. gameOverOnX = true;
  1911. }
  1912. Monster[ID].transX += Monster[ID].transXSpeed;
  1913. glTranslatef(Monster[ID].transX, 0, 0);
  1914. if((ztrans2 - Monster[ID].transZ) > 15) //if on the front, move forwards 
  1915. {
  1916. Monster[ID].transZSpeed += 0.5f;
  1917. gameOverOnZ = false;
  1918. }else if( ( Monster[ID].transZ - ztrans2) > 15) //if on the back, move backwards
  1919. {
  1920. Monster[ID].transZSpeed -= 0.5f; 
  1921. gameOverOnZ = false;
  1922. }else
  1923. {
  1924. Monster[ID].transZSpeed = 0.0f;
  1925. gameOverOnZ = false;
  1926. Monster[ID].transZ += Monster[ID].transZSpeed;
  1927. glTranslatef( 0, 0, Monster[ID].transZ);
  1928. if( gameOverOnX == true && gameOverOnZ == true)
  1929. {
  1930. gameOver = true;
  1931. }else
  1932. {
  1933. gameOver = false;
  1934. }
  1935.  
  1936. //////////// *** NEW *** AI to let Monster face player always *** NEW *** //////////////////// 
  1937. Monster[ID].rotateX = atan ( (ztrans2 - Monster[ID].transZ) / (xtrans2 - Monster[ID].transX + 0.5f) ) / piover180;
  1938. //if degree is in 3rd quadrant
  1939. if( (ztrans2 - Monster[ID].transZ) < 0.0f && (xtrans2 - Monster[ID].transX) < 0.0f ) 
  1940. {
  1941. Monster[ID].XMultiplier = -1.0f;
  1942. }
  1943. //if degree is in 2nd quadrant
  1944. else if( (xtrans2 - Monster[ID].transX) < 0.0f &&  (ztrans2 - Monster[ID].transZ) > 0.0f) 
  1945. {
  1946. Monster[ID].XMultiplier = 0.5f;
  1947. }
  1948. //if degree is in 4th quadrant
  1949. else if( (xtrans2 - Monster[ID].transX) > 0.0f &&  (ztrans2 - Monster[ID].transZ) < 0.0f) 
  1950. {
  1951. Monster[ID].XMultiplier = -1.0f;
  1952. }
  1953. //if degree is in 1st quadrant
  1954. else
  1955. {
  1956. Monster[ID].XMultiplier = 0.0f;
  1957. }
  1958.     // Face the player around the Y-Axis
  1959. glRotatef(Monster[ID].XMultiplier * 90.0f + Monster[ID].rotateX - 135.0f, 0.0f, 1.0f, 0.0f); 
  1960. //////////// *** NEW *** ////////// END GAME AI ///////////// *** NEW *** //////////////////
  1961. if( (atan((Monster[ID].transZ - fire_z)/(Monster[ID].transX - fire_x + 0.5f)) 
  1962.   - atan((ztrans2 -Monster[ID].transZ)/(xtrans2 - Monster[ID].transX + 0.5f)) < 0.0873*2) && //5 degrees in radian
  1963.   (atan((Monster[ID].transZ - fire_z)/(Monster[ID].transX - fire_x + 0.5f))
  1964.   - atan((ztrans2 -Monster[ID].transZ)/(xtrans2 - Monster[ID].transX + 0.5f)) > -0.0873*2) &&
  1965.   isFire == true &&
  1966.   ( (ztrans2 > Monster[ID].transZ && Monster[ID].transZ > fire_z) ||
  1967.      (ztrans2 < Monster[ID].transZ && Monster[ID].transZ < fire_z) ) &&
  1968.   ( (xtrans2 > Monster[ID].transX && Monster[ID].transX > fire_x) ||
  1969.      (xtrans2 < Monster[ID].transX && Monster[ID].transX < fire_x) ))
  1970. {
  1971. Monster[ID].hitCount += 1;
  1972. if( Monster[ID].hitCount == 3)
  1973. {
  1974. Monster[ID].transXSpare = Monster[ID].transX; 
  1975. Monster[ID].transZSpare = Monster[ID].transZ;
  1976. Monster[ID].hitStatus = true;
  1977. }
  1978. }
  1979. glTranslatef( 0, 25.0f, 0); //move the model upwards
  1980. glCallList(MODEL);
  1981. //glPopMatrix(); 
  1982.  }
  1983. else
  1984. glTranslatef( Monster[ID].transXSpare, 25.0f + Monster[ID].fall, Monster[ID].transZSpare);
  1985. glRotatef(Monster[ID].XMultiplier * 90.0f + Monster[ID].rotateX- 135.0f, 0.0f, 1.0f, 0.0f);
  1986.   
  1987. if(ABS(Monster[ID].rotateY) < 89.0f)
  1988. {
  1989. Monster[ID].rotateYSpeed += 1.0f;
  1990. Monster[ID].fall -= 1.01f;
  1991. }else
  1992. {
  1993. Monster[ID].rotateYSpeed = 0.0f;
  1994. }  
  1995. Monster[ID].rotateY += Monster[ID].rotateYSpeed;  
  1996. glRotatef(Monster[ID].rotateY, 1.0f, 0.0f, -1.0f);  // Fall@Rotate the object around the XZ-Axis
  1997. glCallList(MODEL);
  1998. }
  1999. }
  2000. }
  2001. int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
  2002. {
  2003.   glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); // Clear The Screen And The Depth Buffer
  2004.   XP *= 0.8f; 
  2005.   ZP *= 0.8f; 
  2006.   xtrans2 += XP/10;
  2007.   ztrans2 += ZP/10;
  2008.   xtrans = -xtrans2;
  2009.   ztrans = -ztrans2;
  2010.  
  2011.   if( gameOver == false)
  2012.   {
  2013. if(ztrans2>CELL*6 && ztrans2<CELL*7 && 
  2014. xtrans2>CELL*4 && xtrans2<CELL*5)
  2015. Collision11(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2016. }
  2017. else if(ztrans2>CELL*6 && ztrans2<CELL*7 && 
  2018. xtrans2>CELL*3 && xtrans2<CELL*4) 
  2019. {
  2020. Collision21(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2021. }
  2022. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  2023. xtrans2>CELL*3 && xtrans2<CELL*4) 
  2024. {
  2025. Collision22(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2026. }
  2027. else if(ztrans2>CELL*4 && ztrans2<CELL*5 && 
  2028. xtrans2>CELL*3 && xtrans2<CELL*4) 
  2029. {
  2030. Collision23(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2031. }
  2032. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  2033. xtrans2>CELL*3 && xtrans2<CELL*4)
  2034. {
  2035. Collision24(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2036. }
  2037. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  2038. xtrans2>CELL*2 && xtrans2<CELL*3)
  2039. {
  2040. Collision32(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2041. }
  2042. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  2043. xtrans2>CELL*2 && xtrans2<CELL*3)
  2044. {
  2045. Collision34(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2046. }
  2047. else if(ztrans2>CELL*2 && ztrans2<CELL*3 && 
  2048. xtrans2>CELL*2 && xtrans2<CELL*3)
  2049. {
  2050. Collision35(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2051. }
  2052. else if(ztrans2>CELL && ztrans2<CELL*2 && 
  2053. xtrans2>CELL*2 && xtrans2<CELL*3)
  2054. {
  2055. Collision36(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2056. }
  2057. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  2058. xtrans2>CELL && xtrans2<CELL*2)
  2059. {
  2060. Collision42(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2061. }
  2062. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  2063. xtrans2>CELL && xtrans2<CELL*2)
  2064. {
  2065. Collision44(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2066. }
  2067. else if(ztrans2>CELL && ztrans2<CELL*2 && 
  2068. xtrans2>CELL && xtrans2<CELL*2)
  2069. {
  2070. Collision46(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2071. }
  2072. else if(ztrans2>0 && ztrans2<CELL && 
  2073. xtrans2>CELL && xtrans2<CELL*2)
  2074. {
  2075. Collision47(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2076. }
  2077. else if(ztrans2>CELL*5 && ztrans2<CELL*6 && 
  2078. xtrans2>0 && xtrans2<CELL)
  2079. {
  2080. Collision52(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2081. }
  2082. else if(ztrans2>CELL*4 && ztrans2<CELL*5 && 
  2083. xtrans2>0 && xtrans2<CELL)
  2084. {
  2085. Collision53(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2086. }
  2087. else if(ztrans2>CELL*3 && ztrans2<CELL*4 && 
  2088. xtrans2>0 && xtrans2<CELL)
  2089. {
  2090. Collision54(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2091. }
  2092. else if(ztrans2>CELL*2 && ztrans2<CELL*3 && 
  2093. xtrans2>0 && xtrans2<CELL)
  2094. {
  2095. Collision55(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2096. }
  2097. else if(ztrans2>CELL && ztrans2<CELL*2 && 
  2098. xtrans2>0 && xtrans2<CELL)
  2099. {
  2100. Collision56(xtrans2, ytrans2, ztrans2, XP, BlankNum, ZP, 5.0f, 0);
  2101. }
  2102.   zprot*=.9f;
  2103.   _heading += zprot;
  2104.   heading = mouse_3d_x + _heading;
  2105.     
  2106.   yrot = heading;
  2107.   sceneroty = 360.0f - yrot;
  2108.   glLoadIdentity();
  2109.   m16_kicki += -m16_kick/50;
  2110.   m16_kick += m16_kicki/10;
  2111.   m16_kicki *= .8f;
  2112.   m16_kick *= .9f;
  2113.   if (m16_kick != 0)
  2114.   {
  2115.     glRotated(-m16_kick,1,0,0);
  2116.     glTranslatef(0,0,-m16_kick);
  2117.   }
  2118.   glLoadIdentity();
  2119.   glRotated(mouse_3d_y,1.f,0,0);
  2120.   glRotated(sceneroty,0,1.f,0); 
  2121.   glTranslated(xtrans, -25 ,ztrans); // Player position
  2122.   glDisable(GL_BLEND);
  2123.   for(int i=0; i<18; i++)
  2124.   {
  2125. glCallList(ROOM[i]);
  2126.   }
  2127.   glEnable(GL_BLEND);
  2128. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2129.   LoadMonster(0, CELL*4 + 20.0f, 0.0, CELL*6 + 20.0f);
  2130.   if(xtrans2 > CELL*3 && xtrans2 < CELL*5 &&
  2131.   ztrans2 > CELL*6 && ztrans2 < CELL*7 )
  2132.   {   
  2133.   Monster[0].trigger = true;
  2134.   }else
  2135.   {
  2136.   Monster[0].trigger = false;
  2137.   }
  2138.   LoadMonster(1, CELL*2 + 20.0f, 0.0, CELL*5 + 20.0f);
  2139.   if(xtrans2 > 0 && xtrans2 < CELL*4 &&
  2140.   ztrans2 > CELL*5 && ztrans2 < CELL*6 )
  2141.   {   
  2142.   Monster[1].trigger = true;
  2143.   }else
  2144.   {
  2145.   Monster[1].trigger = false;
  2146.   }
  2147.   LoadMonster(2, 20.0f, 0.0, CELL*4 + 20.0f);
  2148.   if(xtrans2 > 0 && xtrans2 < CELL &&
  2149.   ztrans2 > CELL*4 && ztrans2 < CELL*5 )
  2150.   {
  2151.   Monster[2].trigger = true;
  2152.   }else
  2153.   {
  2154.   Monster[2].trigger = false;
  2155.   }
  2156.   LoadMonster(3, CELL*2 + 20.0f, 0.0, CELL*2 + 20.0f);
  2157.   if(xtrans2 > CELL*2 && xtrans2 < CELL*3 &&
  2158.   ztrans2 > CELL && ztrans2 < CELL*4 )
  2159.   {
  2160.   Monster[3].trigger = true;
  2161.   }else
  2162.   {
  2163.   Monster[3].trigger = false;
  2164.   }
  2165.   LoadMonster(4, 20.0f, 0.0, CELL*2 + 20.0f);
  2166.   if(xtrans2 > 0 && xtrans2 < CELL &&
  2167.   ztrans2 > CELL && ztrans2 < CELL*4 )
  2168.   {
  2169.   Monster[4].trigger = true;
  2170.   }else
  2171.   {
  2172.   Monster[4].trigger = false;
  2173.   }
  2174.   LoadMonster(5, CELL + 20.0f, 0.0, 20.0f);
  2175.   if(xtrans2 > CELL && xtrans2 < CELL*2 &&
  2176.   ztrans2 > 0 && ztrans2 < CELL*2 )
  2177.   {
  2178.   Monster[5].trigger = true;
  2179.   }else
  2180.   {
  2181.   Monster[5].trigger = false;
  2182.   } 
  2183. //////////// *** NEW *** ////////// GAME AI ///////////// *** NEW *** ////////////////////
  2184. // Determine if you have fired a weapon
  2185.   if (isFire)
  2186.   {
  2187.     PlaySound("Data/rifle.WAV", NULL, SND_ASYNC);
  2188.     m16_kicki = 1;
  2189.     
  2190.     shots_fired++;
  2191.     if (shots_fired > MAX_SHOTS_FIRED-1) shots_fired = 0;
  2192.     isFireComplete = false;
  2193.     isFire = false;
  2194.     fire_x = -xtrans;
  2195.     fire_y = 10;
  2196.     fire_z = -ztrans;
  2197.     fire_xp = -(GLdouble)sin(heading*piover180) / 5;
  2198.     fire_yp = -(GLdouble)tan(mouse_3d_y*piover180) / 5;
  2199.     fire_zp = -(GLdouble)cos(heading*piover180) / 5;
  2200.   }
  2201.   int fire_counter = 0;
  2202.   // Begin calculations for the projectile
  2203.   while (!isFireComplete)
  2204.   {     
  2205.     fire_counter++;
  2206.     fire_x += fire_xp;
  2207.     fire_y += fire_yp;
  2208.     fire_z += fire_zp;
  2209.       
  2210.     if (CollisionAll(fire_x,  fire_y,  fire_z, BlankNum, BlankNum, BlankNum, 0, 0))
  2211.     {
  2212.       isFireComplete = true;
  2213.       Ricochet();
  2214.       isRicochet = true; 
  2215.     }
  2216.     else if (fire_counter > 10000)
  2217.     {
  2218.       isFireComplete = true;
  2219.     } 
  2220.   } 
  2221. // Determine if it was the M16 that was fired.
  2222.   if (isRicochet)
  2223.   {   
  2224.     int i;
  2225.     bool isRicochetComplete = true;
  2226.     glDisable(GL_TEXTURE_2D);
  2227.     glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  2228.     for (int j = 0; j < MAX_SHOTS_FIRED; j++)
  2229.     {
  2230.       for (i = 8; i < MAX_PARTICLES; i++)
  2231.       {
  2232.         if (particle[i][j].life > 0)
  2233.         {
  2234.           isRicochetComplete = false;
  2235.           particle[i][j].x += particle[i][j].xi;
  2236.           particle[i][j].y += particle[i][j].yi;
  2237.           particle[i][j].z += particle[i][j].zi;
  2238.           CollisionAll(particle[i][j].x,  particle[i][j].y,  particle[i][j].z,
  2239.                           particle[i][j].xi, particle[i][j].yi, particle[i][j].zi, 0, .75f);
  2240.           particle[i][j].yi -= .01f;  // cheap simulated gravity
  2241.           particle[i][j].xi *= .99;
  2242.           particle[i][j].yi *= .99;
  2243.           particle[i][j].zi *= .99;
  2244.           particle[i][j].life -= particle[i][j].fade;
  2245.         
  2246.           glLoadIdentity();
  2247.           glRotated(mouse_3d_y,1.f,0,0);
  2248.           glRotated(sceneroty,0,1.f,0);
  2249.           glTranslated(xtrans,-10,ztrans);  
  2250.           glTranslated(particle[i][j].x,particle[i][j].y,particle[i][j].z);
  2251.           glRotated(-sceneroty,0,1.f,0);
  2252.           glRotated(-mouse_3d_y,1.f,0,0);
  2253.           particle[i][j].triangle_rotate_x += particle[i][j].triangle_rotate_xi;
  2254.           particle[i][j].triangle_rotate_y += particle[i][j].triangle_rotate_yi;
  2255.           particle[i][j].triangle_rotate_z += particle[i][j].triangle_rotate_zi;
  2256.           particle[i][j].triangle_rotate_xi -= particle[i][j].fade;
  2257.           particle[i][j].triangle_rotate_yi -= particle[i][j].fade;
  2258.           particle[i][j].triangle_rotate_zi -= particle[i][j].fade;
  2259.           glRotated(particle[i][j].triangle_rotate_x,1,0,0);
  2260.           glRotated(particle[i][j].triangle_rotate_y,0,1,0);
  2261.           glRotated(particle[i][j].triangle_rotate_z,0,0,1);
  2262.           glColor4d(0,0,0,particle[i][j].life);
  2263.           glBegin(GL_TRIANGLES);
  2264.           glVertex3d(particle[i][j].triangle_x1, particle[i][j].triangle_y1, particle[i][j].triangle_z1);
  2265.           glVertex3d(particle[i][j].triangle_x2, particle[i][j].triangle_y2, particle[i][j].triangle_z2);
  2266.           glVertex3d(particle[i][j].triangle_x3, particle[i][j].triangle_y3, particle[i][j].triangle_z3);
  2267.           glEnd();
  2268.         }
  2269.       }
  2270.     }
  2271.     glEnable(GL_TEXTURE_2D);
  2272.     glDisable(GL_DEPTH_TEST);
  2273.     glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  2274.     glBindTexture(GL_TEXTURE_2D, texture[3]);
  2275.     // Display particles of the ricochet from the M16
  2276.     for (j = 0; j < MAX_SHOTS_FIRED; j++)
  2277.     {
  2278.       for (i = 0; i < 8; i++)
  2279.       {     
  2280.         if (particle[i][j].life > 0)
  2281.         {
  2282.           isRicochetComplete = false;
  2283.           particle[i][j].x += particle[i][j].xi/2;
  2284.           particle[i][j].y += particle[i][j].yi/2;
  2285.           particle[i][j].z += particle[i][j].zi/2;
  2286.           particle[i][j].yi += .01f;
  2287.           particle[i][j].xi *= .9f;
  2288.           particle[i][j].yi *= .9f;
  2289.           particle[i][j].zi *= .9f;
  2290.         
  2291.           particle[i][j].life -= particle[i][j].fade/2;
  2292.           glLoadIdentity();
  2293.           glRotated(mouse_3d_y,1.f,0,0);
  2294.           glRotated(sceneroty,0,1.f,0);
  2295.           glTranslated(xtrans,-10,ztrans);       
  2296.           glTranslated(particle[i][j].x,particle[i][j].y,particle[i][j].z);
  2297.           glRotated(-sceneroty,0,1.f,0);
  2298.           glRotated(-mouse_3d_y,1.f,0,0);
  2299.           glColor4d(.18f,.17f,.15f,particle[i][j].life);
  2300.           glBegin(GL_QUADS);
  2301.           glTexCoord2d(1,1); glVertex3d( particle[i][j].size, particle[i][j].size,0);
  2302.           glTexCoord2d(1,0); glVertex3d( particle[i][j].size,-particle[i][j].size,0);
  2303.           glTexCoord2d(0,0); glVertex3d(-particle[i][j].size,-particle[i][j].size,0);
  2304.           glTexCoord2d(0,1); glVertex3d(-particle[i][j].size, particle[i][j].size,0);
  2305.           glEnd();
  2306.         }  
  2307.       }
  2308.     }
  2309.     glEnable(GL_DEPTH_TEST);
  2310.     if (isRicochetComplete)
  2311.       isRicochet = false;
  2312.   }
  2313. // Crosshair  
  2314.   glDisable(GL_DEPTH_TEST);
  2315.   glLoadIdentity();
  2316.   glTranslated(0.0f,0.0f,-35.0f);   
  2317.   glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  2318.   glColor4f(1,1,1,1);
  2319.   glBindTexture(GL_TEXTURE_2D,texture[2]);
  2320.   glBegin(GL_QUADS);
  2321.   glTexCoord2d(1,1); glVertex2f(1,1);
  2322.   glTexCoord2d(1,0); glVertex2f(1,-1);
  2323.   glTexCoord2d(0,0); glVertex2f(-1,-1);
  2324.   glTexCoord2d(0,1); glVertex2f(-1,1);
  2325.   glEnd(); 
  2326.   
  2327. glDisable(GL_DEPTH_TEST);   
  2328. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  2329. glColor4d(1,1,1,1);
  2330. glPrint(150,250,1,"Distance: %4.0f", Hypot( (xtrans2-CELL*3/2.0), (ztrans2-5.0) ) );
  2331. for( int k=0; k<6;k++)
  2332. {
  2333. if( Monster[k].trigger == true && Monster[k].hitCount < 3)
  2334. {
  2335. glColor4d(1,0,0,1);
  2336. glPrint(150,230,1,"ALERT!");
  2337. }
  2338. if( xtrans2 - Monster[k].transX < 15.0&& Monster[k].hitCount < 3)
  2339. {
  2340. glColor4d(1,0,0,1);
  2341. glPrint(150,230,1,"ALERT!");
  2342. }
  2343. }
  2344. glColor4d(1,1,1,1);
  2345. glEnable(GL_DEPTH_TEST);
  2346. glDisable(GL_TEXTURE_2D);
  2347.     glEnable(GL_TEXTURE_2D);
  2348. //  ESTABLISH A FPS FRAMERATE COUNTER
  2349.   if (isFPS)
  2350.   { 
  2351.     glDisable(GL_DEPTH_TEST);
  2352.     frames++;    
  2353.     if (frames%10 == 0) 
  2354.     {
  2355.       Time2 = TimerGetTime()/1000;
  2356.       DiffTime = ABS(Time2-Time1);      
  2357.       Time1 = TimerGetTime()/1000;     
  2358.       if (DiffTime != 0)
  2359.       FPS = 10/(DiffTime);
  2360.     }             
  2361.     
  2362. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  2363.     glColor4d(1,1,1,1);
  2364. glPrint(-350,250,1,"FPS: %4.0f", FPS);
  2365.   
  2366. glPrint(-350,230,1,"transX[0]: %4.2f C", Monster[0].transX);
  2367. glPrint(-350,210,1,"transZ[0]: %4.2f C", Monster[0].transZ);
  2368. glPrint(-350,190,1,"(xtrans2-transX): %4.2f", (xtrans2-Monster[0].transX) );
  2369. glPrint(-350,170,1,"xtrans2: %4.2f C", xtrans2/CELL);
  2370. glPrint(-350,150,1,"ztrans2: %4.2f C", ztrans2/CELL);
  2371. glPrint(-350,130,1,"(ztrans2-transZ): %4.2f", (ztrans2-Monster[0].transZ) );
  2372. glPrint(-350,110,1,"rotateX@atan: %4.2f", Monster[0].rotateX );
  2373. glPrint(-350,90,1,"multiplier+atan: %4.2f", Monster[0].XMultiplier*90.0f+Monster[0].rotateX-135.0f);
  2374. glPrint(-350,70,1,"fire_x: %4.2f C", fire_x/CELL );
  2375. glPrint(-350,50,1,"fire_y: %4.2f C", fire_y/CELL );
  2376. glPrint(-350,30,1,"fire_z: %4.2f C", fire_z/CELL );
  2377. glPrint(-350,10,1,"deg(M-H): %4.2f", atan((Monster[0].transZ - fire_z)/(Monster[0].transX - fire_x + 0.5f))/ piover180 );
  2378. glPrint(-350,-10,1,"deg(P-M): %4.2f", atan((ztrans2 -Monster[0].transZ)/(xtrans2 - Monster[0].transX + 0.5f))/ piover180);
  2379. glPrint(-350,-30,1,"condition[0]: %4.2f", atan((Monster[0].transZ - fire_z)/(Monster[0].transX - fire_x + 0.5f))/ piover180
  2380. - atan((ztrans2 -Monster[0].transZ)/(xtrans2 - Monster[0].transX + 0.5f))/ piover180);
  2381. glPrint(-350,-50,1,"[0]hit %2.0d", Monster[0].hitCount);
  2382. if( Monster[0].hitStatus == true )
  2383. {
  2384. glPrint(-350,-70,1,"[0]dead");
  2385. }
  2386. glPrint(-350,-90,1,"transX[1]: %4.2f C", Monster[1].transX/CELL);
  2387. glPrint(-350,-110,1,"transZ[1]: %4.2f C", Monster[1].transZ/CELL);
  2388. glPrint(-350,-130,1,"condition[1]: %4.2f", atan((Monster[1].transZ - fire_z)/(Monster[1].transX - fire_x + 0.5f))/ piover180
  2389. - atan((ztrans2 -Monster[1].transZ)/(xtrans2 - Monster[1].transX + 0.5f))/ piover180);
  2390. glPrint(-350,-150,1,"[1]hit %2.0d", Monster[1].hitCount);
  2391. if( Monster[1].hitStatus == true )
  2392. {
  2393. glPrint(-350,-170,1,"[1]dead");
  2394. }
  2395. glPrint(0,110,1,"transX[2]: %4.2f C", Monster[2].transX/CELL);
  2396. glPrint(0,90,1,"transZ[2]: %4.2f C", Monster[2].transZ/CELL);
  2397. glPrint(0,70,1,"condition[2]: %4.2f", atan((Monster[2].transZ - fire_z)/(Monster[2].transX - fire_x + 0.5f))/ piover180
  2398. - atan((ztrans2 -Monster[2].transZ)/(xtrans2 - Monster[2].transX + 0.5f))/ piover180);
  2399. glPrint(0,50,1,"[2]hit %2.0d", Monster[2].hitCount);
  2400. if( Monster[2].hitStatus == true )
  2401. {
  2402. glPrint(0,30,1,"[2]dead");
  2403. }
  2404. glPrint(0,10,1,"transX[3]: %4.2f C", Monster[3].transX/CELL);
  2405. glPrint(0,-10,1,"transZ[3]: %4.2f C", Monster[3].transZ/CELL);
  2406. glPrint(0,-30,1,"condition[3]: %4.2f", atan((Monster[3].transZ - fire_z)/(Monster[3].transX - fire_x + 0.5f))/ piover180
  2407. - atan((ztrans2 -Monster[3].transZ)/(xtrans2 - Monster[3].transX + 0.5f))/ piover180);
  2408. glPrint(0,-50,1,"[3]hit %2.0d", Monster[3].hitCount);
  2409. if( Monster[3].hitStatus == true )
  2410. {
  2411. glPrint(0,-70,1,"[3]dead");
  2412. }
  2413. glPrint(0,-90,1,"transX[4]: %4.2f C", Monster[4].transX/CELL);
  2414. glPrint(0,-110,1,"transZ[4]: %4.2f C", Monster[4].transZ/CELL);
  2415. glPrint(0,-130,1,"condition[4]: %4.2f", atan((Monster[4].transZ - fire_z)/(Monster[4].transX - fire_x + 0.5f))/ piover180
  2416. - atan((ztrans2 -Monster[4].transZ)/(xtrans2 - Monster[4].transX + 0.5f))/ piover180);
  2417. glPrint(0,-150,1,"[4]hit %2.0d", Monster[4].hitCount);
  2418. if( Monster[4].hitStatus == true )
  2419. {
  2420. glPrint(0,-170,1,"[4]dead");
  2421. }
  2422. glPrint(0,-190,1,"transX[5]: %4.2f C", Monster[5].transX/CELL);
  2423. glPrint(0,-210,1,"transZ[5]: %4.2f C", Monster[5].transZ/CELL);
  2424. glPrint(0,-230,1,"condition[5]: %4.2f", atan((Monster[5].transZ - fire_z)/(Monster[5].transX - fire_x + 0.5f))/ piover180
  2425. - atan((ztrans2 -Monster[5].transZ)/(xtrans2 - Monster[5].transX + 0.5f))/ piover180);
  2426. glPrint(0,-250,1,"[5]hit %2.0d", Monster[5].hitCount);
  2427. if( Monster[5].hitStatus == true )
  2428. {
  2429. glPrint(0,-270,1,"[5]dead");
  2430. }
  2431. glEnable(GL_DEPTH_TEST);           
  2432.     glDisable(GL_TEXTURE_2D);
  2433.     glEnable(GL_TEXTURE_2D);
  2434.   }
  2435. }else
  2436. {
  2437. glDisable(GL_DEPTH_TEST);   
  2438. glBindTexture(GL_TEXTURE_2D, textures[0].texID); // Select Our Font Texture
  2439. glColor4d(1,1,1,1);
  2440. glPrint(150,190,1,"Game Over!");
  2441. glEnable(GL_DEPTH_TEST);
  2442. glDisable(GL_TEXTURE_2D);
  2443.     glEnable(GL_TEXTURE_2D);
  2444. }
  2445.   return TRUE; // Keep Going
  2446. }
  2447. GLvoid KillGLWindow(GLvoid) // Properly Kill The Window
  2448. {
  2449. // When we are done, we need to free all the model data
  2450. // We do this by walking through all the objects and freeing their information
  2451. // Go through all the objects in the scene
  2452. for(int i = 0; i < g_3DModel.numOfObjects; i++)
  2453. {
  2454. // Free the faces, normals, vertices, and texture coordinates.
  2455. if(g_3DModel.pObject[i].pFaces) delete [] g_3DModel.pObject[i].pFaces;
  2456. if(g_3DModel.pObject[i].pNormals) delete [] g_3DModel.pObject[i].pNormals;
  2457. if(g_3DModel.pObject[i].pVerts) delete [] g_3DModel.pObject[i].pVerts;
  2458. if(g_3DModel.pObject[i].pTexVerts) delete [] g_3DModel.pObject[i].pTexVerts;
  2459. }
  2460. KillFont();
  2461. if (hRC) // Do We Have A Rendering Context?
  2462. {
  2463. if (!wglMakeCurrent(NULL,NULL)) // Are We Able To Release The DC And RC Contexts?
  2464. {
  2465. MessageBox(NULL,"Release Of DC And RC Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  2466. }
  2467. if (!wglDeleteContext(hRC)) // Are We Able To Delete The RC?
  2468. {
  2469. MessageBox(NULL,"Release Rendering Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  2470. }
  2471. hRC=NULL; // Set RC To NULL
  2472. }
  2473. if (hDC && !ReleaseDC(hWnd,hDC)) // Are We Able To Release The DC
  2474. {
  2475. MessageBox(NULL,"Release Device Context Failed.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  2476. hDC=NULL; // Set DC To NULL
  2477. }
  2478. if (hWnd && !DestroyWindow(hWnd)) // Are We Able To Destroy The Window?
  2479. {
  2480. MessageBox(NULL,"Could Not Release hWnd.","SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
  2481. hWnd=NULL; // Set hWnd To NULL
  2482. }
  2483. if (fullscreen) // Are We In Fullscreen Mode?
  2484. {
  2485. ChangeDisplaySettings(NULL,0); // If So Switch Back To The Desktop
  2486. ShowCursor(TRUE); // Show Mouse Pointer
  2487. }
  2488. }
  2489. /* This Code Creates Our OpenGL Window.  Parameters Are: *
  2490.  * title - Title To Appear At The Top Of The Window *
  2491.  * width - Width Of The GL Window Or Fullscreen Mode *
  2492.  * height - Height Of The GL Window Or Fullscreen Mode *
  2493.  * bits - Number Of Bits To Use For Color (8/16/24/32) *
  2494.  * fullscreenflag - Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE) */
  2495.  
  2496. BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
  2497. {
  2498. GLuint PixelFormat; // Holds The Results After Searching For A Match
  2499. WNDCLASS wc; // Windows Class Structure
  2500. DWORD dwExStyle; // Window Extended Style
  2501. DWORD dwStyle; // Window Style
  2502. RECT WindowRect; // Grabs Rectangle Upper Left / Lower Right Values
  2503. WindowRect.left=(long)0; // Set Left Value To 0
  2504. WindowRect.right=(long)width; // Set Right Value To Requested Width
  2505. WindowRect.top=(long)0; // Set Top Value To 0
  2506. WindowRect.bottom=(long)height; // Set Bottom Value To Requested Height
  2507. fullscreen=fullscreenflag; // Set The Global Fullscreen Flag
  2508. hInstance = GetModuleHandle(NULL); // Grab An Instance For Our Window
  2509. wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraw On Size, And Own DC For Window.
  2510. wc.lpfnWndProc = (WNDPROC) WndProc; // WndProc Handles Messages
  2511. wc.cbClsExtra = 0; // No Extra Window Data
  2512. wc.cbWndExtra = 0; // No Extra Window Data
  2513. wc.hInstance = hInstance; // Set The Instance
  2514. wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); // Load The Default Icon
  2515. wc.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer
  2516. wc.hbrBackground = NULL; // No Background Required For GL
  2517. wc.lpszMenuName = NULL; // We Don't Want A Menu
  2518. wc.lpszClassName = "OpenGL"; // Set The Class Name
  2519. if (!RegisterClass(&wc)) // Attempt To Register The Window Class
  2520. {
  2521. MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2522. return FALSE; // Return FALSE
  2523. }
  2524. if (fullscreen) // Attempt Fullscreen Mode?
  2525. {
  2526. DEVMODE dmScreenSettings; // Device Mode
  2527. memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared
  2528. dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure
  2529. dmScreenSettings.dmPelsWidth = width; // Selected Screen Width
  2530. dmScreenSettings.dmPelsHeight = height; // Selected Screen Height
  2531. dmScreenSettings.dmBitsPerPel = bits; // Selected Bits Per Pixel
  2532. dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
  2533. // Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.
  2534. if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
  2535. {
  2536. // If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.
  2537. if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported BynYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
  2538. {
  2539. fullscreen=FALSE; // Windowed Mode Selected.  Fullscreen = FALSE
  2540. }
  2541. else
  2542. {
  2543. // Pop Up A Message Box Letting User Know The Program Is Closing.
  2544. MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
  2545. return FALSE; // Return FALSE
  2546. }
  2547. }
  2548. }
  2549. if (fullscreen) // Are We Still In Fullscreen Mode?
  2550. {
  2551. dwExStyle=WS_EX_APPWINDOW; // Window Extended Style
  2552. dwStyle=WS_POPUP; // Windows Style
  2553. ShowCursor(FALSE); // Hide Mouse Pointer
  2554. }
  2555. else
  2556. {
  2557. dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style
  2558. dwStyle=WS_OVERLAPPEDWINDOW; // Windows Style
  2559. }
  2560. AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); // Adjust Window To True Requested Size
  2561. // Create The Window
  2562. if (!(hWnd=CreateWindowEx( dwExStyle, // Extended Style For The Window
  2563. "OpenGL", // Class Name
  2564. title, // Window Title
  2565. dwStyle | // Defined Window Style
  2566. WS_CLIPSIBLINGS | // Required Window Style
  2567. WS_CLIPCHILDREN, // Required Window Style
  2568. 0, 0, // Window Position
  2569. WindowRect.right-WindowRect.left, // Calculate Window Width
  2570. WindowRect.bottom-WindowRect.top, // Calculate Window Height
  2571. NULL, // No Parent Window
  2572. NULL, // No Menu
  2573. hInstance, // Instance
  2574. NULL))) // Dont Pass Anything To WM_CREATE
  2575. {
  2576. KillGLWindow(); // Reset The Display
  2577. MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2578. return FALSE; // Return FALSE
  2579. }
  2580. static PIXELFORMATDESCRIPTOR pfd= // pfd Tells Windows How We Want Things To Be
  2581. {
  2582. sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
  2583. 1, // Version Number
  2584. PFD_DRAW_TO_WINDOW | // Format Must Support Window
  2585. PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
  2586. PFD_DOUBLEBUFFER, // Must Support Double Buffering
  2587. PFD_TYPE_RGBA, // Request An RGBA Format
  2588. bits, // Select Our Color Depth
  2589. 0, 0, 0, 0, 0, 0, // Color Bits Ignored
  2590. 0, // No Alpha Buffer
  2591. 0, // Shift Bit Ignored
  2592. 0, // No Accumulation Buffer
  2593. 0, 0, 0, 0, // Accumulation Bits Ignored
  2594. 16, // 16Bit Z-Buffer (Depth Buffer)  
  2595. 0, // No Stencil Buffer
  2596. 0, // No Auxiliary Buffer
  2597. PFD_MAIN_PLANE, // Main Drawing Layer
  2598. 0, // Reserved
  2599. 0, 0, 0 // Layer Masks Ignored
  2600. };
  2601. if (!(hDC=GetDC(hWnd))) // Did We Get A Device Context?
  2602. {
  2603. KillGLWindow(); // Reset The Display
  2604. MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2605. return FALSE; // Return FALSE
  2606. }
  2607. if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd))) // Did Windows Find A Matching Pixel Format?
  2608. {
  2609. KillGLWindow(); // Reset The Display
  2610. MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2611. return FALSE; // Return FALSE
  2612. }
  2613. if(!SetPixelFormat(hDC,PixelFormat,&pfd)) // Are We Able To Set The Pixel Format?
  2614. {
  2615. KillGLWindow(); // Reset The Display
  2616. MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2617. return FALSE; // Return FALSE
  2618. }
  2619. if (!(hRC=wglCreateContext(hDC))) // Are We Able To Get A Rendering Context?
  2620. {
  2621. KillGLWindow(); // Reset The Display
  2622. MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2623. return FALSE; // Return FALSE
  2624. }
  2625. if(!wglMakeCurrent(hDC,hRC)) // Try To Activate The Rendering Context
  2626. {
  2627. KillGLWindow(); // Reset The Display
  2628. MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2629. return FALSE; // Return FALSE
  2630. }
  2631. ShowWindow(hWnd,SW_SHOW); // Show The Window
  2632. SetForegroundWindow(hWnd); // Slightly Higher Priority
  2633. SetFocus(hWnd); // Sets Keyboard Focus To The Window
  2634. ReSizeGLScene(width, height); // Set Up Our Perspective GL Screen
  2635. if (!InitGL()) // Initialize Our Newly Created GL Window
  2636. {
  2637. KillGLWindow(); // Reset The Display
  2638. MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
  2639. return FALSE; // Return FALSE
  2640. }
  2641. return TRUE; // Success
  2642. }
  2643. LRESULT CALLBACK WndProc( HWND hWnd, // Handle For This Window
  2644. UINT uMsg, // Message For This Window
  2645. WPARAM wParam, // Additional Message Information
  2646. LPARAM lParam) // Additional Message Information
  2647. {
  2648. if (uMsg == WM_MOUSEMOVE)
  2649. {
  2650. if (LOWORD(lParam) > 370) SetCursorPos(10,(int)mouse_y), mouse_wrap_x--;
  2651. else if (LOWORD(lParam) < 10) SetCursorPos(370,(int)mouse_y), mouse_wrap_x++;
  2652. if (HIWORD(lParam) > 370) SetCursorPos((int)mouse_x,10), mouse_wrap_x--;
  2653. else if (HIWORD(lParam) < 10) SetCursorPos((int)mouse_x,370), mouse_wrap_x++;
  2654. if (ABS(mouse_x-LOWORD(lParam)) > 300)
  2655. {
  2656. if (mouse_x > 360/2)
  2657. mouse_3d_x += ((mouse_x-360)-LOWORD(lParam))/sensitivity;
  2658. else if (LOWORD(lParam) > 360/2)
  2659. mouse_3d_x += (mouse_x-(LOWORD(lParam)-360))/sensitivity;
  2660. }
  2661. else
  2662. mouse_3d_x += (mouse_x-LOWORD(lParam))/sensitivity;
  2663. if (mouse_3d_x > 360) mouse_3d_x = 0;
  2664. else if (mouse_3d_x < 0) mouse_3d_x = 360;
  2665. if (invert_mouse)
  2666. {
  2667. if (ABS(mouse_y-HIWORD(lParam)) > 300)
  2668. if (mouse_y > 360/2)
  2669. mouse_3d_y -= (HIWORD(lParam)-(mouse_y-360))/sensitivity;
  2670. else if (LOWORD(lParam) > 360/2)
  2671. mouse_3d_y -= ((HIWORD(lParam)-360)-mouse_y)/sensitivity;
  2672. }
  2673. else
  2674. mouse_3d_y -= (HIWORD(lParam)-mouse_y)/sensitivity;
  2675. }
  2676. else
  2677. {
  2678. if (ABS(mouse_y-HIWORD(lParam)) > 300)
  2679. if (mouse_y > 360/2)
  2680. mouse_3d_y -= ((mouse_y-360)-HIWORD(lParam))/sensitivity;
  2681. else if (LOWORD(lParam) > 360/2)
  2682. mouse_3d_y -= (mouse_y-(HIWORD(lParam)-360))/sensitivity;
  2683. }
  2684. else
  2685. mouse_3d_y -= (mouse_y-HIWORD(lParam))/sensitivity;
  2686. }
  2687. if (mouse_3d_x > 360) mouse_3d_x = 0;
  2688. else if (mouse_3d_x < 0) mouse_3d_x = 360;
  2689. if (mouse_3d_y > 85) mouse_3d_y = 85;
  2690. else if (mouse_3d_y < -85) mouse_3d_y = -85;
  2691. mouse_x = LOWORD(lParam);          
  2692. mouse_y = HIWORD(lParam);
  2693. }
  2694. else if (uMsg == WM_LBUTTONDOWN)
  2695. {     
  2696. isFire = true;
  2697. }
  2698. else if (uMsg == WM_ACTIVATE) // Watch For Window Activate Message
  2699. {
  2700. if (!HIWORD(wParam)) // Check Minimization State
  2701. {
  2702. active=TRUE; // Program Is Active
  2703. }
  2704. else
  2705. {
  2706. active=FALSE; // Program Is No Longer Active
  2707. }
  2708. }
  2709.         
  2710. else if (uMsg == WM_SYSCOMMAND) // Intercept System Commands
  2711. {
  2712. switch (wParam) // Check System Calls
  2713. {
  2714. case SC_SCREENSAVE: // Screensaver Trying To Start?
  2715. case SC_MONITORPOWER: // Monitor Trying To Enter Powersave?
  2716. return 0; // Prevent From Happening
  2717. }
  2718. }
  2719.         
  2720. else if (uMsg == WM_CLOSE) // Did We Receive A Close Message?
  2721. {
  2722.  PostQuitMessage(0); // Send A Quit Message
  2723. }
  2724.         
  2725. else if (uMsg == WM_KEYDOWN) // Is A Key Being Held Down?
  2726. {
  2727. keys[wParam] = TRUE; // If So, Mark It As TRUE
  2728. }
  2729.         
  2730. else if (uMsg == WM_KEYUP) // Has A Key Been Released?
  2731. {
  2732. keys[wParam] = FALSE; // If So, Mark It As FALSE
  2733. }
  2734.         
  2735. else if (uMsg == WM_SIZE) // Resize The OpenGL Window
  2736. {
  2737. ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width, HiWord=Height
  2738. }        
  2739. // Pass All Unhandled Messages To DefWindowProc
  2740. return DefWindowProc(hWnd,uMsg,wParam,lParam);
  2741. }
  2742. int is_Fired = 0; 
  2743. int WINAPI WinMain( HINSTANCE hInstance, // Instance
  2744. HINSTANCE hPrevInstance, // Previous Instance
  2745. LPSTR lpCmdLine, // Command Line Parameters
  2746. int nCmdShow) // Window Show State
  2747. {
  2748. MSG msg; // Windows Message Structure
  2749. BOOL done=FALSE; // Bool Variable To Exit Loop
  2750. // Ask The User Which Screen Mode They Prefer
  2751. if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode(Support Mouse Movement)?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
  2752. {
  2753. fullscreen=FALSE; // Windowed Mode
  2754. }
  2755. // Create Our OpenGL Window
  2756. if (!CreateGLWindow("First Person Shooter",640,480,16,fullscreen))
  2757. {
  2758. return 0; // Quit If Window Was Not Created
  2759. }
  2760. while(!done) // Loop That Runs While done=FALSE
  2761. {
  2762. if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Is There A Message Waiting?
  2763. {
  2764. if (msg.message==WM_QUIT) // Have We Received A Quit Message?
  2765. {
  2766. done=TRUE; // If So done=TRUE
  2767. }
  2768. else // If Not, Deal With Window Messages
  2769. {
  2770. TranslateMessage(&msg); // Translate The Message
  2771. DispatchMessage(&msg); // Dispatch The Message
  2772. }
  2773. }
  2774. else // If There Are No Messages
  2775. {
  2776. // Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()
  2777. if ((active && !DrawGLScene()) || keys[VK_ESCAPE]) // Active?  Was There A Quit Received?
  2778. {
  2779. done=TRUE; // ESC or DrawGLScene Signalled A Quit
  2780. }
  2781. else // Not Time To Quit, Update Screen
  2782. {
  2783. SwapBuffers(hDC); // Swap Buffers (Double Buffering)
  2784. is_Fired--;
  2785. if (is_Fired < 0) is_Fired = 0;
  2786. if (keys[VK_UP])  // Move forwards
  2787.         {
  2788.           XP -= (GLdouble)sin(heading*piover180) * 10.0f;
  2789.           ZP -= (GLdouble)cos(heading*piover180) * 10.0f;
  2790.         }
  2791.         else if (keys['W'])  // Move forwards
  2792.         {
  2793.           XP -= (GLdouble)sin(heading*piover180) * 10.0f;
  2794.           ZP -= (GLdouble)cos(heading*piover180) * 10.0f;
  2795.         }
  2796.         if (keys[VK_DOWN]) // Move backwards
  2797.         {
  2798.           XP += (GLdouble)sin(heading*piover180) * 10.0f;
  2799.           ZP += (GLdouble)cos(heading*piover180) * 10.0f;
  2800.         }                
  2801.         else if (keys['S']) // Move backwards
  2802.         {
  2803.           XP += (GLdouble)sin(heading*piover180) * 10.0f;
  2804.           ZP += (GLdouble)cos(heading*piover180) * 10.0f;
  2805.         }
  2806.         if (keys['A'])  // strafe left
  2807.         {
  2808.           XP += (GLdouble)sin((heading-90)*piover180) * 10.0f;
  2809.           ZP += (GLdouble)cos((heading-90)*piover180) * 10.0f;
  2810.         }
  2811.         if (keys['D']) // strafe right
  2812.         {
  2813.           XP += (GLdouble)sin((heading+90)*piover180) * 10.0f;
  2814.           ZP += (GLdouble)cos((heading+90)*piover180) * 10.0f;
  2815.         }                
  2816.         if (keys[VK_LEFT]) // Turn left
  2817.         {
  2818.           zprot += .5f;
  2819.         }
  2820.         else if (keys[VK_RIGHT]) // Turn right
  2821.         {
  2822.           zprot -= .5f;
  2823.         }
  2824. if (keys['F'] && !fp) // Toggle Frame Per Second Counter
  2825.         {
  2826.           isFPS = !isFPS;
  2827.           fp = true;
  2828.         }
  2829.         else if (!keys['F'])
  2830.         {
  2831.           fp = false;
  2832.         }        
  2833. if (keys['I'] && !ip) // Invert y-axis for the mouse
  2834.         {
  2835.           invert_mouse = !invert_mouse;
  2836.           ip = true;
  2837.         }
  2838.         else if (!keys['I'])
  2839.         {
  2840.           ip = false;
  2841.         }
  2842.       }
  2843.     }
  2844.   }
  2845. // Shutdown
  2846. KillGLWindow(); // Kill The Window
  2847. return (msg.wParam); // Exit The Program
  2848. }