home *** CD-ROM | disk | FTP | other *** search
/ Enter 2003 July / EnterCD 7_2003.iso / Ekstra / GL Force 2001 3.0 / 3DFontView.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-04-24  |  143.6 KB  |  5,876 lines

  1. /*
  2. Authors: David Nishimoto 
  3. Website: http://www.listensoftware.com
  4. Program: BreakOut/Force
  5. Email: davepamn@relia.net
  6. */
  7.  
  8. #include "stdafx.h"
  9. #include "MainFrm.h"
  10. #include "3DFont.h"
  11.  
  12. #include "3DFontDoc.h"
  13. #include "3DFontView.h"
  14. #include "help.h"
  15. #include "banner.h"
  16.  
  17.  
  18. #include <time.h>
  19. #include <math.h>
  20. #include <MMSYSTEM.H>
  21.  
  22. #ifdef _DEBUG
  23. #define new DEBUG_NEW
  24. #undef THIS_FILE
  25. static char THIS_FILE[] = __FILE__;
  26. #endif
  27.  
  28. BOOL gameOver=FALSE;
  29. BOOL pause=FALSE;
  30. #define PI 3.142
  31. #define TRUE 1
  32. #define FALSE 0
  33. #define glRGB(x, y, z)    glColor3ub((GLubyte)x, (GLubyte)y, (GLubyte)z)
  34. #define GRID_SIZE 300
  35. #define dRadToDeg(x) (((float)x)*57.29577951308f)
  36. #define EXPLOSION_SIZE 50
  37. #define NUMBER_OF_MISSILES 50
  38. #define EMPTY_TYPE 0
  39. #define MUSHROOM_TYPE 1
  40. #define BONUS_TYPE 2
  41. #define OBJECT_LIST_SIZE 40
  42. #define MINE_LIST_SIZE 20
  43. #define RIGHT_DIRECTION 1
  44. #define LEFT_DIRECTION 2
  45. #define FORWARD_DIRECTION 3
  46. #define LEFT 1
  47. #define RIGHT 2
  48. #define CENTER 3
  49. #define TORUS_TYPE 1
  50. #define SPHERE_TYPE 2
  51. #define ENEMY_ROBOT 0
  52. #define TIE_FIGHTER 1
  53. #define MOVING_MINE 2
  54. #define    ENEMY_SHIP  3
  55. #define ASTEROID_COUNT 40
  56. #define BONUS_LIST_SIZE 40
  57.  
  58. typedef struct Engine{
  59.     GLfloat x,y,z;
  60.     GLfloat m_velocity;
  61.     long m_time_out;
  62.     GLint angle;
  63.     GLfloat m_radians;
  64.     long m_cpu_clicks;
  65.     clock_t m_movement_interval;
  66.     long m_hit;
  67.     long m_type;
  68.     long m_shield;
  69.     BOOL m_sleep;
  70.     GLint mTurretAngle;
  71.     BOOL mActiveFlag;
  72. }Engine;
  73.  
  74. Engine EnemyEngine[1];
  75.  
  76.  
  77. typedef struct OBJECT_STRUCT{
  78.     GLint m_id;
  79.     GLfloat m_x;
  80.     GLfloat m_y;
  81.     GLfloat m_z;
  82.     GLfloat m_t;
  83.     GLfloat m_Vox;
  84.     GLfloat m_Voy;
  85.     GLfloat m_Vo;
  86.     GLfloat m_Xo;
  87.     GLfloat m_Yo;
  88.     GLint m_value;
  89.     GLint m_hit;
  90.     GLint m_direction;
  91.     GLfloat m_radians;
  92.     BOOL m_available_flag;
  93.     GLint m_type;
  94.     //BOOL m_active_flag;
  95. } OBJECT_STRUCT_TYPE;
  96.  
  97. OBJECT_STRUCT_TYPE enemyMissile[NUMBER_OF_MISSILES];
  98. OBJECT_STRUCT_TYPE breakOutMissile[NUMBER_OF_MISSILES];
  99. OBJECT_STRUCT_TYPE objMushRoomList[OBJECT_LIST_SIZE];
  100. OBJECT_STRUCT_TYPE objMineList[MINE_LIST_SIZE];
  101. OBJECT_STRUCT_TYPE objBonusList[BONUS_LIST_SIZE];
  102.  
  103.  
  104. typedef struct BreakOut{
  105.     GLfloat M_TORSO_ANGLE;
  106.     GLfloat M_ARM_ANGLE;
  107.     GLfloat m_radians;
  108.     GLfloat m_xPos;
  109.     GLfloat m_yPos;
  110.     GLfloat m_zPos;
  111.     GLfloat m_velocity;
  112.     long m_score;
  113.     GLint m_shield;
  114.     GLint m_hit;
  115.     int m_swing;
  116. }BreakOut;
  117.  
  118. BreakOut objBreakOut;
  119. long m_subtotal_score;
  120. int mLevel;
  121. BOOL mGenerate_Mines_Flag=TRUE;
  122.  
  123. typedef double MATRIX4X4 [4][4];
  124. typedef double MATRIX4X1 [4][1];
  125. typedef double MATRIX1X4 [1][4];
  126.  
  127. typedef struct VECTOR_STRUCT
  128. {
  129.     GLfloat m_x;
  130.     GLfloat m_y;
  131.     GLfloat m_z;
  132. } VECTOR_STRUCT_TYPE;
  133.  
  134. typedef struct explosion{
  135.     GLfloat x;
  136.     GLfloat y;
  137.     GLfloat z;
  138.     GLfloat scale_x;
  139.     GLfloat scale_y;
  140.     GLfloat scale_z;
  141.     long m_cpu_seconds;
  142.     long m_shield;
  143.     BOOL m_available_flag;
  144.     //BOOL m_active_flag;
  145.     GLint type;
  146. }EXPLOSION_TYPE;
  147.  
  148. EXPLOSION_TYPE objExplosion[EXPLOSION_SIZE];
  149.  
  150. int vMap[10][10];
  151. int vBonusMap[10][10];
  152. int mLives=3;
  153. int mForceMissileCount=0;
  154.  
  155. typedef struct position{
  156.     GLfloat x;
  157.     GLfloat y;
  158.     GLfloat z;
  159. }POSITION_TYPE;
  160.  
  161. typedef struct Asteroid{
  162.     GLfloat m_angle_radians;
  163.     GLfloat m_x;
  164.     GLfloat m_y;
  165.     GLfloat m_z;
  166.     GLfloat dir_x;
  167.     GLfloat dir_y;
  168.     GLfloat dir_z;
  169.     GLfloat m_mass;
  170.     GLfloat m_velocity;
  171.     GLfloat m_size;
  172.     GLfloat m_radius;
  173.     GLint m_colorIndex;
  174.     long m_movement_interval;
  175.     GLint m_availableFlag;
  176. }Asteroid;
  177.  
  178. Asteroid objAsteroid[ASTEROID_COUNT];
  179.  
  180. long banner_current_time;
  181.  
  182. long ellaspedTimeOut(Engine *objEngine);
  183. void setTimeOut(Engine *objEngine);
  184. void cone(GLfloat radius,GLfloat height);
  185. void cylinder(GLfloat radius,GLfloat height);
  186. void box(GLfloat w,GLfloat h,GLfloat d);
  187. void brassMaterial();
  188. void goldMaterial();
  189. void bronzeMaterial();
  190. void chromeMaterial();
  191. void copperMaterial();
  192. void silverMaterial();
  193. void pewterMaterial();
  194. void blackPlasticMaterial();
  195. void setDiffuseMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha);
  196. void setAmbientMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha);
  197. void setSpecularMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha);
  198. void setMaterialShininess(GLfloat shininess);
  199. void sphere(GLfloat radius);
  200.  
  201. double Matrix4X1_1X4(MATRIX4X1 *matrix1, MATRIX1X4 *matrix2);
  202. void Matrix4X1_4X4(MATRIX4X1 *result, MATRIX4X1 *matrix1, MATRIX4X4 *matrix2);
  203. void Matrix1X4_4X4(MATRIX1X4 *result, MATRIX1X4 *matrix1, MATRIX4X4 *matrix2);
  204. VECTOR_STRUCT_TYPE* rotate(GLfloat angle,GLfloat ux,GLfloat uy,GLfloat uz, VECTOR_STRUCT_TYPE *vector);
  205.  
  206. void calcNormal(GLfloat v[3][3], GLfloat out[3]);
  207. void calcNormal2(VECTOR_STRUCT_TYPE *vertex1, VECTOR_STRUCT_TYPE *vertex2,VECTOR_STRUCT_TYPE *vertex3,GLfloat out[3]);
  208. void reduceToUnit(GLfloat vector[3]);
  209. void torus(GLfloat innerRadius,    GLfloat outerRadius);
  210.  
  211.  
  212. void drawMechRobotMissiles();
  213. void fireMechRobotMissile(GLfloat Yaw,GLfloat Pitch,GLfloat Vo);
  214. int checkMechRobotHit(GLfloat x,GLfloat y,GLfloat z);
  215. void mechRobotEngine();
  216. void centerMechRobot();
  217. POSITION_TYPE* moveMechRobot(GLdouble dStep);
  218. void drawMechRobotCanopy();
  219. void drawMechRobotRightArm ();
  220. void drawMechRobotLeftArm ();
  221. void drawMechRobotTorso ();
  222. void buildMechRobotCanopy (void);
  223. void buildMechRobotTorso (void);
  224.  
  225. void empty();
  226. void BreakOut();
  227. void tetrahedron();
  228. void icosahedron();
  229. int getAvailableMissile();
  230. int getAvailableExplosion();
  231. int getAvailableEnemyMissile();
  232. void hyperboloid();
  233. int checkMushRoomCollision(GLfloat object_x,GLfloat object_y,GLfloat object_z);
  234. int checkBreakOutHit(GLfloat x,GLfloat y,GLfloat z, int project_type);
  235.  
  236. void drawEnemyBody();
  237. void drawEnemyLeftArm();
  238. void drawEnemyRightArm();
  239. void drawEnemyArm();
  240. void drawClamp();
  241. void drawBase();
  242. void Enemy();
  243. void Enemy_engine();
  244. void drawEnemy();
  245. void drawExplosion();
  246. void moveEnemy(int index);
  247. void moveEnemyEngine(int direction,int index);
  248. void fireEnemyMissile(int index,int type);
  249. void drawEnemyMissiles();
  250. int checkEnemyHit(GLfloat x,GLfloat y,GLfloat z, int index);
  251. void toroidal_spiral();
  252.  
  253. void drawMine();
  254. void generateMines();
  255. int getMineCount();
  256. void drawMineObjectList();
  257. int getMineObject();
  258. int checkMineHit(GLfloat x,GLfloat y, GLfloat z);
  259. void point_sphere(GLfloat radius);
  260. int checkEnemyCollision(GLfloat object_x,GLfloat object_y,GLfloat object_z);
  261. int getAvailableBreakOutMissile();
  262. void missileObject();
  263. void mushRoom();
  264. int checkMushRoomHit(GLfloat missile_x,GLfloat missile_y,GLfloat missile_z);
  265. void buildMushRoomObject();
  266. int getMushRoomObject();
  267. void generateMushRoom(GLfloat x,GLfloat y,GLfloat z);
  268.  
  269. void drawTieFighter();
  270. float distanceToEnemy(int index);
  271. float distanceToBreakOut(float asteroid_x, float asteroid_y, float asteroid_z);
  272.  
  273. int checkAsteroidCollision(int exclude_index, GLfloat asteroid1_x,GLfloat asteroid1_y,GLfloat asteroid1_z,GLfloat asteroid1_radius);
  274. void generateAsteroid();
  275. void drawAsteroids();
  276. int checkAsteroidHit(GLfloat x,GLfloat y,GLfloat z, BOOLEAN m_score_flag);
  277. void collision(int index1, int index2);
  278. int checkEnemyMineHit(GLfloat x,GLfloat y,GLfloat z);
  279. void changeAsteroidDirection(int index,GLfloat increaseVelocity);
  280.  
  281. //R5
  282. void checkBonusCollision();
  283. void drawEnemyShip();
  284. void drawEnemyShipWindshield();
  285. void drawEnemyShipBody();
  286. void generateMultipleAsteroids(int index);
  287. int getAsteroidCount();
  288. int getAvailableAsteroid();
  289.  
  290. /////////////////////////////////////////////////////////////////////////////
  291. // CMy3DFontView
  292.  
  293. IMPLEMENT_DYNCREATE(CMy3DFontView, CView)
  294.  
  295. BEGIN_MESSAGE_MAP(CMy3DFontView, CView)
  296.     //{{AFX_MSG_MAP(CMy3DFontView)
  297.     ON_WM_CREATE()
  298.     ON_WM_DESTROY()
  299.     ON_WM_SIZE()
  300.     ON_WM_TIMER()
  301.     ON_WM_KEYDOWN()
  302.     ON_COMMAND(ID_FILE_PAUSE, OnFilePause)
  303.     ON_COMMAND(ID_FILE_NEW, OnFileNew)
  304.     ON_COMMAND(ID_FILE_RESUME, OnFileResume)
  305.     ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  306.     //}}AFX_MSG_MAP
  307.     // Standard printing commands
  308. END_MESSAGE_MAP()
  309.  
  310. /////////////////////////////////////////////////////////////////////////////
  311. // CMy3DFontView construction/destruction
  312.  
  313. CMy3DFontView::CMy3DFontView()
  314. {
  315.     int i;
  316.  
  317.     // TODO: add construction code here
  318.     srand( (unsigned)time(NULL) );
  319.     startGame();
  320.     buildSceneGraph();
  321.  
  322.     objBreakOut.m_radians=0.0f;
  323.     objBreakOut.m_velocity=5.0f;
  324.     objBreakOut.m_xPos=-50.0f;
  325.     objBreakOut.m_yPos=0.0f;
  326.     objBreakOut.m_zPos=-20.0f;
  327.     objBreakOut.m_score=0;
  328.     objBreakOut.m_hit=0;
  329.     objBreakOut.m_swing=CENTER;
  330.     objBreakOut.m_shield=300;
  331.  
  332.     for(i=0; i<NUMBER_OF_MISSILES; i++)
  333.     {
  334.         enemyMissile[i].m_available_flag=TRUE;
  335.         //enemyMissile[i].m_active_flag=FALSE;
  336.         breakOutMissile[i].m_available_flag=TRUE;
  337.         //breakOutMissile[i].m_active_flag=FALSE;
  338.     }
  339.  
  340.     for (i=0; i<MINE_LIST_SIZE; i++)
  341.     {
  342.         //objMushRoomList[i].m_active_flag=FALSE;
  343.         objMineList[i].m_available_flag=TRUE;
  344.         //objMineList[i].m_active_flag=FALSE;
  345.     }
  346.  
  347.     for(i=0; i<OBJECT_LIST_SIZE; i++)
  348.     {
  349.         objMushRoomList[i].m_available_flag=TRUE;
  350.     }
  351.  
  352.     for (i=0; i<BONUS_LIST_SIZE; i++)
  353.     {
  354.         objBonusList[i].m_available_flag=TRUE;
  355.         //objBonusList[i].m_active_flag=FALSE;
  356.     }
  357.  
  358.     bonus_configuration();
  359.  
  360.     mushRoom_configuration();
  361.  
  362.     for(i=0; i<EXPLOSION_SIZE; i++)
  363.     {
  364.         objExplosion[i].x=0.0f;
  365.         objExplosion[i].y=0.0f;
  366.         objExplosion[i].z=0.0f;
  367.         objExplosion[i].scale_x=2.0f;
  368.         objExplosion[i].scale_y=2.0f;
  369.         objExplosion[i].scale_z=2.0f;
  370.         objExplosion[i].m_cpu_seconds=0;
  371.         objExplosion[i].m_available_flag=TRUE;
  372.         //objExplosion[i].m_active_flag=FALSE;
  373.     }
  374.  
  375.     EnemyEngine[0].x=0.0f;
  376.     EnemyEngine[0].y=0.0f;
  377.     EnemyEngine[0].z=-50.0f;
  378.     EnemyEngine[0].m_velocity=1.0f;
  379.     EnemyEngine[0].m_radians=1.57f;
  380.     EnemyEngine[0].m_sleep=FALSE;
  381.     EnemyEngine[0].m_type=TIE_FIGHTER;
  382.     EnemyEngine[0].m_shield=300;
  383.  
  384.     for(i=0; i<ASTEROID_COUNT;i++)
  385.     {
  386.         objAsteroid[i].m_availableFlag=TRUE;        
  387.     }
  388.  
  389.  
  390.  
  391.     mLevel=0;
  392.  
  393.     //PlaySound ("bluecoll.wav", NULL, SND_FILENAME | SND_ASYNC |SND_LOOP) ;
  394.  
  395.     CBanner *dlgBanner;
  396.     dlgBanner=new CBanner();
  397.     int response=dlgBanner->DoModal();
  398.     delete dlgBanner;
  399.  
  400.     //PlaySound("", NULL, SND_PURGE | SND_NODEFAULT);
  401.  
  402. }
  403.  
  404. CMy3DFontView::~CMy3DFontView()
  405. {
  406.     cleanSceneGraph(root);
  407. }
  408. BOOL CMy3DFontView::PreCreateWindow(CREATESTRUCT& cs)
  409. {
  410.     // TODO: Modify the Window class or styles here by modifying
  411.     //  the CREATESTRUCT cs
  412.  
  413.     return CView::PreCreateWindow(cs);
  414. }
  415.  
  416. /////////////////////////////////////////////////////////////////////////////
  417. // CMy3DFontView drawing
  418.  
  419. void CMy3DFontView::OnDraw(CDC* pDC)
  420. {
  421.     CMy3DFontDoc* pDoc = GetDocument();
  422.     ASSERT_VALID(pDoc);
  423.  
  424.     // TODO: add draw code for native data here
  425.     CPalette* oldPalette;
  426.  
  427.     //Set logic palette
  428.     oldPalette = m_pDC->SelectPalette(&m_Palette, FALSE);
  429.     m_pDC->RealizePalette();
  430.     
  431.     wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
  432.     //DrawGLFont();
  433.     drawWithOpenGL();
  434.     SwapBuffers(m_pDC->GetSafeHdc());
  435.     wglMakeCurrent(m_pDC->GetSafeHdc(), NULL);
  436.     m_pDC->SelectPalette(oldPalette, FALSE);
  437. }
  438. void CMy3DFontView::drawWithOpenGL()
  439. {
  440.     CMainFrame* pFrame; 
  441.     char scorePhrase[400];
  442.     static GLfloat swing_angle=0.0f;
  443.  
  444.     GLfloat swing_displacement;
  445.  
  446.     glShadeModel(GL_SMOOTH);
  447.     glEnable(GL_DEPTH_TEST);
  448.     
  449.     //clear color buffer
  450.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  451.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  452.     
  453.     //set light model
  454.     setLighting();
  455.     setBlending();
  456.  
  457.     glMatrixMode(GL_MODELVIEW);
  458.     glLoadIdentity();
  459.  
  460.  
  461.     if(objBreakOut.m_swing==LEFT)
  462.     {
  463.         if (swing_angle>-0.9f)
  464.             swing_angle-= 0.1f;
  465.     }
  466.     else if(objBreakOut.m_swing==RIGHT)
  467.     {
  468.         if(swing_angle<0.9f)
  469.             swing_angle+=0.1f;
  470.     }
  471.     else
  472.     {
  473.         if (swing_angle<-0.1f)
  474.             swing_angle+= 0.1f;
  475.         else if(swing_angle>0.1f)
  476.             swing_angle-= 0.1f;
  477.         else
  478.             swing_angle=0.0f;
  479.     }
  480.  
  481.     if (swing_angle>0.0f || swing_angle<0.0f)
  482.     {
  483.         swing_displacement=(GLfloat) (40.0f*(GLfloat)abs(swing_angle));
  484.     }
  485.     else
  486.     {
  487.         swing_displacement=0.0f;
  488.     }
  489.  
  490.               gluLookAt(
  491.               objBreakOut.m_xPos-((swing_displacement+30.0f)*(GLfloat)cos(objBreakOut.m_radians+swing_angle)+camera.m_x), 
  492.               objBreakOut.m_yPos+camera.m_y, 
  493.               objBreakOut.m_zPos+((swing_displacement+30.0f)*(GLfloat)sin(objBreakOut.m_radians+swing_angle)), 
  494.               objBreakOut.m_xPos+(100.0f*(GLfloat)cos(objBreakOut.m_radians)+camera.m_z), 
  495.               objBreakOut.m_yPos-20, 
  496.               objBreakOut.m_zPos-(100.0f*(GLfloat)sin(objBreakOut.m_radians)), 
  497.               0.0f, 
  498.               1.0f, 
  499.               0.0f  
  500.               );
  501.  
  502.     if ((clock()-banner_current_time)<30000)
  503.     {
  504.         glPushMatrix();
  505.             glTranslatef(20.0f, 12.0f,0.0f);
  506.             glRotatef(-90.0f,0.0f,1.0f,0.0f);
  507.             glRotatef(90.0f,1.0f,0.0f,0.0f);
  508.             m_FontX.GLDrawText();
  509.         glPopMatrix();
  510.     }
  511.  
  512.     VERIFY( pFrame = (CMainFrame*)GetParentFrame() ); 
  513.  
  514.     if (mLives<=0)
  515.     {
  516.         gameOver=TRUE;
  517.     }
  518.     else
  519.     {
  520.  
  521.         if(m_subtotal_score>500)
  522.         {
  523.             mLives+=3;
  524.             m_subtotal_score=0;
  525.             mLevel++;
  526.         }
  527.  
  528.         sprintf(scorePhrase,"(space)fire(B)Burst(1-3)CamSwing(4-5)CamHeight(Score)%i(Shield)%i(Lives)%i",objBreakOut.m_score,objBreakOut.m_shield,mLives);
  529.     }
  530.  
  531.     if(gameOver)
  532.     {
  533.         sprintf(scorePhrase,"Game Over Score %i",objBreakOut.m_score);
  534.         pFrame->SetWindowText(scorePhrase); 
  535.         KillTimer(1);
  536.     }
  537.     else
  538.     {
  539.         pFrame->SetWindowText(scorePhrase); 
  540.     }
  541.  
  542.     traverseSceneGraph(root);
  543.  
  544.     glPushMatrix();
  545.         glTranslatef(0.0f,-10.0f,0.0f);
  546.         drawGrid();
  547.     glPopMatrix();
  548.     
  549.     if(getMushRoomObjectCount(MUSHROOM_TYPE)>0)
  550.     {
  551.         drawMushRoomObjectList();
  552.     }
  553.     else
  554.     {
  555.         mushRoom_configuration();
  556.         buildMushRoomObject();
  557.         drawMushRoomObjectList();
  558.     }
  559.  
  560.     //R5
  561.     /*
  562.     if(getObjectCount(BONUS_TYPE)>0)
  563.     {
  564.         drawBonusObjectList();
  565.     }
  566.     else
  567.     {
  568.         buildBonusObject();
  569.         drawBonusObjectList();
  570.         mLives+=2;
  571.     }
  572.     */
  573.     drawExplosion();
  574.  
  575. }
  576. void CMy3DFontView::setLighting()
  577. {
  578.   GLfloat light0pos[4]=     {0.7071f, 40.0f, 5.0f, 1.0f};
  579.   GLfloat light0ambient[4]= {0.3f, 0.3f, 0.3f, 1.0f};
  580.   GLfloat light0diffuse[4]= {0.6f, 0.6f, 0.6f, 1.0f};
  581.   GLfloat light0specular[4]={0.8f, 0.8f, 0.8f, 1.0f};
  582.   GLfloat lmodel_ambient[]= {0.5f,0.5f,0.5f,1.0f};
  583.  
  584.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
  585.  
  586.   //glDisable(GL_DITHER);
  587.   glShadeModel(GL_SMOOTH);
  588.   
  589.   glLightfv(GL_LIGHT0, GL_POSITION, light0pos);
  590.   glLightfv(GL_LIGHT0, GL_AMBIENT, light0ambient);
  591.   glLightfv(GL_LIGHT0, GL_DIFFUSE, light0diffuse);
  592.   glLightfv(GL_LIGHT0, GL_SPECULAR, light0specular);
  593.   
  594.   glEnable(GL_LIGHTING);
  595.   glEnable(GL_LIGHT0);
  596. }
  597. void CMy3DFontView::setBlending()
  598. {
  599.     glEnable(GL_BLEND);
  600.     /*GL_SRC_ALPHA = Source color multiplied by source alpha
  601.       GL_ONE_MINUS_SRC_ALPHA =  Destination color is multiplied by 1,1,1,1 - source color)
  602.     */
  603.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  604.  
  605. }
  606.  
  607. /////////////////////////////////////////////////////////////////////////////
  608. // CMy3DFontView diagnostics
  609.  
  610. #ifdef _DEBUG
  611. void CMy3DFontView::AssertValid() const
  612. {
  613.     CView::AssertValid();
  614. }
  615.  
  616. void CMy3DFontView::Dump(CDumpContext& dc) const
  617. {
  618.     CView::Dump(dc);
  619. }
  620.  
  621. CMy3DFontDoc* CMy3DFontView::GetDocument() // non-debug version is inline
  622. {
  623.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy3DFontDoc)));
  624.     return (CMy3DFontDoc*)m_pDocument;
  625. }
  626. #endif //_DEBUG
  627.  
  628. /////////////////////////////////////////////////////////////////////////////
  629. // CMy3DFontView message handlers
  630.  
  631. int CMy3DFontView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  632. {
  633.     if (CView::OnCreate(lpCreateStruct) == -1)
  634.         return -1;
  635.     
  636.     // TODO: Add your specialized creation code here
  637.     PIXELFORMATDESCRIPTOR pfd =
  638.     {
  639.         sizeof(PIXELFORMATDESCRIPTOR),
  640.         1,
  641.         PFD_DRAW_TO_WINDOW|
  642.         PFD_SUPPORT_OPENGL|
  643.         PFD_DOUBLEBUFFER,  
  644.         PFD_TYPE_RGBA,
  645.         24,
  646.         0,0,0,0,0,0,
  647.         0,0,0,0,0,0,0,
  648.         32,
  649.         0,0,
  650.         PFD_MAIN_PLANE,
  651.         0,
  652.         0,0,0
  653.     };
  654.      
  655.     m_pDC = new CClientDC(this);
  656.     int pixelFormat =
  657.         ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
  658.     BOOL success = 
  659.         SetPixelFormat(m_pDC->GetSafeHdc(), pixelFormat, &pfd);
  660.  
  661.     DescribePixelFormat(m_pDC->GetSafeHdc(), pixelFormat,
  662.           sizeof(pfd), &pfd);
  663.  
  664.     if(pfd.dwFlags & PFD_NEED_PALETTE)
  665.          InitPalette();
  666.  
  667.     m_hRC = wglCreateContext(m_pDC->GetSafeHdc());
  668.  
  669.     m_FontX.SetXOffset(0.0f);
  670.     m_FontX.SetYOffset(0.1f);
  671.     m_FontX.SetXScale(6.4f);
  672.     m_FontX.SetYScale(6.3f);
  673.     m_FontX.SetZScale(3.8f);
  674.     m_FontX.SetXRotate(-90.0f);
  675.     m_FontX.SetYRotate(0.0f);
  676.     m_FontX.SetZRotate(0.0f);
  677.  
  678.     InitFontColor();
  679.  
  680.     wglMakeCurrent(m_pDC->m_hDC,m_hRC);
  681.     m_FontX.CreateFont(m_pDC, "Arial Black");
  682.     m_FontX.SetText("GL Force R5");
  683.  
  684.     wglMakeCurrent(NULL,NULL);
  685.  
  686.     setSpeed();
  687.  
  688.     return 0;
  689. }
  690.  
  691. void CMy3DFontView::OnDestroy() 
  692. {
  693.     CView::OnDestroy();
  694.     
  695.     // TODO: Add your message handler code here
  696.     wglDeleteContext(m_hRC);
  697.     m_Palette.DeleteObject();
  698.     ReleaseDC(m_pDC);
  699.     delete m_pDC;
  700.  
  701. }
  702.  
  703. void CMy3DFontView::OnSize(UINT nType, int cx, int cy) 
  704. {
  705.     GLdouble aspect;
  706.     CView::OnSize(nType, cx, cy);
  707.  
  708.     if (cy==0)
  709.         aspect = (GLdouble)cx;
  710.     else
  711.         aspect = (GLdouble)cx/(GLdouble)cy;
  712.  
  713.     CClientDC clientDC(this);
  714.     wglMakeCurrent(clientDC.m_hDC, m_hRC);
  715.     glMatrixMode(GL_PROJECTION);
  716.     glLoadIdentity();
  717.     //glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 7.0);
  718.     //glViewport(0, 0, cx, cy);
  719.  
  720.     setPerspectiveWindow(60,aspect,5,4000);
  721.     setViewport(0,0,cx,cy);
  722.     
  723.     wglMakeCurrent(NULL, NULL);
  724. }
  725.  
  726.  
  727. void CMy3DFontView::InitPalette(void)
  728. {
  729.     PIXELFORMATDESCRIPTOR pfd;  // Pixel Format Descriptor         
  730.     LOGPALETTE *pPal;            // Pointer to memory for logical palette
  731.     int PixelFormat;            // Pixel format index
  732.     int paletteSize;            // Number of entries in palette 
  733.     BYTE RedMask;               // Range for each color entry (7,7,and 3)
  734.     BYTE GreenMask;
  735.     BYTE BlueMask;
  736.     HDC hDC = GetDC()->GetSafeHdc();  //the context device                                 
  737.  
  738.     // Get the pixel format index and retrieve the pixel format description
  739.     PixelFormat = GetPixelFormat(hDC);
  740.     DescribePixelFormat(hDC, PixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd);
  741.     
  742.     
  743.     // Check whether the pixel format and the pixel type
  744.     if (!(pfd.dwFlags & PFD_NEED_PALETTE ||
  745.       pfd.iPixelType == PFD_TYPE_COLORINDEX))
  746.         return;
  747.  
  748.     // Get the number of entries in palette. 256 colors for 8 bits 
  749.     paletteSize = 1 << pfd.cColorBits;
  750.     
  751.     // Allocate for the logical palette
  752.     pPal = (LOGPALETTE*)
  753.     malloc(sizeof(LOGPALETTE) + paletteSize * sizeof(PALETTEENTRY));
  754.     
  755.     
  756.     // Fill the logical palette header information 
  757.     pPal->palVersion = 0x300;            //support Windows3.0
  758.     pPal->palNumEntries = paletteSize;   //number of colors entries
  759.  
  760.     // Set the 1st entries of logical palette with the current system palette 
  761.     (void) GetSystemPaletteEntries(hDC, 0, paletteSize, &pPal->palPalEntry[0]);
  762.  
  763.     //Set the RGB mask
  764.     RedMask = (1 << pfd.cRedBits) - 1;
  765.     GreenMask = (1 << pfd.cGreenBits) - 1;
  766.     BlueMask = (1 << pfd.cBlueBits) - 1;
  767.  
  768.     //Set all entries of the logical palette 
  769.     for (int i=0; i<paletteSize; ++i) 
  770.     {
  771.         pPal->palPalEntry[i].peRed =
  772.             (((i >> pfd.cRedShift) & RedMask) * 255) / RedMask;
  773.         pPal->palPalEntry[i].peGreen =
  774.             (((i >> pfd.cGreenShift) & GreenMask) * 255) / GreenMask;
  775.         pPal->palPalEntry[i].peBlue =
  776.             (((i >> pfd.cBlueShift) & BlueMask) * 255) / BlueMask;
  777.         pPal->palPalEntry[i].peFlags = 0;
  778.     }
  779.  
  780.     //Create the palette
  781.     m_Palette.CreatePalette(pPal);
  782.  
  783.     //Free the memory allocated for the logical palette 
  784.     free(pPal);
  785. }
  786.  
  787.  
  788. void CMy3DFontView::DrawGLFont(void)
  789. {
  790.     glShadeModel(GL_SMOOTH);
  791.     glEnable(GL_DEPTH_TEST);
  792.     
  793.     //clear color buffer
  794.     glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
  795.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  796.     
  797.     //set light model
  798.     glEnable(GL_LIGHTING);
  799.     glEnable(GL_LIGHT0);
  800.  
  801.     glMatrixMode(GL_MODELVIEW);
  802.     glLoadIdentity();
  803.  
  804.     //glTranslatef(-3.0f, -5.0f, -0.0f);
  805.  
  806.     m_FontX.GLDrawText();
  807.  
  808.     glFlush();
  809.  
  810. }
  811.  
  812.  
  813. void CMy3DFontView::InitFontColor()
  814. {
  815.     float fv[4];
  816.  
  817.  
  818.     fv[0] = 0.1f;
  819.     fv[1] = 0.1f;
  820.     fv[2] = 0.1f;
  821.     fv[3] = 0.1f;
  822.     m_FontX.SetEmission(fv);
  823.  
  824.     fv[0] = 0.9f;
  825.     fv[1] = 0.9f;
  826.     fv[2] = 0.9f;
  827.     fv[3] = 1.0f;
  828.     m_FontX.SetSpecular(fv);
  829.  
  830.     fv[0] = 0.1f;
  831.     fv[1] = 0.1f;
  832.     fv[2] = 1.0f;
  833.     fv[3] = 1.0f;
  834.     m_FontX.SetAmbient(fv);
  835.  
  836.     fv[0] = 0.1f;
  837.     fv[1] = 0.1f;
  838.     fv[2] = 0.1f;
  839.     fv[3] = 1.0f;
  840.     m_FontX.SetDiffuse(fv);
  841.  
  842.     m_FontX.SetShininess(0.1f);
  843.     
  844. }
  845.  
  846.  
  847. void CMy3DFontView::setPerspectiveWindow(GLdouble fovy, GLdouble aspect,GLdouble zNear,GLdouble zFar)
  848. {
  849.   glMatrixMode(GL_PROJECTION);
  850.   glLoadIdentity();
  851.   gluPerspective(fovy, aspect,zNear,  zFar);
  852. }
  853. void CMy3DFontView::setViewport(GLint iX, GLint iY, GLsizei iWidth, GLsizei iHeight)
  854. {
  855.     glViewport(iX,iY,iWidth,iHeight);
  856. }
  857. void CMy3DFontView::setDepthBuffer()
  858. {
  859.   glEnable(GL_DEPTH_TEST);
  860.   glDepthFunc(GL_LESS);
  861.   glEnable(GL_CULL_FACE);
  862.   glCullFace(GL_BACK);
  863.   glFrontFace(GL_CCW);
  864. }
  865. void CMy3DFontView::startGame()
  866. {
  867.     gameOver = FALSE;
  868.     objBreakOut.m_score=0;
  869.     objBreakOut.m_shield=300;
  870.     m_subtotal_score=0;
  871.     mLives=3;
  872.     mLevel=0;
  873.     
  874.     camera.m_radians=(float)1.57;
  875.     camera.m_x=0.0f;;
  876.     camera.m_y=4.0f;
  877.     camera.m_z=0.0f;
  878.     banner_current_time=clock();
  879.  
  880.     objBreakOut.m_swing==CENTER;
  881.     generateAsteroid();
  882.     mGenerate_Mines_Flag=TRUE;
  883. }
  884.  
  885.  
  886. void CMy3DFontView::OnTimer(UINT nIDEvent) 
  887. {
  888.     // TODO: Add your message handler code here and/or call default
  889.  
  890.     if(pause)
  891.     {
  892.         KillTimer(1);
  893.     }
  894.     else
  895.     {
  896.         setSpeed();
  897.     }
  898.  
  899.     Invalidate(FALSE);
  900.  
  901.     CView::OnTimer(nIDEvent);
  902. }
  903.  
  904. void CMy3DFontView::BreakOutLeft()
  905. {
  906.     objBreakOut.m_radians +=(GLfloat) PI/25.0f; 
  907.     if(objBreakOut.m_radians > (2.0*PI))        // Keep in bounds
  908.         objBreakOut.m_radians = 0.0f;
  909.  
  910. }
  911. void CMy3DFontView::BreakOutRight(void)
  912. {
  913.     objBreakOut.m_radians -= (GLfloat) PI/25.0f; 
  914.     if (objBreakOut.m_radians <0.0f)        // Keep in bounds
  915.        objBreakOut.m_radians = (GLfloat)(2.0f*PI);
  916. }
  917.  
  918. void CMy3DFontView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
  919. {
  920.     //static clock_t current_clicks=clock();
  921.  
  922.     // TODO: Add your message handler code here and/or call default
  923.         //left
  924.         if (nChar==37)
  925.         {
  926.             BreakOutLeft();
  927.         }
  928.         //right
  929.         else if(nChar==39)
  930.         {
  931.             BreakOutRight();
  932.         }
  933.         //up
  934.         else if(nChar==38)
  935.         {
  936.             if (objBreakOut.m_velocity<6)
  937.                 objBreakOut.m_velocity+=1;
  938.         }
  939.         //down
  940.         else if(nChar==40)
  941.         {
  942.             if (objBreakOut.m_velocity>-6)
  943.                 objBreakOut.m_velocity-=1;
  944.         }
  945.         //burst fire
  946.         else if(nChar==66)
  947.         {
  948.             mForceMissileCount=4;
  949.         }
  950.         //fire
  951.         else if(nChar==32)
  952.         {
  953.             mForceMissileCount=1;
  954.             /*
  955.             if((clock()-current_clicks)>300)
  956.             {
  957.                 fireMechRobotMissile(dRadToDeg(objBreakOut.m_radians+((float)PI/2.0f))+180.0f,0.0f,1.0f);
  958.                 current_clicks=clock();
  959.             }
  960.             */
  961.         }
  962.         //1
  963.         else if(nChar==49)
  964.         {
  965.             objBreakOut.m_swing=LEFT;
  966.         }
  967.             //2
  968.         else if(nChar==50)
  969.         {
  970.             objBreakOut.m_swing=CENTER;
  971.         }
  972.             //3
  973.         else if(nChar==51)
  974.         {
  975.             objBreakOut.m_swing=RIGHT;
  976.         }
  977.             //4
  978.         else if(nChar==52)
  979.         {
  980.             camera.m_y++;
  981.         }
  982.             //5
  983.         else if(nChar==53)
  984.         {
  985.             camera.m_y--;
  986.         }
  987.             //6
  988.         else if(nChar==54)
  989.         {
  990.         }
  991.             //7
  992.         else if(nChar==55)
  993.         {
  994.         }
  995.             //8
  996.         else if (nChar==56)
  997.         {
  998.             
  999.         }
  1000.  
  1001.     //Invalidate(FALSE);
  1002.     CView::OnKeyDown(nChar, nRepCnt, nFlags);
  1003. }
  1004. void CMy3DFontView::drawGrid()
  1005. {
  1006.  int i;
  1007.  int j;
  1008.  
  1009.  GLfloat x;
  1010.  GLfloat z;
  1011.  GLfloat wall_x1,wall_x2;
  1012.  GLfloat wall_z1,wall_z2;
  1013.  GLfloat cellsize;
  1014.  int color;
  1015.  
  1016. cellsize=(GLfloat) ((GRID_SIZE*2)/10);
  1017.  
  1018.   glPushAttrib(GL_LIGHTING);
  1019.   glDisable(GL_LIGHTING);
  1020.  
  1021.     z = (GLfloat) -GRID_SIZE;
  1022.     for(i=0; i<=9; i++)
  1023.     {
  1024.         x = (GLfloat) -GRID_SIZE;
  1025.  
  1026.         for(j=0; j<=9; j++)
  1027.         {
  1028.                 wall_x1=x-(cellsize/2);
  1029.                 wall_x2=x+(cellsize/2);
  1030.                 wall_z1=z+(cellsize/2);
  1031.                 wall_z2=z-(cellsize/2);
  1032.  
  1033.                 color=rand()%5;
  1034.                 switch(color)
  1035.                 {
  1036.                     case 0:
  1037.                         glRGB(255/2,0,0);
  1038.                         break;
  1039.                     case 1:
  1040.                         glRGB(0,255/2,0);
  1041.                         break;
  1042.                     case 2:
  1043.                         glRGB(0,0,255/2);
  1044.                         break;
  1045.                     case 3:
  1046.                         glRGB(255/2,255/2,0);
  1047.                         break;
  1048.                     case 4:
  1049.                         glRGB(0,255/2,255/2);
  1050.                         break;
  1051.                     case 5:
  1052.                         glRGB(255,0,255);
  1053.                         break;
  1054.                 }
  1055.  
  1056.                 glPushMatrix();
  1057.                     glBegin(GL_LINE_LOOP);
  1058.                     //glBegin(GL_POLYGON);
  1059.                         glNormal3f(0.0f,1.0f,0.0f);
  1060.                         glVertex3f(wall_x1,5.0f,wall_z1);
  1061.                         glVertex3f(wall_x2,5.0f,wall_z1);
  1062.                         glVertex3f(wall_x2,5.0f,wall_z2);
  1063.                         glVertex3f(wall_x1,5.0f,wall_z2);
  1064.                     glEnd();
  1065.                 glPopMatrix();
  1066.  
  1067.             x = x + cellsize;
  1068.         }
  1069.         z = z + cellsize;
  1070.     }    
  1071.   glPopAttrib();
  1072.   glEnable(GL_LIGHTING);
  1073. }
  1074.  
  1075. void CMy3DFontView::OnFilePause() 
  1076. {
  1077.     // TODO: Add your command handler code here
  1078.     pause=TRUE;
  1079. }
  1080. void CMy3DFontView::setSpeed()
  1081. {
  1082.     SetTimer(1,200,0);
  1083. }
  1084.  
  1085. void CMy3DFontView::OnFileNew() 
  1086. {
  1087.     // TODO: Add your command handler code here
  1088.     startGame();
  1089.     setSpeed();
  1090. }
  1091.  
  1092. void CMy3DFontView::OnFileResume() 
  1093. {
  1094.     // TODO: Add your command handler code here
  1095.  
  1096.         pause=FALSE;
  1097.         setSpeed();
  1098. }
  1099. void CMy3DFontView::traverseSceneGraph(treenode *root)
  1100. {
  1101.     if(root==NULL)
  1102.         return;
  1103.     //count++;
  1104.     //printf("PushMatrix %d\n",count);
  1105.     //printf("%s\n",root->node_key);
  1106.     glPushMatrix();
  1107.         //glMultMatrix(root->m);
  1108.         root->f();
  1109.         if (root->engine!=NULL)
  1110.         {
  1111.             root->engine();
  1112.         }
  1113.         if(root->child!=NULL)
  1114.         {
  1115.             traverseSceneGraph(root->child);
  1116.         }
  1117.     //count--;
  1118.     //printf("PopMatrix %d\n",count);
  1119.  
  1120.     glPopMatrix();
  1121.     
  1122.     if(root->sibling!=NULL)
  1123.             traverseSceneGraph(root->sibling);
  1124. }
  1125. treenode* CMy3DFontView::node(char *node_key)
  1126. {
  1127.     treenode *retNode;
  1128.  
  1129.     retNode=(treenode *) malloc (sizeof(treenode));
  1130.     retNode->child=NULL;
  1131.     retNode->sibling=NULL;
  1132.     retNode->engine=NULL;
  1133.     retNode->most_recent_child=NULL;
  1134.     strcpy(retNode->node_key,node_key);
  1135.  
  1136.     return(retNode);
  1137.  
  1138. }
  1139. void CMy3DFontView::addChild(treenode *parentNode, treenode *childNode)
  1140. {
  1141.     /*
  1142.     Observations
  1143.     1) addChild rules:
  1144.     a) A parent has only one child
  1145.     b) If another child is associated to the parent it becomes a sibling of the parents first child.  That child becomes the parent's most_recent_child.  Any additional children are associated to the parent's most_recent_child sibling link.
  1146.     c) The parents first child sibling link is traverse to find all remaining children.  This is the key for the algorithm to work correctly.
  1147.     */
  1148.  
  1149.     treenode *most_recent_child;
  1150.     //walk down the tree from the topmost child
  1151.     //connect the sibling link from the most recent child
  1152.     most_recent_child=parentNode->most_recent_child;
  1153.     
  1154.     strcpy(childNode->parent_key,parentNode->node_key);
  1155.  
  1156.     if (most_recent_child!=NULL)
  1157.     {
  1158.         most_recent_child->sibling=childNode;
  1159.         parentNode->most_recent_child=childNode;
  1160.     }
  1161.     //first child
  1162.     else
  1163.     {
  1164.         parentNode->child=childNode;
  1165.         parentNode->most_recent_child=childNode;
  1166.     }
  1167. }
  1168. void CMy3DFontView::cleanSceneGraph(treenode *root)
  1169. {
  1170.     if(root->child!=NULL)
  1171.         cleanSceneGraph(root->child);
  1172.     
  1173.     if(root->sibling!=NULL)
  1174.         cleanSceneGraph(root->sibling);
  1175.  
  1176.     free(root);
  1177. }
  1178. void CMy3DFontView::buildSceneGraph()
  1179. {
  1180.     treenode *objEnemy, *objEnemyBody;
  1181.     treenode *objBreakOutNode, *objTorsoNode,*objCanopyNode,*objLeftArmNode,*objRightArmNode;
  1182.  
  1183.     objBreakOut.m_velocity=1.0f;
  1184.     objBreakOut.m_radians=0.0f;
  1185.     objBreakOut.m_xPos=0.0f;
  1186.     objBreakOut.m_yPos=10.0f;
  1187.     objBreakOut.m_zPos=0.0f;
  1188.  
  1189.     root=node("root");
  1190.     root->f=BreakOut;
  1191.  
  1192.     //MechRobot
  1193.     objBreakOutNode=node("MechRobot");
  1194.     objBreakOutNode->f=centerMechRobot;
  1195.     objBreakOutNode->engine=mechRobotEngine;
  1196.     addChild(root,objBreakOutNode);
  1197.  
  1198.     objTorsoNode=node("Torso");
  1199.     objTorsoNode->f=drawMechRobotTorso;
  1200.     addChild(objBreakOutNode,objTorsoNode);
  1201.  
  1202.     objCanopyNode=node("Canopy");
  1203.     objCanopyNode->f=drawMechRobotCanopy;
  1204.     addChild(objTorsoNode,objCanopyNode);
  1205.  
  1206.     objLeftArmNode=node("Left Arm");
  1207.     objLeftArmNode->f=drawMechRobotLeftArm;
  1208.     addChild(objTorsoNode,objLeftArmNode);
  1209.  
  1210.     objRightArmNode=node("Right Arm");
  1211.     objRightArmNode->f=drawMechRobotRightArm;
  1212.     addChild(objTorsoNode,objRightArmNode);
  1213.     
  1214.     //Enemy
  1215.     objEnemy=node("Enemy");
  1216.     objEnemy->f=Enemy;
  1217.     objEnemy->engine=Enemy_engine;
  1218.     addChild(root,objEnemy);
  1219.  
  1220.     objEnemyBody=node("Enemy Body");
  1221.     objEnemyBody->f=drawEnemy;
  1222.     objEnemyBody->engine=NULL;
  1223.     addChild(objEnemy,objEnemyBody);
  1224.  
  1225. }
  1226. void CMy3DFontView::drawBonusObjectList()
  1227. {
  1228.     int i;
  1229.     int color;
  1230.  
  1231.         setSpecularMaterialColor(1.0f,1.0f,1.0f,1.0f);
  1232.         setMaterialShininess(128.0f);
  1233.  
  1234.         setAmbientMaterialColor(0.3f,0.3f,0.3f,1.0f);
  1235.  
  1236.         for(i=0; i<BONUS_LIST_SIZE; i++)
  1237.         {
  1238.             if(objBonusList[i].m_available_flag==FALSE)
  1239.             {
  1240.                 color=rand()%3;
  1241.                 switch(color)
  1242.                 {
  1243.                 case 0:
  1244.                     setDiffuseMaterialColor(0.8f,0.0f,0.0f,1.0f);
  1245.                     break;
  1246.                 case 1:
  1247.                     setDiffuseMaterialColor(0.0f,0.8f,0.0f,1.0f);
  1248.                     break;
  1249.                 case 2:
  1250.                     setDiffuseMaterialColor(0.0f,0.0f,0.8f,1.0f);
  1251.                     break;
  1252.                 case 3:
  1253.                     setDiffuseMaterialColor(0.8f,0.8f,0.0f,1.0f);
  1254.                     break;
  1255.                 }
  1256.  
  1257.                 glPushMatrix();
  1258.                     glTranslatef(objBonusList[i].m_x,objBonusList[i].m_y,objBonusList[i].m_z);
  1259.                     glRotatef(90.0f,1.0f,0.0f,0.0f);
  1260.                      hyperboloid();
  1261.                 glPopMatrix();
  1262.             }
  1263.         }
  1264. }
  1265. int CMy3DFontView::getObjectCount(int type)
  1266. {
  1267.     int i;
  1268.     int retval=0;
  1269.  
  1270.     if(type==BONUS_TYPE)
  1271.     {
  1272.         for (i=0; i<BONUS_LIST_SIZE; i++)
  1273.         {
  1274.             if(objBonusList[i].m_available_flag==TRUE)
  1275.             {
  1276.                 retval++;
  1277.             }
  1278.         }
  1279.     }
  1280.     return(retval);
  1281. }
  1282. int CMy3DFontView::getBonusObject()
  1283. {
  1284.     int i;
  1285.     for (i=0; i<BONUS_LIST_SIZE; i++)
  1286.     {
  1287.         if (objBonusList[i].m_available_flag==TRUE)
  1288.         {
  1289.             return(i);
  1290.         }
  1291.     }
  1292.     return(-1);
  1293. }
  1294. void CMy3DFontView::bonus_configuration()
  1295. {
  1296.     //Row 1
  1297.     vBonusMap[0][0] = BONUS_TYPE;
  1298.     vBonusMap[0][1] = EMPTY_TYPE;
  1299.     vBonusMap[0][2] = EMPTY_TYPE;
  1300.     vBonusMap[0][3] = EMPTY_TYPE;
  1301.     vBonusMap[0][4] = EMPTY_TYPE;
  1302.     vBonusMap[0][5] = EMPTY_TYPE;
  1303.     vBonusMap[0][6] = EMPTY_TYPE;
  1304.     vBonusMap[0][7] = EMPTY_TYPE;
  1305.     vBonusMap[0][8] = EMPTY_TYPE;
  1306.     vBonusMap[0][9] = EMPTY_TYPE;
  1307.     //Row 2
  1308.     vBonusMap[1][0] = EMPTY_TYPE;
  1309.     vBonusMap[1][1] = EMPTY_TYPE;
  1310.     vBonusMap[1][2] = EMPTY_TYPE;
  1311.     vBonusMap[1][3] = EMPTY_TYPE;
  1312.     vBonusMap[1][4] = EMPTY_TYPE;
  1313.     vBonusMap[1][5] = EMPTY_TYPE;
  1314.     vBonusMap[1][6] = EMPTY_TYPE;
  1315.     vBonusMap[1][7] = EMPTY_TYPE;
  1316.     vBonusMap[1][8] = EMPTY_TYPE;
  1317.     vBonusMap[1][9] = EMPTY_TYPE;
  1318.     //Row 3
  1319.     vBonusMap[2][0] = EMPTY_TYPE;
  1320.     vBonusMap[2][1] = EMPTY_TYPE;
  1321.     vBonusMap[2][2] = EMPTY_TYPE;
  1322.     vBonusMap[2][3] = EMPTY_TYPE;
  1323.     vBonusMap[2][4] = BONUS_TYPE;
  1324.     vBonusMap[2][5] = EMPTY_TYPE;
  1325.     vBonusMap[2][6] = EMPTY_TYPE;
  1326.     vBonusMap[2][7] = EMPTY_TYPE;
  1327.     vBonusMap[2][8] = EMPTY_TYPE;
  1328.     vBonusMap[2][9] = EMPTY_TYPE;
  1329.     //Row 4
  1330.     vBonusMap[3][0] = EMPTY_TYPE;
  1331.     vBonusMap[3][1] = EMPTY_TYPE;
  1332.     vBonusMap[3][2] = EMPTY_TYPE;
  1333.     vBonusMap[3][3] = EMPTY_TYPE;
  1334.     vBonusMap[3][4] = EMPTY_TYPE;
  1335.     vBonusMap[3][5] = BONUS_TYPE;
  1336.     vBonusMap[3][6] = EMPTY_TYPE;
  1337.     vBonusMap[3][7] = EMPTY_TYPE;
  1338.     vBonusMap[3][8] = EMPTY_TYPE;
  1339.     vBonusMap[3][9] = EMPTY_TYPE;
  1340.     //Row 5
  1341.     vBonusMap[4][0] = EMPTY_TYPE;
  1342.     vBonusMap[4][1] = EMPTY_TYPE;
  1343.     vBonusMap[4][2] = EMPTY_TYPE;
  1344.     vBonusMap[4][3] = EMPTY_TYPE;
  1345.     vBonusMap[4][4] = EMPTY_TYPE;
  1346.     vBonusMap[4][5] = EMPTY_TYPE;
  1347.     vBonusMap[4][6] = EMPTY_TYPE;
  1348.     vBonusMap[4][7] = EMPTY_TYPE;
  1349.     vBonusMap[4][8] = EMPTY_TYPE;
  1350.     vBonusMap[4][9] = EMPTY_TYPE;
  1351.     //Row 6
  1352.     vBonusMap[5][0] = EMPTY_TYPE;
  1353.     vBonusMap[5][1] = EMPTY_TYPE;
  1354.     vBonusMap[5][2] = EMPTY_TYPE;
  1355.     vBonusMap[5][3] = EMPTY_TYPE;
  1356.     vBonusMap[5][4] = EMPTY_TYPE;
  1357.     vBonusMap[5][5] = EMPTY_TYPE;
  1358.     vBonusMap[5][6] = EMPTY_TYPE;
  1359.     vBonusMap[5][7] = EMPTY_TYPE;
  1360.     vBonusMap[5][8] = EMPTY_TYPE;
  1361.     vBonusMap[5][9] = BONUS_TYPE;
  1362.     //Row 7
  1363.     vBonusMap[6][0] = EMPTY_TYPE;
  1364.     vBonusMap[6][1] = EMPTY_TYPE;
  1365.     vBonusMap[6][2] = EMPTY_TYPE;
  1366.     vBonusMap[6][3] = EMPTY_TYPE;
  1367.     vBonusMap[6][4] = EMPTY_TYPE;
  1368.     vBonusMap[6][5] = EMPTY_TYPE;
  1369.     vBonusMap[6][6] = EMPTY_TYPE;
  1370.     vBonusMap[6][7] = EMPTY_TYPE;
  1371.     vBonusMap[6][8] = EMPTY_TYPE;
  1372.     vBonusMap[6][9] = EMPTY_TYPE;
  1373.     //Row 8
  1374.     vBonusMap[7][0] = BONUS_TYPE;
  1375.     vBonusMap[7][1] = EMPTY_TYPE;
  1376.     vBonusMap[7][2] = EMPTY_TYPE;
  1377.     vBonusMap[7][3] = EMPTY_TYPE;
  1378.     vBonusMap[7][4] = EMPTY_TYPE;
  1379.     vBonusMap[7][5] = EMPTY_TYPE;
  1380.     vBonusMap[7][6] = EMPTY_TYPE;
  1381.     vBonusMap[7][7] = EMPTY_TYPE;
  1382.     vBonusMap[7][8] = EMPTY_TYPE;
  1383.     vBonusMap[7][9] = EMPTY_TYPE;
  1384.     //Row 9
  1385.     vBonusMap[8][0] = EMPTY_TYPE;
  1386.     vBonusMap[8][1] = EMPTY_TYPE;
  1387.     vBonusMap[8][2] = EMPTY_TYPE;
  1388.     vBonusMap[8][3] = EMPTY_TYPE;
  1389.     vBonusMap[8][4] = EMPTY_TYPE;
  1390.     vBonusMap[8][5] = EMPTY_TYPE;
  1391.     vBonusMap[8][6] = EMPTY_TYPE;
  1392.     vBonusMap[8][7] = EMPTY_TYPE;
  1393.     vBonusMap[8][8] = EMPTY_TYPE;
  1394.     vBonusMap[8][9] = EMPTY_TYPE;
  1395.     //Row 10
  1396.     vBonusMap[9][0] = EMPTY_TYPE;
  1397.     vBonusMap[9][1] = EMPTY_TYPE;
  1398.     vBonusMap[9][2] = EMPTY_TYPE;
  1399.     vBonusMap[9][3] = EMPTY_TYPE;
  1400.     vBonusMap[9][4] = EMPTY_TYPE;
  1401.     vBonusMap[9][5] = BONUS_TYPE;
  1402.     vBonusMap[9][6] = EMPTY_TYPE;
  1403.     vBonusMap[9][7] = EMPTY_TYPE;
  1404.     vBonusMap[9][8] = EMPTY_TYPE;
  1405.     vBonusMap[9][9] = EMPTY_TYPE;
  1406.  
  1407. }
  1408. void CMy3DFontView::buildBonusObject()
  1409. {
  1410.  int i;
  1411.  int j;
  1412.  int index;
  1413.  
  1414.  GLfloat x;
  1415.  GLfloat z;
  1416.  
  1417.     z = -45.0f;
  1418.     for(i=0; i<=9; i++)
  1419.     {
  1420.         x = -45.0f;
  1421.  
  1422.         for(j=0; j<=9; j++)
  1423.         {
  1424.             if(vBonusMap[i][j] == BONUS_TYPE)
  1425.             {
  1426.                 index=getBonusObject();
  1427.                 objBonusList[index].m_available_flag=FALSE;
  1428.                 //objBonusList[index].m_active_flag=TRUE;
  1429.                 objBonusList[index].m_x=x;
  1430.                 objBonusList[index].m_y=1.5f;
  1431.                 objBonusList[index].m_z=z;
  1432.             }
  1433.             x = x + (GRID_SIZE/10);
  1434.         }
  1435.         z = z + (GRID_SIZE/10);
  1436.     }    
  1437.  
  1438. }
  1439.  
  1440. void drawTieFighter()
  1441. {
  1442.     float tiefighterDrawingCoordinates[200][3];
  1443.     int i;
  1444.     float v[3][3];
  1445.     float normal[3];    
  1446.     float xa,xb,xc,xd,xe,xf,xg,xh,xi,xj;
  1447.     float ya,yb,yc,yd,ye,yf,yg;
  1448.     float za,zb,zc,zd,ze,zf,zg;
  1449.     float scale;
  1450.  
  1451.     scale=10.0f;
  1452.  
  1453.     xa = -55.0f/scale;
  1454.     xb = -30.0f/scale;
  1455.     xc = 30.0f/scale;
  1456.     xd = 55.0f/scale;
  1457.     xe = -5.0f/scale;
  1458.     xf = 0.0f/scale;
  1459.     xg = 5.0f/scale;
  1460.     xh = -40.0f/scale;
  1461.     xi = 40.0f/scale;
  1462.     xj = 0.0f;
  1463.  
  1464.     ya = 70.0f/scale;
  1465.     yb = 0.0f;
  1466.     yc = -70.0f/scale;
  1467.     yd = 7.0f/scale; 
  1468.     ye = -7.0f/scale;
  1469.     yf = 40.0f/scale;
  1470.     yg = -40.0f/scale; 
  1471.     
  1472.     za = 80.0f/scale; 
  1473.     zb = 15.0f/scale;
  1474.     zc = -15.0f/scale;
  1475.     zd = -80.0f/scale; 
  1476.     ze = 40.0f/scale;
  1477.     zf = 0.0f/scale; 
  1478.     zg = -40.0f/scale;
  1479.  
  1480.     //Cockpit
  1481.     tiefighterDrawingCoordinates[0][0] = xj;
  1482.     tiefighterDrawingCoordinates[0][1] = yf;
  1483.     tiefighterDrawingCoordinates[0][2] = zf;
  1484.     tiefighterDrawingCoordinates[1][0] = xj;
  1485.     tiefighterDrawingCoordinates[1][1] = yb;
  1486.     tiefighterDrawingCoordinates[1][2] = ze;
  1487.     tiefighterDrawingCoordinates[2][0] = xi;
  1488.     tiefighterDrawingCoordinates[2][1] = yb;
  1489.     tiefighterDrawingCoordinates[2][2] = zf;
  1490.  
  1491.     tiefighterDrawingCoordinates[3][0] = xj;
  1492.     tiefighterDrawingCoordinates[3][1] = yb;
  1493.     tiefighterDrawingCoordinates[3][2] = zg;
  1494.     tiefighterDrawingCoordinates[4][0] = xj;
  1495.     tiefighterDrawingCoordinates[4][1] = yf;
  1496.     tiefighterDrawingCoordinates[4][2] = zf;
  1497.     tiefighterDrawingCoordinates[5][0] = xi;
  1498.     tiefighterDrawingCoordinates[5][1] = yb;
  1499.     tiefighterDrawingCoordinates[5][2] = zf;
  1500.  
  1501.     tiefighterDrawingCoordinates[6][0] = xi;
  1502.     tiefighterDrawingCoordinates[6][1] = yb;
  1503.     tiefighterDrawingCoordinates[6][2] = zf;
  1504.     tiefighterDrawingCoordinates[7][0] = xj;
  1505.     tiefighterDrawingCoordinates[7][1] = yb;
  1506.     tiefighterDrawingCoordinates[7][2] = ze;
  1507.     tiefighterDrawingCoordinates[8][0] = xj;
  1508.     tiefighterDrawingCoordinates[8][1] = yg;
  1509.     tiefighterDrawingCoordinates[8][2] = zf;
  1510.  
  1511.     tiefighterDrawingCoordinates[9][0] = xj;
  1512.     tiefighterDrawingCoordinates[9][1] = yb;
  1513.     tiefighterDrawingCoordinates[9][2] = zg;
  1514.     tiefighterDrawingCoordinates[10][0] = xi;
  1515.     tiefighterDrawingCoordinates[10][1] = yb;
  1516.     tiefighterDrawingCoordinates[10][2] = zf;
  1517.     tiefighterDrawingCoordinates[11][0] = xj;
  1518.     tiefighterDrawingCoordinates[11][1] = yg;
  1519.     tiefighterDrawingCoordinates[11][2] = zf;
  1520.  
  1521.     tiefighterDrawingCoordinates[12][0] = xh;
  1522.     tiefighterDrawingCoordinates[12][1] = yb;
  1523.     tiefighterDrawingCoordinates[12][2] = zf;
  1524.     tiefighterDrawingCoordinates[13][0] = xj;
  1525.     tiefighterDrawingCoordinates[13][1] = yf;
  1526.     tiefighterDrawingCoordinates[13][2] = zf;
  1527.     tiefighterDrawingCoordinates[14][0] = xj;
  1528.     tiefighterDrawingCoordinates[14][1] = yb;
  1529.     tiefighterDrawingCoordinates[14][2] = zg;
  1530.  
  1531.     tiefighterDrawingCoordinates[15][0] = xj;
  1532.     tiefighterDrawingCoordinates[15][1] = yf;
  1533.     tiefighterDrawingCoordinates[15][2] = zf;
  1534.     tiefighterDrawingCoordinates[16][0] = xh;
  1535.     tiefighterDrawingCoordinates[16][1] = yb;
  1536.     tiefighterDrawingCoordinates[16][2] = zf;
  1537.     tiefighterDrawingCoordinates[17][0] = xj;
  1538.     tiefighterDrawingCoordinates[17][1] = yb;
  1539.     tiefighterDrawingCoordinates[17][2] = ze;
  1540.  
  1541.     tiefighterDrawingCoordinates[18][0] = xh;
  1542.     tiefighterDrawingCoordinates[18][1] = yb;
  1543.     tiefighterDrawingCoordinates[18][2] = zf;
  1544.     tiefighterDrawingCoordinates[19][0] = xj;
  1545.     tiefighterDrawingCoordinates[19][1] = yg;
  1546.     tiefighterDrawingCoordinates[19][2] = zf;
  1547.     tiefighterDrawingCoordinates[20][0] = xj;
  1548.     tiefighterDrawingCoordinates[20][1] = yb;
  1549.     tiefighterDrawingCoordinates[20][2] = ze;
  1550.  
  1551.     tiefighterDrawingCoordinates[21][0] = xh;
  1552.     tiefighterDrawingCoordinates[21][1] = yb;
  1553.     tiefighterDrawingCoordinates[21][2] = zf;
  1554.     tiefighterDrawingCoordinates[22][0] = xj;
  1555.     tiefighterDrawingCoordinates[22][1] = yb;
  1556.     tiefighterDrawingCoordinates[22][2] = zg;
  1557.     tiefighterDrawingCoordinates[23][0] = xj;
  1558.     tiefighterDrawingCoordinates[23][1] = yg;
  1559.     tiefighterDrawingCoordinates[23][2] = zf;
  1560.  
  1561.     //left strut
  1562.     tiefighterDrawingCoordinates[24][0] = xj;
  1563.     tiefighterDrawingCoordinates[24][1] = yb;
  1564.     tiefighterDrawingCoordinates[24][2] = zb;
  1565.     tiefighterDrawingCoordinates[25][0] = xf;
  1566.     tiefighterDrawingCoordinates[25][1] = yd;
  1567.     tiefighterDrawingCoordinates[25][2] = za;
  1568.     tiefighterDrawingCoordinates[26][0] = xg;
  1569.     tiefighterDrawingCoordinates[26][1] = ye;
  1570.     tiefighterDrawingCoordinates[26][2] = za;
  1571.  
  1572.     tiefighterDrawingCoordinates[27][0] = xj;
  1573.     tiefighterDrawingCoordinates[27][1] = yb;
  1574.     tiefighterDrawingCoordinates[27][2] = zb;
  1575.     tiefighterDrawingCoordinates[28][0] = xe;
  1576.     tiefighterDrawingCoordinates[28][1] = ye;
  1577.     tiefighterDrawingCoordinates[28][2] = za;
  1578.     tiefighterDrawingCoordinates[29][0] = xf;
  1579.     tiefighterDrawingCoordinates[29][1] = yd;
  1580.     tiefighterDrawingCoordinates[29][2] = za;
  1581.  
  1582.     tiefighterDrawingCoordinates[30][0] = xg;
  1583.     tiefighterDrawingCoordinates[30][1] = ye;
  1584.     tiefighterDrawingCoordinates[30][2] = za;
  1585.     tiefighterDrawingCoordinates[31][0] = xe;
  1586.     tiefighterDrawingCoordinates[31][1] = ye;
  1587.     tiefighterDrawingCoordinates[31][2] = za;
  1588.     tiefighterDrawingCoordinates[32][0] = xj;
  1589.     tiefighterDrawingCoordinates[32][1] = yb;
  1590.     tiefighterDrawingCoordinates[32][2] = zb;
  1591.  
  1592.     //right strut
  1593.     tiefighterDrawingCoordinates[33][0] = xe;
  1594.     tiefighterDrawingCoordinates[33][1] = ye;
  1595.     tiefighterDrawingCoordinates[33][2] = zd;
  1596.     tiefighterDrawingCoordinates[34][0] = xj;
  1597.     tiefighterDrawingCoordinates[34][1] = yb;
  1598.     tiefighterDrawingCoordinates[34][2] = zc;
  1599.     tiefighterDrawingCoordinates[35][0] = xf;
  1600.     tiefighterDrawingCoordinates[35][1] = yd;
  1601.     tiefighterDrawingCoordinates[35][2] = zd;
  1602.  
  1603.     tiefighterDrawingCoordinates[36][0] = xf;
  1604.     tiefighterDrawingCoordinates[36][1] = yd;
  1605.     tiefighterDrawingCoordinates[36][2] = zd;
  1606.     tiefighterDrawingCoordinates[37][0] = xj;
  1607.     tiefighterDrawingCoordinates[37][1] = yb;
  1608.     tiefighterDrawingCoordinates[37][2] = zc;
  1609.     tiefighterDrawingCoordinates[38][0] = xg;
  1610.     tiefighterDrawingCoordinates[38][1] = ye;
  1611.     tiefighterDrawingCoordinates[38][2] = zd;
  1612.  
  1613.     tiefighterDrawingCoordinates[39][0] = xg;
  1614.     tiefighterDrawingCoordinates[39][1] = ye;
  1615.     tiefighterDrawingCoordinates[39][2] = zd;
  1616.     tiefighterDrawingCoordinates[40][0] = xj;
  1617.     tiefighterDrawingCoordinates[40][1] = yb;
  1618.     tiefighterDrawingCoordinates[40][2] = zc;
  1619.     tiefighterDrawingCoordinates[41][0] = xe;
  1620.     tiefighterDrawingCoordinates[41][1] = ye;
  1621.     tiefighterDrawingCoordinates[41][2] = zd;
  1622.  
  1623.     //left "wing"
  1624.     tiefighterDrawingCoordinates[42][0] = xb;
  1625.     tiefighterDrawingCoordinates[42][1] = ya;
  1626.     tiefighterDrawingCoordinates[42][2] = za;
  1627.     tiefighterDrawingCoordinates[43][0] = xa;
  1628.     tiefighterDrawingCoordinates[43][1] = yb;
  1629.     tiefighterDrawingCoordinates[43][2] = za;
  1630.     tiefighterDrawingCoordinates[44][0] = xb;
  1631.     tiefighterDrawingCoordinates[44][1] = yc;
  1632.     tiefighterDrawingCoordinates[44][2] = za;
  1633.  
  1634.     tiefighterDrawingCoordinates[45][0] = xb;
  1635.     tiefighterDrawingCoordinates[45][1] = yc;
  1636.     tiefighterDrawingCoordinates[45][2] = za;
  1637.     tiefighterDrawingCoordinates[46][0] = xc;
  1638.     tiefighterDrawingCoordinates[46][1] = yc;
  1639.     tiefighterDrawingCoordinates[46][2] = za;
  1640.     tiefighterDrawingCoordinates[47][0] = xb;
  1641.     tiefighterDrawingCoordinates[47][1] = ya;
  1642.     tiefighterDrawingCoordinates[47][2] = za;
  1643.  
  1644.     tiefighterDrawingCoordinates[48][0] = xb;
  1645.     tiefighterDrawingCoordinates[48][1] = ya;
  1646.     tiefighterDrawingCoordinates[48][2] = za;
  1647.     tiefighterDrawingCoordinates[49][0] = xc;
  1648.     tiefighterDrawingCoordinates[49][1] = yc;
  1649.     tiefighterDrawingCoordinates[49][2] = za;
  1650.     tiefighterDrawingCoordinates[50][0] = xc;
  1651.     tiefighterDrawingCoordinates[50][1] = ya;
  1652.     tiefighterDrawingCoordinates[50][2] = za;
  1653.  
  1654.     tiefighterDrawingCoordinates[51][0] = xc;
  1655.     tiefighterDrawingCoordinates[51][1] = ya;
  1656.     tiefighterDrawingCoordinates[51][2] = za;
  1657.     tiefighterDrawingCoordinates[52][0] = xc;
  1658.     tiefighterDrawingCoordinates[52][1] = yc;
  1659.     tiefighterDrawingCoordinates[52][2] = za;
  1660.     tiefighterDrawingCoordinates[53][0] = xd;
  1661.     tiefighterDrawingCoordinates[53][1] = yb;
  1662.     tiefighterDrawingCoordinates[53][2] = za;
  1663.  
  1664.     //Must redraw left "wing" due to rear face culling.
  1665.     tiefighterDrawingCoordinates[54][0] = xa;
  1666.     tiefighterDrawingCoordinates[54][1] = yb;
  1667.     tiefighterDrawingCoordinates[54][2] = za;
  1668.     tiefighterDrawingCoordinates[55][0] = xb;
  1669.     tiefighterDrawingCoordinates[55][1] = ya;
  1670.     tiefighterDrawingCoordinates[55][2] = za;
  1671.     tiefighterDrawingCoordinates[56][0] = xb;
  1672.     tiefighterDrawingCoordinates[56][1] = yc;
  1673.     tiefighterDrawingCoordinates[56][2] = za;
  1674.  
  1675.     tiefighterDrawingCoordinates[57][0] = xc;
  1676.     tiefighterDrawingCoordinates[57][1] = yc;
  1677.     tiefighterDrawingCoordinates[57][2] = za;
  1678.     tiefighterDrawingCoordinates[58][0] = xb;
  1679.     tiefighterDrawingCoordinates[58][1] = yc;
  1680.     tiefighterDrawingCoordinates[58][2] = za;
  1681.     tiefighterDrawingCoordinates[59][0] = xb;
  1682.     tiefighterDrawingCoordinates[59][1] = ya;
  1683.     tiefighterDrawingCoordinates[59][2] = za;
  1684.  
  1685.     tiefighterDrawingCoordinates[60][0] = xc;
  1686.     tiefighterDrawingCoordinates[60][1] = yc;
  1687.     tiefighterDrawingCoordinates[60][2] = za;
  1688.     tiefighterDrawingCoordinates[61][0] = xb;
  1689.     tiefighterDrawingCoordinates[61][1] = ya;
  1690.     tiefighterDrawingCoordinates[61][2] = za;
  1691.     tiefighterDrawingCoordinates[62][0] = xc;
  1692.     tiefighterDrawingCoordinates[62][1] = ya;
  1693.     tiefighterDrawingCoordinates[62][2] = za;
  1694.  
  1695.     tiefighterDrawingCoordinates[63][0] = xc;
  1696.     tiefighterDrawingCoordinates[63][1] = yc;
  1697.     tiefighterDrawingCoordinates[63][2] = za;
  1698.     tiefighterDrawingCoordinates[64][0] = xc;
  1699.     tiefighterDrawingCoordinates[64][1] = ya;
  1700.     tiefighterDrawingCoordinates[64][2] = za;
  1701.     tiefighterDrawingCoordinates[65][0] = xd;
  1702.     tiefighterDrawingCoordinates[65][1] = yb;
  1703.     tiefighterDrawingCoordinates[65][2] = za;
  1704.  
  1705.     //right "wing"
  1706.     tiefighterDrawingCoordinates[66][0] = xb;
  1707.     tiefighterDrawingCoordinates[66][1] = ya;
  1708.     tiefighterDrawingCoordinates[66][2] = zd;
  1709.     tiefighterDrawingCoordinates[67][0] = xa;
  1710.     tiefighterDrawingCoordinates[67][1] = yb;
  1711.     tiefighterDrawingCoordinates[67][2] = zd;
  1712.     tiefighterDrawingCoordinates[68][0] = xb;
  1713.     tiefighterDrawingCoordinates[68][1] = yc;
  1714.     tiefighterDrawingCoordinates[68][2] = zd;
  1715.  
  1716.     tiefighterDrawingCoordinates[69][0] = xb;
  1717.     tiefighterDrawingCoordinates[69][1] = yc;
  1718.     tiefighterDrawingCoordinates[69][2] = zd;
  1719.     tiefighterDrawingCoordinates[70][0] = xc;
  1720.     tiefighterDrawingCoordinates[70][1] = ya;
  1721.     tiefighterDrawingCoordinates[70][2] = zd;
  1722.     tiefighterDrawingCoordinates[71][0] = xb;
  1723.     tiefighterDrawingCoordinates[71][1] = ya;
  1724.     tiefighterDrawingCoordinates[71][2] = zd;
  1725.  
  1726.     tiefighterDrawingCoordinates[72][0] = xc;
  1727.     tiefighterDrawingCoordinates[72][1] = ya;
  1728.     tiefighterDrawingCoordinates[72][2] = zd;
  1729.     tiefighterDrawingCoordinates[73][0] = xb;
  1730.     tiefighterDrawingCoordinates[73][1] = yc;
  1731.     tiefighterDrawingCoordinates[73][2] = zd;
  1732.     tiefighterDrawingCoordinates[74][0] = xc;
  1733.     tiefighterDrawingCoordinates[74][1] = yc;
  1734.     tiefighterDrawingCoordinates[74][2] = zd;
  1735.  
  1736.     tiefighterDrawingCoordinates[75][0] = xc;
  1737.     tiefighterDrawingCoordinates[75][1] = yc;
  1738.     tiefighterDrawingCoordinates[75][2] = zd;
  1739.     tiefighterDrawingCoordinates[76][0] = xd;
  1740.     tiefighterDrawingCoordinates[76][1] = yb;
  1741.     tiefighterDrawingCoordinates[76][2] = zd;
  1742.     tiefighterDrawingCoordinates[77][0] = xc;
  1743.     tiefighterDrawingCoordinates[77][1] = ya;
  1744.     tiefighterDrawingCoordinates[77][2] = zd;
  1745.  
  1746.     //Must redraw the right "wing" due to rear face culling
  1747.     tiefighterDrawingCoordinates[78][0] = xa;
  1748.     tiefighterDrawingCoordinates[78][1] = yb;
  1749.     tiefighterDrawingCoordinates[78][2] = zd;
  1750.     tiefighterDrawingCoordinates[79][0] = xb;
  1751.     tiefighterDrawingCoordinates[79][1] = ya;
  1752.     tiefighterDrawingCoordinates[79][2] = zd;
  1753.     tiefighterDrawingCoordinates[80][0] = xb;
  1754.     tiefighterDrawingCoordinates[80][1] = yc;
  1755.     tiefighterDrawingCoordinates[80][2] = zd;
  1756.  
  1757.     tiefighterDrawingCoordinates[81][0] = xc;
  1758.     tiefighterDrawingCoordinates[81][1] = ya;
  1759.     tiefighterDrawingCoordinates[81][2] = zd;
  1760.     tiefighterDrawingCoordinates[82][0] = xb;
  1761.     tiefighterDrawingCoordinates[82][1] = yc;
  1762.     tiefighterDrawingCoordinates[82][2] = zd;
  1763.     tiefighterDrawingCoordinates[83][0] = xb;
  1764.     tiefighterDrawingCoordinates[83][1] = ya;
  1765.     tiefighterDrawingCoordinates[83][2] = zd;
  1766.  
  1767.     tiefighterDrawingCoordinates[84][0] = xb;
  1768.     tiefighterDrawingCoordinates[84][1] = yc;
  1769.     tiefighterDrawingCoordinates[84][2] = zd;
  1770.     tiefighterDrawingCoordinates[85][0] = xc;
  1771.     tiefighterDrawingCoordinates[85][1] = ya;
  1772.     tiefighterDrawingCoordinates[85][2] = zd;
  1773.     tiefighterDrawingCoordinates[86][0] = xc;
  1774.     tiefighterDrawingCoordinates[86][1] = yc;
  1775.     tiefighterDrawingCoordinates[86][2] = zd;
  1776.  
  1777.     tiefighterDrawingCoordinates[87][0] = xd;
  1778.     tiefighterDrawingCoordinates[87][1] = yb;
  1779.     tiefighterDrawingCoordinates[87][2] = zd;
  1780.     tiefighterDrawingCoordinates[88][0] = xc;
  1781.     tiefighterDrawingCoordinates[88][1] = yc;
  1782.     tiefighterDrawingCoordinates[88][2] = zd;
  1783.     tiefighterDrawingCoordinates[89][0] = xc;
  1784.     tiefighterDrawingCoordinates[89][1] = ya;
  1785.     tiefighterDrawingCoordinates[89][2] = zd;
  1786.  
  1787.     for (i = 0; i < 30; i++)
  1788.     {
  1789.         v[0][0] = tiefighterDrawingCoordinates[i*3][0];
  1790.         v[0][1] = tiefighterDrawingCoordinates[i*3][1];
  1791.         v[0][2] = tiefighterDrawingCoordinates[i*3][2];
  1792.         v[1][0] = tiefighterDrawingCoordinates[(i*3)+1][0];
  1793.         v[1][1] = tiefighterDrawingCoordinates[(i*3)+1][1];
  1794.         v[1][2] = tiefighterDrawingCoordinates[(i*3)+1][2];
  1795.         v[2][0] = tiefighterDrawingCoordinates[(i*3)+2][0];
  1796.         v[2][1] = tiefighterDrawingCoordinates[(i*3)+2][1];
  1797.         v[2][2] = tiefighterDrawingCoordinates[(i*3)+2][2];    
  1798.  
  1799.         calcNormal(v,normal);
  1800.         glBegin(GL_TRIANGLES);
  1801.             glNormal3fv(normal);    
  1802.             glVertex3fv(v[0]);
  1803.             glVertex3fv(v[1]);
  1804.             glVertex3fv(v[2]);
  1805.         glEnd();
  1806.     } 
  1807.  
  1808. }
  1809.  
  1810. void buildMechRobotCanopy (void)
  1811. {
  1812.  
  1813.     glPolygonMode(GL_FRONT,GL_FILL);
  1814.     /*right window*/
  1815.    glBegin(GL_POLYGON);
  1816.      
  1817.     glNormal3f(0.0f,0.83f,0.55f);
  1818.  
  1819.      glVertex3f(-1.0f,4.0f,0.0f);
  1820.  
  1821.      glVertex3f(-3.0f,3.0f,1.5f);
  1822.  
  1823.      glVertex3f(-3.0f,2.0f,3.0f);
  1824.  
  1825.      glVertex3f(4.0f,2.0f,3.0f);
  1826.  
  1827.      glVertex3f(2.0f,4.0f,0.0f);
  1828.    glEnd();
  1829.    
  1830.    /*left window*/
  1831.    glBegin(GL_POLYGON);
  1832.      glNormal3f(0.0f,0.83f,-0.55f);
  1833.      glVertex3f(2.0f,4.0f,0.0f);
  1834.      glVertex3f(4.0f,2.0f,-3.0f);
  1835.      glVertex3f(-3.0f,2.0f,-3.0f);
  1836.      glVertex3f(-3.0f,3.0f,-1.5f);
  1837.      glVertex3f(-1.0f,4.0f,0.0f);
  1838.    glEnd();
  1839.    
  1840.    /*bottom window*/
  1841.    glBegin(GL_POLYGON);
  1842.      glNormal3f(0.0f,-1.0f,0.0f);
  1843.      glVertex3f(4.0f,2.0f,3.0f);
  1844.      glVertex3f(4.0f,2.0f,-3.0f);
  1845.      glVertex3f(-3.0f,2.0f,-3.0f);
  1846.      glVertex3f(-3.0f,2.0f,3.0f);
  1847.    glEnd();
  1848.  
  1849.    /*back wall*/
  1850.    glBegin(GL_POLYGON);
  1851.      glNormal3f(-1.0f,0.0f,0.0f);
  1852.      glVertex3f(-3.0f,3.0f,1.5f);
  1853.      glVertex3f(-3.0f,3.0f,-1.5f);
  1854.      glVertex3f(-3.0f,2.0f,-3.0f);
  1855.      glVertex3f(-3.0f,2.0f,3.0f);
  1856.    glEnd();
  1857.  
  1858.    /*front window*/
  1859.    glBegin(GL_TRIANGLES);
  1860.      glNormal3f(0.71f,0.71f,0.0f);
  1861.      glVertex3f(2.0f,4.0f,0.0f);
  1862.      glVertex3f(4.0f,2.0f,3.0f);
  1863.      glVertex3f(4.0f,2.0f,-3.0f);
  1864.    glEnd();
  1865.  
  1866.    /*back window*/
  1867.    glBegin(GL_TRIANGLES);
  1868.      glNormal3f(-0.45f,0.89f,0.0f);
  1869.      glVertex3f(-1.0f,4.0f,0.0f);
  1870.      glVertex3f(-3.0f,3.0f,-1.5f);
  1871.      glVertex3f(-3.0f,3.0f,1.5f);
  1872.    glEnd();
  1873. }
  1874. void buildMechRobotTorso (void)
  1875. {
  1876.     glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  1877.      
  1878.     /*right top body*/
  1879.     glBegin(GL_POLYGON);
  1880.         glNormal3f(0.0f,0.71f,0.71f);
  1881.         glVertex3f(-3.0f,2.0f,3.0f);
  1882.         glVertex3f(-3.0f,1.0f,4.0f);
  1883.         glVertex3f(3.0f,1.0f,4.0f);
  1884.         glVertex3f(4.0f,2.0f,3.0f);
  1885.     glEnd();
  1886.    
  1887.    /*right bottom body*/
  1888.    glBegin(GL_POLYGON);
  1889.      glNormal3f(0.0f,-0.71f,0.71f);
  1890.      glVertex3f(-3.0f,1.0f,4.0f);
  1891.      glVertex3f(-3.0f,0.0f,3.0f);
  1892.      glVertex3f(5.0f,0.0f,3.0f);
  1893.      glVertex3f(3.0f,1.0f,4.0f);
  1894.    glEnd();
  1895.  
  1896.    /*left top body*/
  1897.    glBegin(GL_POLYGON);
  1898.      glNormal3f(0.0f,0.71f,-0.71f);
  1899.      glVertex3f(-3.0f,2.0f,-3.0f);
  1900.      glVertex3f(4.0f,2.0f,-3.0f);
  1901.      glVertex3f(3.0f,1.0f,-4.0f);
  1902.      glVertex3f(-3.0f,1.0f,-4.0f);
  1903.    glEnd();
  1904.  
  1905.    /*left bottom body*/
  1906.    glBegin(GL_POLYGON);
  1907.      glNormal3f(0.0f,-0.71f,-0.71f);
  1908.      glVertex3f(-3.0f,1.0f,-4.0f);
  1909.      glVertex3f(3.0f,1.0f,-4.0f);
  1910.      glVertex3f(5.0f,0.0f,-3.0f);
  1911.      glVertex3f(-3.0f,0.0f,-3.0f);
  1912.    glEnd();
  1913.  
  1914.    /* right front top */
  1915.    glBegin(GL_TRIANGLES);
  1916.      glNormal3f(0.41f,0.41f,0.82f);
  1917.      glVertex3f(4.0f,2.0f,3.0f);
  1918.      glVertex3f(3.0f,1.0f,4.0f);
  1919.      glVertex3f(7.0f,1.0f,2.0f);
  1920.      //glVertex3f(7.0f,1.0f,2.0f);
  1921.      //glVertex3f(7.0f,1.0f,-2.0f);
  1922.      //glVertex3f(4.0f,2.0f,-3.0f);
  1923.    glEnd();
  1924.  
  1925.    /*right front bottom*/
  1926.    glBegin(GL_TRIANGLES);
  1927.      glNormal3f(0.45f,0.0f,0.89f);
  1928.      glVertex3f(3.0f,1.0f,4.0f);
  1929.      glVertex3f(5.0f,0.0f,3.0f);
  1930.      glVertex3f(7.0f,1.0f,2.0f);
  1931.    glEnd();
  1932.  
  1933.    /*left front top*/
  1934.    glBegin(GL_TRIANGLES);
  1935.      glNormal3f(0.41f,0.41f,-0.82f);
  1936.      glVertex3f(4.0f,2.0f,-3.0f);
  1937.      glVertex3f(7.0f,1.0f,-2.0f);
  1938.      glVertex3f(3.0f,1.0f,-4.0f);
  1939.    glEnd();
  1940.  
  1941.    /*left front bottom*/
  1942.    glBegin(GL_TRIANGLES);
  1943.      glNormal3f(0.45f,0.0f,-0.89f);
  1944.      glVertex3f(5.0f,0.0f,-3.0f);
  1945.      glVertex3f(3.0f,1.0f,-4.0f);
  1946.      glVertex3f(7.0f,1.0f,-2.0f);
  1947.    glEnd();
  1948.  
  1949.    /*front top*/
  1950.    glBegin(GL_POLYGON);
  1951.      glNormal3f(0.32f,0.95f,0.0f);
  1952.      glVertex3f(4.0f,2.0f,3.0f);
  1953.      glVertex3f(7.0f,1.0f,2.0f);
  1954.      glVertex3f(7.0f,1.0f,-2.0f);
  1955.      glVertex3f(4.0f,2.0f,-3.0f);
  1956.    glEnd();
  1957.  
  1958.    /*front bottom*/
  1959.    glBegin(GL_POLYGON);
  1960.      glNormal3f(0.45f,0.89f,0.0f);
  1961.      glVertex3f(5.0f,0.0f,3.0f);
  1962.      glVertex3f(5.0f,0.0f,-3.0f);
  1963.      glVertex3f(7.0f,1.0f,-2.0f);
  1964.      glVertex3f(7.0f,1.0f,2.0f);
  1965.    glEnd();
  1966.    
  1967.    /*back*/
  1968.    glBegin(GL_POLYGON);
  1969.      glNormal3f(1.0f,0.0f,0.0f);
  1970.      glVertex3f(-3.0f,2.0f,3.0f);
  1971.      glVertex3f(-3.0f,1.0f,4.0f);
  1972.      glVertex3f(-3.0f,0.0f,3.0f);
  1973.      glVertex3f(-3.0f,0.0f,-3.0f);
  1974.      glVertex3f(-3.0f,1.0f,-4.0f);
  1975.      glVertex3f(-3.0f,2.0f,-3.0f);
  1976.    glEnd();
  1977.  
  1978.    /*top*/
  1979.    glBegin(GL_POLYGON);
  1980.      glNormal3f(-0.27f,0.96f,0.0f);
  1981.      glVertex3f(-3.0f,2.0f,3.0f);
  1982.      glVertex3f(4.0f,2.0f,3.0f);
  1983.      glVertex3f(4.0f,2.0f,-3.0f);
  1984.      glVertex3f(-3.0f,2.0f,-3.0f);
  1985.    glEnd();
  1986.  
  1987.    /*bottom*/
  1988.    glBegin(GL_POLYGON);  
  1989.      glNormal3f(0.0f,-1.0f,0.0f);
  1990.      glVertex3f(-3.0f,0.0f,-3.0f);
  1991.      glVertex3f(5.0f,0.0f,-3.0f);
  1992.      glVertex3f(5.0f,0.0f,3.0f);
  1993.      glVertex3f(-3.0f,0.0f,3.0f);
  1994.    glEnd();
  1995.    
  1996.    /*top back right*/
  1997.    glBegin(GL_POLYGON);
  1998.      glNormal3f(0.0f,0.71f,0.71f);
  1999.      glVertex3f(-5.0f,4.0f,3.0f);
  2000.      glVertex3f(-5.0f,3.0f,4.0f);
  2001.      glVertex3f(-3.0f,3.0f,4.0f);
  2002.      glVertex3f(-3.0f,4.0f,3.0f);
  2003.    glEnd();
  2004.    
  2005.    /*top back left*/
  2006.    glBegin(GL_POLYGON);
  2007.      glNormal3f(0.0f,0.71f,-0.71f);
  2008.      glVertex3f(-3.0f,4.0f,-3.0f);
  2009.      glVertex3f(-3.0f,3.0f,-4.0f);
  2010.      glVertex3f(-5.0f,3.0f,-4.0f);
  2011.      glVertex3f(-5.0f,4.0f,-3.0f);
  2012.    glEnd();
  2013.  
  2014.    /*top back*/
  2015.    glBegin(GL_POLYGON);
  2016.      glNormal3f(0.0f,1.0f,0.0f);
  2017.      glVertex3f(-5.0f,4.0f,3.0f);
  2018.      glVertex3f(-3.0f,4.0f,3.0f);
  2019.      glVertex3f(-3.0f,4.0f,-3.0f);
  2020.      glVertex3f(-5.0f,4.0f,-3.0f);
  2021.    glEnd();
  2022.  
  2023.    /*bottom back*/
  2024.    glBegin(GL_POLYGON);
  2025.      glNormal3f(0.0f,-1.0f,0.0f);
  2026.      glVertex3f(-5.0f,0.0f,3.0f);
  2027.      glVertex3f(-5.0f,0.0f,-3.0f);
  2028.      glVertex3f(-3.0f,0.0f,-3.0f);
  2029.      glVertex3f(-3.0f,0.0f,3.0f);
  2030.    glEnd();
  2031.  
  2032.    /*bottom right back*/
  2033.    glBegin(GL_POLYGON);
  2034.      glNormal3f(0.0f,-0.71f,0.71f);
  2035.      glVertex3f(-5.0f,1.0f,4.0f);
  2036.      glVertex3f(-5.0f,0.0f,3.0f);
  2037.      glVertex3f(-3.0f,0.0f,3.0f);
  2038.      glVertex3f(-3.0f,1.0f,4.0f);
  2039.    glEnd();
  2040.  
  2041.    /*bottom left back*/
  2042.    glBegin(GL_POLYGON);
  2043.      glNormal3f(0.0f,-0.71f,-0.71f);
  2044.      glVertex3f(-5.0f,1.0f,-4.0f);
  2045.      glVertex3f(-3.0f,1.0f,-4.0f);
  2046.      glVertex3f(-3.0f,0.0f,-3.0f);
  2047.      glVertex3f(-5.0f,0.0f,-3.0f);
  2048.    glEnd();
  2049.  
  2050.    /*right back*/
  2051.    glBegin(GL_POLYGON);
  2052.      glNormal3f(0.0f,0.0f,1.0f);
  2053.      glVertex3f(-5.0f,3.0f,4.0f);
  2054.      glVertex3f(-5.0f,1.0f,4.0f);
  2055.      glVertex3f(-3.0f,1.0f,4.0f);
  2056.      glVertex3f(-3.0f,3.0f,4.0f);
  2057.    glEnd();
  2058.  
  2059.    /*left back*/
  2060.    glBegin(GL_POLYGON);
  2061.      glNormal3f(0.0f,0.0f,-1.0f);
  2062.      glVertex3f(-5.0f,3.0f,-4.0f);
  2063.      glVertex3f(-3.0f,3.0f,-4.0f);
  2064.      glVertex3f(-3.0f,1.0f,-4.0f);
  2065.      glVertex3f(-5.0f,1.0f,-4.0f);
  2066.    glEnd();
  2067.  
  2068.    /*back back*/
  2069.    glBegin(GL_POLYGON);
  2070.      glNormal3f(-1.0f,0.0f,0.0f);
  2071.      glVertex3f(-5.0f,4.0f,3.0f);
  2072.      glVertex3f(-5.0f,4.0f,-3.0f);
  2073.      glVertex3f(-5.0f,3.0f,-4.0f);
  2074.      glVertex3f(-5.0f,1.0f,-4.0f);
  2075.      glVertex3f(-5.0f,0.0f,-3.0f);
  2076.      glVertex3f(-5.0f,0.0f,3.0f);
  2077.      glVertex3f(-5.0f,1.0f,4.0f);
  2078.      glVertex3f(-5.0f,3.0f,4.0f);
  2079.    glEnd();
  2080.  
  2081.    /*back front*/
  2082.    glBegin(GL_POLYGON);
  2083.      glNormal3f(1.0f,0.0f,0.0f);
  2084.      glVertex3f(-3.0f,4.0f,3.0f);
  2085.      glVertex3f(-3.0f,3.0f,4.0f);
  2086.      glVertex3f(-3.0f,1.0f,4.0f);
  2087.      glVertex3f(-3.0f,0.0f,3.0f);
  2088.      glVertex3f(-3.0f,0.0f,-3.0f);
  2089.      glVertex3f(-3.0f,1.0f,-4.0f);
  2090.      glVertex3f(-3.0f,3.0f,-4.0f);
  2091.      glVertex3f(-3.0f,4.0f,-3.0f);
  2092.    glEnd();
  2093.    
  2094. }
  2095. void drawMechRobotTorso ()
  2096. {
  2097.     glRotatef(objBreakOut.M_TORSO_ANGLE,0.0f,1.0f,0.0f);
  2098. }
  2099. void drawMechRobotLeftArm ()
  2100. {
  2101.    GLUquadricObj *obj = gluNewQuadric();
  2102.    gluQuadricDrawStyle(obj,GLU_FILL);
  2103.    gluQuadricNormals(obj,GLU_SMOOTH);
  2104.    gluQuadricOrientation(obj,GLU_OUTSIDE);
  2105.  
  2106.     /*left side = 1; right side = 0;*/
  2107.  
  2108.    goldMaterial();
  2109.     //Reduce size by 50 percent
  2110.     glScalef(0.5f,0.5f,0.5f);
  2111.  
  2112.    /*draw the arm*/
  2113.    glPushMatrix();
  2114.  
  2115.  
  2116.         glTranslatef(-4.0f,1.75f,-6.0f);
  2117.         glRotatef(135.0f,1.0f,0.0f,0.0f);
  2118.  
  2119.         gluCylinder(obj,0.5f,0.5f,4.0f,10,1);
  2120.    
  2121.    glPopMatrix();
  2122.    
  2123.    /*draw the shoulder*/
  2124.    glPushMatrix();
  2125.    
  2126.         glTranslatef(-4.0f,2.0f,-5.0f);
  2127.  
  2128.         glTranslatef(0.0f,0.0f,-1.0f);
  2129.         gluCylinder(obj,1.0f,1.0f,2.0f,10,1);
  2130.  
  2131.         glRotatef(180.0f,1.0f,0.0f,0.0f);
  2132.  
  2133.         gluDisk(obj,0,1.0f,100,1);   
  2134.    
  2135.    glPopMatrix();
  2136.    
  2137.    /*draw the cannon*/
  2138.    glPushMatrix();
  2139.    
  2140.         glTranslatef(-5.0f,0.0f,-8.0f);
  2141.  
  2142.         glRotatef(90.0f,0.0f,1.0f,0.0f);
  2143.         glRotatef((GLfloat) objBreakOut.M_ARM_ANGLE,1.0f,0.0f,0.0f);
  2144.         glPushMatrix();
  2145.             glTranslatef(0.0f,0.0f,2.0f);
  2146.             gluDisk(obj,0.0f,1.0f,10,1);
  2147.         glPopMatrix();
  2148.         glPushMatrix();
  2149.             glRotatef(180.0f,1.0f,0.0f,0.0f);
  2150.             gluDisk(obj,0.0f,1.0f,10,1);
  2151.         glPopMatrix();
  2152.         gluCylinder(obj,1.0f,1.0f,2.0f,10,1);
  2153.         gluCylinder(obj,0.5f,0.5f,8.0f,10,1);
  2154.    glPopMatrix();
  2155.    gluDeleteQuadric(obj);
  2156. }
  2157.  
  2158. void drawMechRobotRightArm ()
  2159. {
  2160.    GLUquadricObj *obj = gluNewQuadric();
  2161.    gluQuadricDrawStyle(obj,GLU_FILL);
  2162.    gluQuadricNormals(obj,GLU_SMOOTH);
  2163.    gluQuadricOrientation(obj,GLU_OUTSIDE);
  2164.  
  2165.     /*left side = 1; right side = 0;*/
  2166.  
  2167.    goldMaterial();
  2168.     //Reduce size by 50 percent
  2169.     glScalef(0.5f,0.5f,0.5f);
  2170.  
  2171.    /*draw the arm*/
  2172.    glPushMatrix();
  2173.  
  2174.  
  2175.        glTranslatef(-4.0f,1.75f,6.0f);
  2176.        glRotatef(45.0f,1.0f,0.0f,0.0f);
  2177.  
  2178.        gluCylinder(obj,0.5f,0.5f,4.0f,10,1);
  2179.    
  2180.    glPopMatrix();
  2181.    
  2182.     /*draw the shoulder*/
  2183.     glPushMatrix();
  2184.  
  2185.         glTranslatef(-4.0f,2.0f,5.0f);
  2186.  
  2187.         glTranslatef(0.0f,0.0f,-1.0f);
  2188.         gluCylinder(obj,1.0f,1.0f,2.0f,10,1);
  2189.  
  2190.         glTranslatef(0.0f,0.0f,2.0f);
  2191.  
  2192.         gluDisk(obj,0,1.0f,100,1);   
  2193.  
  2194.     glPopMatrix();
  2195.  
  2196.         /*draw the cannon*/
  2197.     glPushMatrix();
  2198.  
  2199.         glTranslatef(-5.0f,0.0f,8.0f);
  2200.  
  2201.         glRotatef(90.0f,0.0f,1.0f,0.0f);
  2202.         glRotatef((GLfloat)objBreakOut.M_ARM_ANGLE,1.0f,0.0f,0.0f);
  2203.         glPushMatrix();
  2204.             glTranslatef(0.0f,0.0f,2.0f);
  2205.             gluDisk(obj,0.0f,1.0f,10,1);
  2206.             glPopMatrix();
  2207.             glPushMatrix();
  2208.             glRotatef(180.0f,1.0f,0.0f,0.0f);
  2209.             gluDisk(obj,0.0f,1.0f,10,1);
  2210.         glPopMatrix();
  2211.         gluCylinder(obj,1.0f,1.0f,2.0f,10,1);
  2212.         gluCylinder(obj,0.5f,0.5f,8.0f,10,1);
  2213.  
  2214.    glPopMatrix();
  2215.    gluDeleteQuadric(obj);
  2216. }
  2217.  
  2218. void drawMechRobotCanopy()
  2219. {
  2220.     goldMaterial();
  2221.  
  2222.     //Reduce size by 50 percent
  2223.     glScalef(0.5f,0.5f,0.5f);
  2224.  
  2225.     buildMechRobotTorso();
  2226.     buildMechRobotCanopy();
  2227. }
  2228. POSITION_TYPE* moveMechRobot(GLdouble dStep)
  2229. {
  2230.     POSITION_TYPE *myPosition;
  2231.     GLdouble xDelta,zDelta;
  2232.     GLfloat light0pos[4];
  2233.  
  2234.     //checkBonusCollision();
  2235.  
  2236.     xDelta = dStep*cos(objBreakOut.m_radians);
  2237.     zDelta = -dStep*sin(objBreakOut.m_radians);
  2238.  
  2239.     myPosition= (POSITION_TYPE *) malloc (sizeof(POSITION_TYPE));
  2240.  
  2241.     myPosition->x=objBreakOut.m_xPos + (float)xDelta;
  2242.     myPosition->z=objBreakOut.m_zPos + (float)zDelta;
  2243.  
  2244.     if(objBreakOut.m_xPos > GRID_SIZE)
  2245.         myPosition->x = (float) GRID_SIZE;
  2246.  
  2247.     if(objBreakOut.m_xPos < -GRID_SIZE)
  2248.         myPosition->x = (float) -GRID_SIZE;
  2249.     
  2250.     if(objBreakOut.m_zPos > GRID_SIZE)
  2251.        myPosition->z = (float) GRID_SIZE;
  2252.  
  2253.     if(objBreakOut.m_zPos < -GRID_SIZE)
  2254.        myPosition->z = (float) -GRID_SIZE;
  2255.  
  2256.  
  2257.     light0pos[0]=objBreakOut.m_xPos;
  2258.     light0pos[1]=10.0f;
  2259.     light0pos[2]=objBreakOut.m_zPos;
  2260.     light0pos[3]=1.0f;
  2261.  
  2262.     glLightfv(GL_LIGHT0, GL_POSITION, light0pos);
  2263.  
  2264.     return(myPosition);
  2265. }
  2266.  
  2267. void centerMechRobot()
  2268. {
  2269.     static long current_clicks=clock();
  2270.  
  2271.     if (getAsteroidCount()<5)
  2272.     {
  2273.         generateAsteroid();
  2274.     }
  2275.  
  2276.     if (mForceMissileCount>0)
  2277.     {
  2278.         if((clock()-current_clicks)>300)
  2279.         {
  2280.             mForceMissileCount--;
  2281.             fireMechRobotMissile(dRadToDeg(objBreakOut.m_radians+((float)PI/2.0f))+180.0f,0.0f,1.0f);
  2282.             current_clicks=clock();
  2283.         }
  2284.     }
  2285.  
  2286.     drawMechRobotMissiles();
  2287.  
  2288.     drawAsteroids();
  2289.  
  2290.     drawExplosion();
  2291. }
  2292. void mechRobotEngine()
  2293. {
  2294.    POSITION_TYPE *myPosition;
  2295.     GLfloat old_x,old_y,old_z;
  2296.  
  2297.     old_x=objBreakOut.m_xPos;
  2298.     old_y=objBreakOut.m_yPos;
  2299.     old_z=objBreakOut.m_zPos;
  2300.  
  2301.     //Moves the robot into space
  2302.     myPosition=moveMechRobot(objBreakOut.m_velocity);
  2303.  
  2304.     objBreakOut.m_xPos=myPosition->x;
  2305.     objBreakOut.m_zPos=myPosition->z;
  2306.     free(myPosition);
  2307.  
  2308.  
  2309.        if(checkMushRoomCollision(objBreakOut.m_xPos,objBreakOut.m_yPos,objBreakOut.m_zPos)==1)
  2310.     {    
  2311.         objBreakOut.m_xPos=old_x;
  2312.         objBreakOut.m_zPos=old_z;
  2313.     }
  2314.  
  2315.  
  2316.     if(distanceToEnemy(0)<20)
  2317.     {
  2318.         objBreakOut.m_xPos=old_x;
  2319.         objBreakOut.m_zPos=old_z;
  2320.     }
  2321.  
  2322.  
  2323.     glTranslatef(objBreakOut.m_xPos,objBreakOut.m_yPos,objBreakOut.m_zPos);
  2324.     glRotatef(dRadToDeg(objBreakOut.m_radians+((float)PI/2.0f))-90, 0.0f, 1.0f, 0.0f);
  2325. }
  2326. float distanceToEnemy(int index)
  2327. {
  2328.     GLfloat x2,y2,z2;
  2329.     GLfloat distance;
  2330.  
  2331.     x2=EnemyEngine[index].x;
  2332.     y2=EnemyEngine[index].y;
  2333.     z2=EnemyEngine[index].z;
  2334.  
  2335.     distance=(GLfloat) sqrt((objBreakOut.m_xPos-x2)*(objBreakOut.m_xPos-x2)+(objBreakOut.m_yPos-y2)*(objBreakOut.m_yPos-y2)+(objBreakOut.m_zPos-z2)*(objBreakOut.m_zPos-z2));
  2336.  
  2337.     return(distance);
  2338.  
  2339. }
  2340. int checkMechRobotHit(GLfloat x,GLfloat y,GLfloat z)
  2341. {
  2342. int retval;
  2343. GLfloat mechRobot_x,mechRobot_y,mechRobot_z;
  2344. GLfloat vector_x,vector_y,vector_z;
  2345. GLfloat distance;
  2346. int index;
  2347.  
  2348.     retval=0;
  2349.  
  2350.     mechRobot_x=objBreakOut.m_xPos;
  2351.     mechRobot_y=objBreakOut.m_yPos;
  2352.     mechRobot_z=objBreakOut.m_zPos;
  2353.  
  2354.     vector_x=mechRobot_x-x;
  2355.     vector_y=0.0f;
  2356.     vector_z=mechRobot_z-z;
  2357.  
  2358.     distance=(GLfloat) sqrt(vector_x*vector_x+vector_y*vector_y+vector_z*vector_z);
  2359.  
  2360.     if(distance<=10)
  2361.     {
  2362.  
  2363.         index=getAvailableExplosion();
  2364.         if(index>-1)
  2365.         {
  2366.             objExplosion[index].x=x;
  2367.             objExplosion[index].y=y;
  2368.             objExplosion[index].z=z;
  2369.             objExplosion[index].m_cpu_seconds=clock();
  2370.         }
  2371.  
  2372.  
  2373.         //sound("hit.wav");
  2374.         retval=1;
  2375.  
  2376.         return(retval);
  2377.     }
  2378.  
  2379.     return(retval);
  2380. }
  2381.  
  2382. void fireMechRobotMissile(GLfloat Yaw,GLfloat Pitch,GLfloat Vo)
  2383. {
  2384.     GLint i;
  2385.  
  2386.     i=getAvailableBreakOutMissile();
  2387.  
  2388.     if(i>-1)
  2389.     {
  2390.         breakOutMissile[i].m_x=objBreakOut.m_xPos;
  2391.         breakOutMissile[i].m_y=objBreakOut.m_yPos;
  2392.         breakOutMissile[i].m_z=objBreakOut.m_zPos;
  2393.         breakOutMissile[i].m_Vo=15.0f;
  2394.         breakOutMissile[i].m_radians=objBreakOut.m_radians;
  2395.         breakOutMissile[i].m_available_flag=FALSE;
  2396.         //breakOutMissile[i].m_active_flag=TRUE;
  2397.     }
  2398. }
  2399. void drawMechRobotMissiles()
  2400. {
  2401.     GLint i=0;
  2402.     GLfloat x,z;
  2403.     GLfloat distance;
  2404.     GLint retVal;
  2405.  
  2406.     for(i=0; i<NUMBER_OF_MISSILES; i++)
  2407.     {
  2408.         if(breakOutMissile[i].m_available_flag==FALSE)
  2409.         {
  2410.  
  2411.             x=(GLfloat) ((breakOutMissile[i].m_Vo)*cos(breakOutMissile[i].m_radians));
  2412.             z=(GLfloat) (-(breakOutMissile[i].m_Vo)*sin(breakOutMissile[i].m_radians));
  2413.  
  2414.             breakOutMissile[i].m_x += x;
  2415.             breakOutMissile[i].m_z += z;
  2416.  
  2417.               retVal=checkMineHit(breakOutMissile[i].m_x,5.0f,breakOutMissile[i].m_z);
  2418.                 
  2419.              if (retVal==1)
  2420.              {
  2421.                     breakOutMissile[i].m_available_flag=TRUE;
  2422.                     generateMushRoom(breakOutMissile[i].m_x,1.0f,breakOutMissile[i].m_z);
  2423.                     //breakOutMissile[i].m_active_flag=FALSE;
  2424.             }
  2425.             else
  2426.             {
  2427.                 retVal=checkMushRoomHit(breakOutMissile[i].m_x,5.0f,breakOutMissile[i].m_z);
  2428.                 if (retVal==1)
  2429.                 {
  2430.                         breakOutMissile[i].m_available_flag=TRUE;
  2431.                         //breakOutMissile[i].m_active_flag=FALSE;
  2432.                         continue;
  2433.                 }
  2434.             }
  2435.  
  2436.             retVal=checkEnemyHit(breakOutMissile[i].m_x,5.0f,breakOutMissile[i].m_z,0);
  2437.             if (retVal==1)
  2438.             {
  2439.                     breakOutMissile[i].m_available_flag=TRUE;
  2440.                     //breakOutMissile[i].m_active_flag=FALSE;
  2441.                     EnemyEngine[0].m_hit++;
  2442.                     objBreakOut.m_score+=30;
  2443.                     m_subtotal_score+=30;
  2444.  
  2445.             }
  2446.  
  2447.             retVal=checkAsteroidHit(breakOutMissile[i].m_x,5.0f,breakOutMissile[i].m_z,TRUE);
  2448.             if (retVal==1)
  2449.             {
  2450.                     breakOutMissile[i].m_available_flag=TRUE;
  2451.             }
  2452.  
  2453.             glPushMatrix();
  2454.                 glTranslatef(breakOutMissile[i].m_x,breakOutMissile[i].m_y,breakOutMissile[i].m_z);
  2455.                 glScalef(0.5f,0.5f,0.5f);
  2456.  
  2457.                 glPushMatrix();
  2458.                     glRotatef(dRadToDeg(breakOutMissile[i].m_radians),0.0f,1.0f,0.0f);
  2459.                     glTranslatef(0.0f,3.0f,-7.5f);
  2460.                     missileObject();
  2461.                 glPopMatrix();
  2462.  
  2463.                 glPushMatrix();
  2464.                     glRotatef(dRadToDeg(breakOutMissile[i].m_radians),0.0f,1.0f,0.0f);
  2465.                     //Reduce size by 50 percent
  2466.                     glTranslatef(0.0f,3.0f,7.5f);
  2467.                     missileObject();
  2468.                 glPopMatrix();
  2469.  
  2470.                 //Sphere(5,10,10);
  2471.             glPopMatrix();
  2472.  
  2473.             x=objBreakOut.m_xPos-breakOutMissile[i].m_x;
  2474.             z=objBreakOut.m_zPos-breakOutMissile[i].m_z;
  2475.  
  2476.             distance=(GLfloat) sqrt(x*x+breakOutMissile[i].m_y*breakOutMissile[i].m_y+z*z);
  2477.             if (distance>400)
  2478.             {
  2479.                 breakOutMissile[i].m_available_flag=TRUE;
  2480.                 //breakOutMissile[i].m_active_flag=FALSE;
  2481.             }
  2482.         }
  2483.     }
  2484.  
  2485.     if ((EnemyEngine[0].m_hit>=1) || (EnemyEngine[0].m_shield<=0))
  2486.     {
  2487.         EnemyEngine[0].m_hit=0;
  2488.         EnemyEngine[0].x=(GLfloat) (rand()%300);
  2489.         EnemyEngine[0].z=(GLfloat) (rand()%300);
  2490.         EnemyEngine[0].m_radians=1.57f;
  2491.         EnemyEngine[0].m_cpu_clicks=clock();
  2492.         EnemyEngine[0].m_sleep=TRUE;
  2493.         //objBreakOut.m_score+=30;
  2494.         //m_subtotal_score+=30;
  2495.  
  2496.         if (EnemyEngine[0].m_type==ENEMY_ROBOT)
  2497.         {
  2498.             EnemyEngine[0].m_type=TIE_FIGHTER;
  2499.         }
  2500.         else if(EnemyEngine[0].m_type==TIE_FIGHTER)
  2501.         {
  2502.             EnemyEngine[0].m_type=ENEMY_SHIP;
  2503.         }
  2504.         else
  2505.         {
  2506.             EnemyEngine[0].m_type=ENEMY_ROBOT;
  2507.         }
  2508.  
  2509.     }
  2510.  
  2511.  
  2512.  
  2513. }
  2514.  
  2515.  
  2516. void cylinder(GLfloat radius,GLfloat height)
  2517. {
  2518. GLUquadricObj *obj = gluNewQuadric();
  2519. gluQuadricDrawStyle(obj,GLU_FILL);
  2520. gluQuadricNormals(obj,GLU_SMOOTH);
  2521. gluQuadricOrientation(obj,GLU_OUTSIDE);
  2522. gluQuadricTexture(obj, GL_TRUE);
  2523.  
  2524. /*Base Cylinder*/
  2525. glPushMatrix();
  2526.     /* Rotate about the X axis */
  2527.     glRotatef(90.0f,1.0f,0.0f,0.0f);
  2528.     /* qobj = quadric object
  2529.     baseRadius
  2530.     topRadius
  2531.     height,
  2532.     slices (Subdivisions around the Z axis)
  2533.     stacks (Subdivisions around the Z axis)
  2534.     */
  2535.     gluCylinder(obj,radius,radius,height,10,1);
  2536. glPopMatrix(); 
  2537. /* Lid*/
  2538. glPushMatrix(); 
  2539.     glRotatef(-90.0f,1.0f,0.0f,0.0f);
  2540.     /* qobj = quadric object
  2541.     innerRadius = Inner radius of the disk
  2542.     outerRadius = Outer radius of the disk
  2543.     slices = number of subdivisions around the Z axis
  2544.     loops = number of concentric rings about the origin
  2545.     */
  2546.     gluDisk(obj,0.0f,radius,10,2);
  2547. glPopMatrix();
  2548.     /*Bottom*/
  2549. glPushMatrix(); 
  2550.     glTranslatef(0.0f,-height,0.0f);
  2551.     glRotatef(90.0f,1.0f,0.0f,0.0f);
  2552.     /* qobj = quadric object
  2553.     innerRadius = Inner radius of the disk
  2554.     outerRadius = Outer radius of the disk
  2555.     slices = number of subdivisions around the Z axis
  2556.     loops = number of concentric rings about the origin
  2557.     */
  2558.     gluDisk(obj,0.0f,radius,10,2);
  2559. glPopMatrix();
  2560.  
  2561. gluDeleteQuadric(obj);
  2562. }
  2563. void cone(GLfloat radius,GLfloat height)
  2564. {
  2565. GLUquadricObj *obj = gluNewQuadric();
  2566. gluQuadricDrawStyle(obj,GLU_FILL);
  2567. gluQuadricNormals(obj,GLU_SMOOTH);
  2568. gluQuadricOrientation(obj,GLU_OUTSIDE);
  2569. gluQuadricTexture(obj, GL_TRUE);
  2570.  
  2571. /*Base Cylinder*/
  2572. glPushMatrix();
  2573.     /* Rotate about the X axis */
  2574.     glRotatef(90.0f,1.0f,0.0f,0.0f);
  2575.     /* qobj = quadric object
  2576.     baseRadius
  2577.     topRadius
  2578.     height,
  2579.     slices (Subdivisions around the Z axis)
  2580.     stacks (Subdivisions around the Z axis)
  2581.     */
  2582.     gluCylinder(obj,0,radius,height,10,1);
  2583. glPopMatrix(); 
  2584.  
  2585. /*Bottom*/
  2586. glPushMatrix(); 
  2587.     glTranslatef(0.0f,-height,0.0f);
  2588.     glRotatef(90.0f,1.0f,0.0f,0.0f);
  2589.     /* qobj = quadric object
  2590.     innerRadius = Inner radius of the disk
  2591.     outerRadius = Outer radius of the disk
  2592.     slices = number of subdivisions around the Z axis
  2593.     loops = number of concentric rings about the origin
  2594.     */
  2595.     gluDisk(obj,0.0f,radius,10,2);
  2596. glPopMatrix();
  2597. gluDeleteQuadric(obj);
  2598. }
  2599. void box(GLfloat w,GLfloat h,GLfloat d)
  2600. {
  2601.     glBegin(GL_POLYGON);
  2602.         glNormal3f(0.0f,0.0f,1.0f);
  2603.         glTexCoord2f(0.0f, 1.0f);
  2604.         glVertex3f(1.0f*w,    1.0f*h,    1.0f*d);
  2605.         glTexCoord2f(0.0f, 0.0f);
  2606.         glVertex3f(-1.0f*w,    1.0f*h,    1.0f*d);
  2607.         glTexCoord2f(1.0f, 0.0f);
  2608.         glVertex3f(-1.0f*w,    -1.0f*h,    1.0f*d);
  2609.         glTexCoord2f(1.0f, 1.0f);
  2610.         glVertex3f(1.0f*w,    -1.0f*h,    1.0f*d);
  2611.     glEnd();
  2612.  
  2613.     glBegin(GL_POLYGON);
  2614.         glNormal3f(0.0f,0.0f,-1.0f);
  2615.         glTexCoord2f(0.0f, 1.0f);
  2616.         glVertex3f(1.0f*w,    1.0f*h,    -1.0f*d);
  2617.         glTexCoord2f(0.0f, 0.0f);
  2618.         glVertex3f(1.0f*w,    -1.0f*h,    -1.0f*d);
  2619.         glTexCoord2f(1.0f, 0.0f);
  2620.         glVertex3f(-1.0f*w,    -1.0f*h,    -1.0f*d);
  2621.         glTexCoord2f(1.0f, 1.0f);
  2622.         glVertex3f(-1.0f*w,    1.0f*h,    -1.0f*d);
  2623.     glEnd();
  2624.  
  2625.     glBegin(GL_POLYGON);
  2626.         glNormal3f(-1.0f,0.0f,0.0f);
  2627.         glTexCoord2f(0.0f, 1.0f);
  2628.         glVertex3f(-1.0f*w,    1.0f*h,    1.0f*d);
  2629.         glTexCoord2f(0.0f, 0.0f);
  2630.         glVertex3f(-1.0f*w,    1.0f*h,    -1.0f*d);
  2631.         glTexCoord2f(1.0f, 0.0f);
  2632.         glVertex3f(-1.0f*w,    -1.0f*h,    -1.0f*d);
  2633.         glTexCoord2f(1.0f, 1.0f);
  2634.         glVertex3f(-1.0f*w,    -1.0f*h,    1.0f*d);
  2635.     glEnd();
  2636.  
  2637.     glBegin(GL_POLYGON);
  2638.         glNormal3f(1.0f,0.0f,0.0f);
  2639.         glTexCoord2f(0.0f, 1.0f);
  2640.         glVertex3f(1.0f*w,    1.0f*h,    1.0f*d);
  2641.         glTexCoord2f(0.0f, 0.0f);
  2642.         glVertex3f(1.0f*w,    -1.0f*h,    1.0f*d);
  2643.         glTexCoord2f(1.0f, 0.0f);
  2644.         glVertex3f(1.0f*w,    -1.0f*h,    -1.0f*d);
  2645.         glTexCoord2f(1.0f, 1.0f);
  2646.         glVertex3f(1.0f*w,    1.0f*h,    -1.0f*d);
  2647.     glEnd();
  2648.  
  2649.     glBegin(GL_POLYGON);
  2650.         glNormal3f(0.0f,1.0f,0.0f);
  2651.         glTexCoord2f(0.0f, 1.0f);
  2652.         glVertex3f(-1.0f*w,    1.0f*h,    -1.0f*d);
  2653.         glTexCoord2f(0.0f, 0.0f);
  2654.         glVertex3f(-1.0f*w,    1.0f*h,    1.0f*d);
  2655.         glTexCoord2f(1.0f, 0.0f);
  2656.         glVertex3f(1.0f*w,    1.0f*h,    1.0f*d);
  2657.         glTexCoord2f(1.0f, 1.0f);
  2658.         glVertex3f(1.0f*w,    1.0f*h,    -1.0f*d);
  2659.     glEnd();
  2660.  
  2661.     glBegin(GL_POLYGON);
  2662.         glNormal3f(0.0f,-1.0f,0.0f);
  2663.         glTexCoord2f(0.0f, 1.0f);
  2664.         glVertex3f(-1.0f*w,    -1.0f*h,    -1.0f*d);
  2665.         glTexCoord2f(0.0f, 0.0f);
  2666.         glVertex3f(1.0f*w,    -1.0f*h,    -1.0f*d);
  2667.         glTexCoord2f(1.0f, 0.0f);
  2668.         glVertex3f(1.0f*w,    -1.0f*h,    1.0f*d);
  2669.         glTexCoord2f(1.0f, 1.0f);
  2670.         glVertex3f(-1.0f*w,    -1.0f*h,    1.0f*d);
  2671.     glEnd();
  2672.  
  2673. }
  2674. void brassMaterial()
  2675. {
  2676.       setAmbientMaterialColor(0.329412f,0.223529f,0.027451f,1.0f);
  2677.       setDiffuseMaterialColor(0.780392f,0.568627f,0.113725f,1.0f);
  2678.       setSpecularMaterialColor(0.992157f,0.941176f,0.807843f,1.0f);
  2679.       setMaterialShininess(27.8974f);
  2680. }
  2681. void pewterMaterial()
  2682. {
  2683.     setAmbientMaterialColor(0.10588f,0.058824f,0.113725f,1.0f);
  2684.     setDiffuseMaterialColor(0.427451f,0.470588f,0.541176f,1.0f);
  2685.     setSpecularMaterialColor(0.3333f,0.3333f,0.521569f,1.0f);
  2686.     setMaterialShininess(9.84615f);
  2687. }
  2688. void blackPlasticMaterial()
  2689. {
  2690.     setAmbientMaterialColor(0.0f,0.0f,0.0f,1.0f);
  2691.     setDiffuseMaterialColor(0.01f,0.01f,0.01f,1.0f);
  2692.     setSpecularMaterialColor(0.50f,0.50f,0.50f,1.0f);
  2693.     //setMaterialShininess(32);
  2694.     setMaterialShininess(64.0f);
  2695. }
  2696. void goldMaterial()
  2697. {
  2698.     setAmbientMaterialColor(0.24725f,0.1995f,0.0745f,1.0f);
  2699.     setDiffuseMaterialColor(0.75164f,0.60648f,0.22648f,1.0f);
  2700.     setSpecularMaterialColor(0.628281f,0.555802f,0.366065f,1.0f);
  2701.     setMaterialShininess(100.0f);
  2702. }
  2703. void bronzeMaterial()
  2704. {
  2705.     setAmbientMaterialColor(0.2125f,0.1275f,0.054f,1.0f);
  2706.     setDiffuseMaterialColor(0.714f,0.4284f,0.18144f,1.0f);
  2707.     setSpecularMaterialColor(0.393548f,0.271906f,0.166721f,1.0f);
  2708.     setMaterialShininess(25.6f);
  2709. }
  2710. void chromeMaterial()
  2711. {
  2712.     setAmbientMaterialColor(0.25f,0.25f,0.25f,1.0f);
  2713.     setDiffuseMaterialColor(0.4f,0.4f,0.4f,1.0f);
  2714.     setSpecularMaterialColor(0.774597f,0.774597f,0.774597f,1.0f);
  2715.     setMaterialShininess(76.8f);
  2716. }
  2717. void copperMaterial()
  2718. {
  2719.     setAmbientMaterialColor(0.19125f,0.0735f,0.0225f,1.0f);
  2720.     setDiffuseMaterialColor(0.7038f,0.27048f,0.0828f,1.0f);
  2721.     setSpecularMaterialColor(0.256777f,0.137622f,0.086014f,1.0f);
  2722.     setMaterialShininess(12.8f);
  2723. }
  2724. void silverMaterial()
  2725. {
  2726.     setAmbientMaterialColor(0.19125f,0.19225f,0.19225f,1.0f);
  2727.     setDiffuseMaterialColor(0.50754f,0.50754f,0.50754f,1.0f);
  2728.     setSpecularMaterialColor(0.508273f,0.508273f,0.508273f,1.0f);
  2729.     setMaterialShininess(51.2f);
  2730. }
  2731. void setDiffuseMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha)
  2732. {
  2733.     GLfloat diff[4];
  2734.     diff[0]=red;
  2735.     diff[1]=green;
  2736.     diff[2]=blue;
  2737.     diff[3]=alpha;
  2738.     glMaterialfv(GL_FRONT, GL_DIFFUSE,diff); 
  2739.  
  2740. }
  2741. void setAmbientMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha)
  2742. {
  2743.     GLfloat amb[4];
  2744.     amb[0]=red;
  2745.     amb[1]=green;
  2746.     amb[2]=blue;
  2747.     amb[3]=alpha;
  2748.     glMaterialfv(GL_FRONT, GL_AMBIENT,amb); 
  2749.  
  2750. }
  2751. void setSpecularMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha)
  2752. {
  2753.     GLfloat spec[4];
  2754.     spec[0]=red;
  2755.     spec[1]=green;
  2756.     spec[2]=blue;
  2757.     spec[3]=alpha;
  2758.     glMaterialfv(GL_FRONT, GL_SPECULAR,spec); 
  2759.  
  2760. }
  2761. void setMaterialShininess(GLfloat shininess)
  2762. {
  2763.     glMateriali(GL_FRONT, GL_SHININESS, (GLint) shininess);
  2764. }
  2765. void sphere(GLfloat radius)
  2766. {
  2767.     GLUquadricObj *obj = gluNewQuadric();
  2768.     gluQuadricDrawStyle(obj,GLU_FILL);
  2769.     gluQuadricNormals(obj,GLU_SMOOTH);
  2770.     gluQuadricOrientation(obj,GLU_OUTSIDE);
  2771.     gluQuadricTexture(obj, GL_TRUE);
  2772.  
  2773.     gluSphere(obj, radius, 10, 10);
  2774.     gluDeleteQuadric(obj);
  2775. }
  2776.  
  2777. void point_sphere(GLfloat radius)
  2778. {
  2779.     GLUquadricObj *obj = gluNewQuadric();
  2780.     gluQuadricDrawStyle(obj,GLU_POINT);
  2781.     //gluQuadricDrawStyle(obj,GLU_FILL);
  2782.     //gluQuadricNormals(obj,GLU_SMOOTH);
  2783.     //gluQuadricOrientation(obj,GLU_OUTSIDE);
  2784.     //gluQuadricTexture(obj, GL_TRUE);
  2785.  
  2786.     gluSphere(obj, radius, 8, 8);
  2787.     gluDeleteQuadric(obj);
  2788. }
  2789.  
  2790. VECTOR_STRUCT_TYPE* rotate(GLfloat angle,GLfloat ux,GLfloat uy,GLfloat uz, VECTOR_STRUCT_TYPE *vector)
  2791. {
  2792. MATRIX4X4 Mt;
  2793. MATRIX1X4 Mp;
  2794. MATRIX1X4 Mr;
  2795.  
  2796. float sinTheta;
  2797. float cosTheta;
  2798. VECTOR_STRUCT_TYPE *ret_vector;
  2799.  
  2800. ret_vector= (VECTOR_STRUCT_TYPE *) malloc (sizeof(VECTOR_STRUCT_TYPE));
  2801.  
  2802. sinTheta=(float)sin(angle/180.0f*3.142);
  2803. cosTheta=(float)cos(angle/180.0f*3.142);
  2804.  
  2805. Mt[0][0]= cosTheta+(1-cosTheta)*pow(ux,2);
  2806. Mt[0][1]= (1-cosTheta)*uy*ux-sinTheta*uz; 
  2807. Mt[0][2]= (1-cosTheta)*uz*ux+sinTheta*uy;
  2808. Mt[0][3]= 0.0f;  
  2809.  
  2810. Mt[1][0]= (1-cosTheta)*ux*uy+sinTheta*uz;
  2811. Mt[1][1]= cosTheta+(1-cosTheta)*pow(uy,2);
  2812. Mt[1][2]= (1-cosTheta)*uz*uy-sinTheta*ux;
  2813. Mt[1][3]= 0.0f; 
  2814.  
  2815. Mt[2][0]= (1-cosTheta)*ux*uz-sinTheta*uy;
  2816. Mt[2][1]= (1-cosTheta)*uy*uz+sinTheta*ux;
  2817. Mt[2][2]= cosTheta+(1-cosTheta)*pow(uz,2);
  2818. Mt[2][3]= 0.0f;
  2819.  
  2820. Mt[3][0]=0;
  2821. Mt[3][1]=0;
  2822. Mt[3][2]=0;
  2823. Mt[3][3]=1;
  2824.  
  2825. Mp[0][0]=vector->m_x;
  2826. Mp[0][1]=vector->m_y;
  2827. Mp[0][2]=vector->m_z;
  2828. Mp[0][3]=1;
  2829.  
  2830.  
  2831. Matrix1X4_4X4(&Mr,&Mp,&Mt); 
  2832.  
  2833. ret_vector->m_x=(float)Mr[0][0];
  2834. ret_vector->m_y=(float)Mr[0][1];
  2835. ret_vector->m_z=(float)Mr[0][2];
  2836. return(ret_vector);
  2837.  
  2838. }
  2839.  
  2840. double Matrix4X1_1X4(MATRIX4X1 *matrix1, MATRIX1X4 *matrix2)
  2841. {
  2842. register int k;
  2843. double result=0.0;
  2844.     for (k = 0 ; k < 4 ; k++)
  2845.         result += (*matrix1)[k][0] * (*matrix2)[0][k];
  2846.     return(result);
  2847. }
  2848. void Matrix4X1_4X4(MATRIX4X1 *result, MATRIX4X1 *matrix1, MATRIX4X4 *matrix2)
  2849. {
  2850. register int i, k;
  2851. MATRIX4X1 temp_matrix;
  2852.     for (i = 0 ; i < 4 ; i++)
  2853.     {
  2854.     temp_matrix[i][0] = 0.0;
  2855.         for (k = 0 ; k < 4 ; k++)
  2856.         {
  2857.             temp_matrix[i][0] += (*matrix1)[k][0] * (*matrix2)[i][k];
  2858.         }
  2859.     }
  2860.     for (i = 0 ; i < 4 ; i++)
  2861.         (*result)[i][0] = temp_matrix[i][0];
  2862. }
  2863. void Matrix1X4_4X4(MATRIX1X4 *result, MATRIX1X4 *matrix1, MATRIX4X4 *matrix2)
  2864. {
  2865. register int i, k;
  2866. MATRIX4X1 temp_matrix;
  2867.     for (i = 0 ; i < 4 ; i++)
  2868.     {
  2869.         temp_matrix[i][0] = 0.0;
  2870.             for (k = 0 ; k < 4 ; k++)
  2871.             {
  2872.                 temp_matrix[i][0] += (*matrix1)[0][k] * (*matrix2)[i][k];
  2873.             }
  2874.     }
  2875.     for (i = 0 ; i < 4 ; i++)
  2876.         (*result)[0][i] = temp_matrix[i][0];
  2877. }
  2878. int getAvailableExplosion()
  2879. {
  2880.     int i;
  2881.     for(i=0; i<EXPLOSION_SIZE; i++)
  2882.     {
  2883.         if (objExplosion[i].m_available_flag==TRUE)
  2884.             //objExplosion[i].m_active_flag=TRUE;
  2885.             objExplosion[i].m_available_flag=FALSE;
  2886.             return(i);
  2887.     }
  2888.     return(-1);
  2889.  
  2890. }
  2891. void torus(GLfloat innerRadius,    GLfloat outerRadius)
  2892. {
  2893.     GLfloat vertexes[4][3];
  2894.     GLfloat normal[3];
  2895.     GLfloat x;
  2896.     GLfloat y;
  2897.     GLfloat z;
  2898.     GLfloat phi;
  2899.     GLfloat theta;
  2900.     GLfloat CosPhi;
  2901.     GLfloat SinPhi;
  2902.     GLfloat SinTheta;
  2903.     GLfloat CosTheta;
  2904.  
  2905.     for(phi=0.0f; phi <= 360.0f; phi+=20.0f)
  2906.     {
  2907.         for(theta=0.0f; theta<=360.0f; theta+=20.0f)
  2908.         {
  2909.         CosPhi=(GLfloat)cos(phi/180.0*3.142);
  2910.         SinPhi=(GLfloat)sin(phi/180.0*3.142);
  2911.         CosTheta=(GLfloat)cos(theta/180.0*3.142);
  2912.         SinTheta=(GLfloat)sin(theta/180.0*3.142);
  2913.         /*Vertex 1*/
  2914.         x= CosTheta * (CosPhi * innerRadius+outerRadius);
  2915.         y= SinTheta * (CosPhi * innerRadius+outerRadius);
  2916.         z= (SinPhi) * innerRadius;
  2917.         vertexes[0][0]=x;
  2918.         vertexes[0][1]=y;
  2919.         vertexes[0][2]=z;
  2920.         /*Vertex 2*/
  2921.         CosPhi=(GLfloat)cos(phi/180.0*3.142);
  2922.         SinPhi=(GLfloat)sin(phi/180.0*3.142);
  2923.         CosTheta=(GLfloat)cos((theta+20)/180.0*3.142);
  2924.         SinTheta=(GLfloat)sin((theta+20)/180.0*3.142);
  2925.         x= CosTheta * (CosPhi * innerRadius+outerRadius);
  2926.         y= SinTheta * (CosPhi * innerRadius+outerRadius);
  2927.         z= (SinPhi) * innerRadius;
  2928.         vertexes[1][0]=x;
  2929.         vertexes[1][1]=y;
  2930.         vertexes[1][2]=z;
  2931.         /*Vertex 3*/
  2932.         CosPhi=(GLfloat)cos((phi+20)/180.0*3.142);
  2933.         SinPhi=(GLfloat)sin((phi+20)/180.0*3.142);
  2934.         CosTheta=(GLfloat)cos((theta+20)/180.0*3.142);
  2935.         SinTheta=(GLfloat)sin((theta+20)/180.0*3.142);
  2936.         x= CosTheta * (CosPhi * innerRadius+outerRadius);
  2937.         y= SinTheta * (CosPhi * innerRadius+outerRadius);
  2938.         z= (SinPhi) * innerRadius;
  2939.         vertexes[2][0]=x;
  2940.         vertexes[2][1]=y;
  2941.         vertexes[2][2]=z;
  2942.         /*Vertex 4*/
  2943.         CosPhi=(GLfloat)cos((phi+20)/180.0*3.142);
  2944.         SinPhi=(GLfloat)sin((phi+20)/180.0*3.142);
  2945.         CosTheta=(GLfloat)cos((theta)/180.0*3.142);
  2946.         SinTheta=(GLfloat)sin((theta)/180.0*3.142);
  2947.         x= CosTheta * (CosPhi * innerRadius+outerRadius);
  2948.         y= SinTheta * (CosPhi * innerRadius+outerRadius);
  2949.         z= (SinPhi) * innerRadius;
  2950.         vertexes[3][0]=x;
  2951.         vertexes[3][1]=y;
  2952.         vertexes[3][2]=z;
  2953.         calcNormal(vertexes,normal);
  2954.         glBegin(GL_POLYGON);
  2955.             glNormal3f(normal[0],normal[1],normal[2]);
  2956.             glVertex3f(vertexes[0][0],vertexes[0][1],vertexes[0][2]);
  2957.             glVertex3f(vertexes[1][0],vertexes[1][1],vertexes[1][2]);
  2958.             glVertex3f(vertexes[2][0],vertexes[2][1],vertexes[2][2]);
  2959.             glVertex3f(vertexes[3][0],vertexes[3][1],vertexes[3][2]);
  2960.         glEnd();
  2961.         }
  2962.     }
  2963. }
  2964.  
  2965. void reduceToUnit(GLfloat vector[3])
  2966. {
  2967. float length;
  2968. length = (float)sqrt((vector[0]*vector[0]) + 
  2969. (vector[1]*vector[1]) +
  2970. (vector[2]*vector[2]));
  2971. if(length == 0.0f)
  2972.     length = 1.0f;
  2973.     vector[0] /= length;
  2974.     vector[1] /= length;
  2975.     vector[2] /= length;
  2976. }
  2977. void calcNormal2(VECTOR_STRUCT_TYPE *vertex1, VECTOR_STRUCT_TYPE *vertex2,VECTOR_STRUCT_TYPE *vertex3,GLfloat out[3])
  2978. {
  2979. float v1[3],v2[3];
  2980. static const int x = 0;
  2981. static const int y = 1;
  2982. static const int z = 2;
  2983. v1[x] = vertex1->m_x - vertex2->m_x;
  2984. v1[y] = vertex1->m_y - vertex2->m_y;
  2985. v1[z] = vertex1->m_z - vertex2->m_z;
  2986. v2[x] = vertex2->m_x - vertex3->m_x;
  2987. v2[y] = vertex2->m_y - vertex3->m_y;
  2988. v2[z] = vertex2->m_z - vertex3->m_z;
  2989. /*Cross Product*/
  2990. out[x] = v1[y]*v2[z] - v1[z]*v2[y];
  2991. out[y] = v1[z]*v2[x] - v1[x]*v2[z];
  2992. out[z] = v1[x]*v2[y] - v1[y]*v2[x];
  2993. reduceToUnit(out);
  2994.  
  2995. }
  2996. void calcNormal(GLfloat v[3][3], GLfloat out[3])
  2997. {
  2998. float v1[3],v2[3];
  2999. static const int x = 0;
  3000. static const int y = 1;
  3001. static const int z = 2;
  3002. v1[x] = v[0][x] - v[1][x];
  3003. v1[y] = v[0][y] - v[1][y];
  3004. v1[z] = v[0][z] - v[1][z];
  3005. v2[x] = v[1][x] - v[2][x];
  3006. v2[y] = v[1][y] - v[2][y];
  3007. v2[z] = v[1][z] - v[2][z];
  3008. /*Cross Product*/
  3009. out[x] = v1[y]*v2[z] - v1[z]*v2[y];
  3010. out[y] = v1[z]*v2[x] - v1[x]*v2[z];
  3011. out[z] = v1[x]*v2[y] - v1[y]*v2[x];
  3012. reduceToUnit(out);
  3013. }
  3014.  
  3015. void CMy3DFontView::OnAppAbout() 
  3016. {
  3017.     // TODO: Add your command handler code here
  3018.  
  3019.     CHelp dlg;
  3020.  
  3021.     KillTimer(1);
  3022.     
  3023.     dlg.m_Instructions="1-Swing the Camera Left\r\n2-Swing Camera Center\r\n3-Swing Camera Right\r\n4-Elevate the Camera\r\n5-DeElevate the Camera\r\nSpace Fire Missiles\r\nScore by shooting Bumper objects,Enemies, and Mines";
  3024.     int response=dlg.DoModal();
  3025.  
  3026.     if(response==IDOK)
  3027.     {
  3028.         setSpeed();
  3029.     }
  3030.     Invalidate();
  3031. }
  3032. void generateMines()
  3033. {
  3034.     int retval;
  3035.     static long current_time=clock();
  3036.  
  3037.     if ((clock()-current_time)>1000)
  3038.     {
  3039.         current_time=clock();
  3040.         retval=getMineObject();
  3041.         
  3042.         if(retval>-1)
  3043.         {
  3044.             objMineList[retval].m_available_flag=FALSE;
  3045.             //objMineList[retval].m_active_flag=TRUE;
  3046.             objMineList[retval].m_x=(GLfloat) GRID_SIZE;
  3047.             objMineList[retval].m_y=0.0f;
  3048.             objMineList[retval].m_z=(GLfloat) -GRID_SIZE;
  3049.             objMineList[retval].m_direction=RIGHT_DIRECTION;
  3050.         }
  3051.     }
  3052.  
  3053. }
  3054.  
  3055. int checkMineHit(GLfloat x,GLfloat y,GLfloat z)
  3056. {
  3057. int i;
  3058. int retval;
  3059. GLfloat mine_x,mine_y,mine_z;
  3060. GLfloat vector_x,vector_y,vector_z;
  3061. GLfloat distance;
  3062. int index;
  3063.  
  3064.     retval=0;
  3065.  
  3066.     for(i=0; i<MINE_LIST_SIZE; i++)
  3067.     {
  3068.         if (objMineList[i].m_available_flag==FALSE)
  3069.         {
  3070.             mine_x=objMineList[i].m_x;
  3071.             mine_y=objMineList[i].m_y;
  3072.             mine_z=objMineList[i].m_z;
  3073.         
  3074.             vector_x=mine_x-x;
  3075.             vector_y=mine_y-y;
  3076.             vector_z=mine_z-z;
  3077.  
  3078.             distance=(GLfloat) sqrt(vector_x*vector_x+vector_y*vector_y+vector_z*vector_z);
  3079.  
  3080.             if(distance<=20)
  3081.             {
  3082.                 //objMineList[i].m_active_flag=FALSE;
  3083.                 objMineList[i].m_available_flag=TRUE;
  3084.  
  3085.                 objBreakOut.m_score+=10;
  3086.                 m_subtotal_score+=10;
  3087.  
  3088.                 index=getAvailableExplosion();
  3089.                 if(index>-1)
  3090.                 {
  3091.                     objExplosion[index].x=mine_x;
  3092.                     objExplosion[index].y=mine_y;
  3093.                     objExplosion[index].z=mine_z;
  3094.                     objExplosion[index].m_cpu_seconds=clock();
  3095.                     objExplosion[index].type=SPHERE_TYPE;
  3096.                 }
  3097.  
  3098.                 //sound("hit.wav");
  3099.                  retval=1;
  3100.                 return(retval);
  3101.             }
  3102.         }
  3103.     }
  3104.     return(retval);
  3105. }
  3106.  
  3107. void BreakOut()
  3108. {
  3109.     int mine_count;
  3110.  
  3111.     mine_count=getMineCount();
  3112.  
  3113.     if(mGenerate_Mines_Flag==TRUE)
  3114.     {
  3115.         generateMines();
  3116.     }
  3117.     if (mine_count==MINE_LIST_SIZE)
  3118.     {
  3119.         mGenerate_Mines_Flag=FALSE;
  3120.     }
  3121.     else if(mine_count==0)
  3122.     {
  3123.         mGenerate_Mines_Flag=TRUE;
  3124.     }
  3125.  
  3126.     drawMineObjectList();
  3127. }
  3128. void empty()
  3129. {
  3130. }
  3131. void tetrahedron()
  3132. {
  3133.     GLfloat normal[3];
  3134.     VECTOR_STRUCT_TYPE vertex[12];
  3135.  
  3136.     /*Tetrahedron*/
  3137.     vertex[0].m_x=1.0f;
  3138.     vertex[0].m_y=1.0f;
  3139.     vertex[0].m_z=1.0f;
  3140.  
  3141.     vertex[1].m_x=1.0f;
  3142.     vertex[1].m_y=-1.0f;
  3143.     vertex[1].m_z=-1.0f;
  3144.  
  3145.     vertex[2].m_x=-1.0f;
  3146.     vertex[2].m_y=-1.0f;
  3147.     vertex[2].m_z=1.0f;
  3148.  
  3149.     vertex[3].m_x=-1.0f;
  3150.     vertex[3].m_y=1.0f;
  3151.     vertex[3].m_z=-1.0f;
  3152.  
  3153.     /*Face 0 - 1,2,3*/
  3154.     glBegin(GL_POLYGON);
  3155.         calcNormal2(&vertex[1],&vertex[2],&vertex[3],normal);
  3156.         glNormal3f(normal[0],normal[1],normal[2]);
  3157.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  3158.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  3159.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  3160.     glEnd();
  3161.  
  3162.     /*Face 1 - 0,3,2*/
  3163.     glBegin(GL_POLYGON);
  3164.         calcNormal2(&vertex[0],&vertex[3],&vertex[2],normal);
  3165.         glNormal3f(normal[0],normal[1],normal[2]);
  3166.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  3167.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  3168.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  3169.     glEnd();
  3170.  
  3171.     /*Face 2 - 0,1,3*/
  3172.     glBegin(GL_POLYGON);
  3173.         calcNormal2(&vertex[0],&vertex[1],&vertex[3],normal);
  3174.         glNormal3f(normal[0],normal[1],normal[2]);
  3175.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  3176.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  3177.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  3178.     glEnd();
  3179.  
  3180.     /*Face 3 - 0,2,1*/
  3181.     glBegin(GL_POLYGON);
  3182.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  3183.         glNormal3f(normal[0],normal[1],normal[2]);
  3184.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  3185.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  3186.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  3187.     glEnd();
  3188. }
  3189. int getAvailableMissile()
  3190. {
  3191.     int i;
  3192.     for(i=0; i<NUMBER_OF_MISSILES; i++)
  3193.     {
  3194.         if (breakOutMissile[i].m_available_flag==TRUE)
  3195.         {
  3196.             return(i);
  3197.         }
  3198.     }
  3199.     return(-1);
  3200. }
  3201.  
  3202. void hyperboloid()
  3203. {
  3204.     GLfloat vertexes[4][3];
  3205.     GLfloat normal[3];
  3206.     GLfloat x;
  3207.     GLfloat y;
  3208.     GLfloat z;
  3209.     GLfloat phi;
  3210.     GLfloat theta;
  3211.     GLfloat v,u;
  3212.     GLfloat r;
  3213.     GLfloat h;
  3214.  
  3215.     r=1.0f;
  3216.     h=2.0f;
  3217.  
  3218.     for(phi=-180.0f; phi <= 180.0f; phi+=40.0f)
  3219.     {
  3220.         for(theta=-270.0f; theta<=90.0f; theta+=20.0f)
  3221.         {
  3222.         v=(phi/180.0f*3.142f);
  3223.         u=(theta/180.0f*3.142f);
  3224.         /*Vertex 1*/
  3225.         x= (GLfloat) (r*(1/cos(v))*cos(u));
  3226.         y= (GLfloat) (r*(1/cos(v))*sin(u));
  3227.         z= (GLfloat) (h*tan(v));
  3228.         vertexes[0][0]=x;
  3229.         vertexes[0][1]=y;
  3230.         vertexes[0][2]=z;
  3231.         /*Vertex 2*/
  3232.         v=(phi/180.0f*3.142f);
  3233.         u=((theta+20.0f)/180.0f*3.142f);
  3234.  
  3235.         x= (GLfloat) (r*(1/cos(v))*cos(u));
  3236.         y= (GLfloat) (r*(1/cos(v))*sin(u));
  3237.         z= (GLfloat) (h*tan(v));
  3238.  
  3239.         vertexes[1][0]=x;
  3240.         vertexes[1][1]=y;
  3241.         vertexes[1][2]=z;
  3242.         /*Vertex 3*/
  3243.         v=((phi+20.0f)/180.0f*3.142f);
  3244.         u=((theta+20.0f)/180.0f*3.142f);
  3245.  
  3246.         x= (GLfloat) (r*(1/cos(v))*cos(u));
  3247.         y= (GLfloat) (r*(1/cos(v))*sin(u));
  3248.         z= (GLfloat) (h*tan(v));
  3249.  
  3250.         vertexes[2][0]=x;
  3251.         vertexes[2][1]=y;
  3252.         vertexes[2][2]=z;
  3253.         /*Vertex 4*/
  3254.         v=((phi+20.0f)/180.0f*3.142f);
  3255.         u=((theta)/180.0f*3.142f);
  3256.  
  3257.         x= (GLfloat) (r*(1/cos(v))*cos(u));
  3258.         y= (GLfloat) (r*(1/cos(v))*sin(u));
  3259.         z= (GLfloat) (h*tan(v));
  3260.  
  3261.         vertexes[3][0]=x;
  3262.         vertexes[3][1]=y;
  3263.         vertexes[3][2]=z;
  3264.         calcNormal(vertexes,normal);
  3265.  
  3266.         glBegin(GL_POLYGON);
  3267.             glNormal3f(normal[0],normal[1],normal[2]);
  3268.             glVertex3f(vertexes[0][0],vertexes[0][1],vertexes[0][2]);
  3269.             glVertex3f(vertexes[1][0],vertexes[1][1],vertexes[1][2]);
  3270.             glVertex3f(vertexes[2][0],vertexes[2][1],vertexes[2][2]);
  3271.             glVertex3f(vertexes[3][0],vertexes[3][1],vertexes[3][2]);
  3272.         glEnd();
  3273.         }
  3274.     }
  3275. }
  3276. void buildMushRoomObject()
  3277. {
  3278.  int i;
  3279.  int j;
  3280.  int index;
  3281.  
  3282.  GLfloat x;
  3283.  GLfloat z;
  3284.  
  3285.     z = -45.0f;
  3286.     for(i=0; i<=9; i++)
  3287.     {
  3288.         x = -45.0f;
  3289.  
  3290.         for(j=0; j<=9; j++)
  3291.         {
  3292.             if(vMap[i][j] == MUSHROOM_TYPE)
  3293.             {
  3294.                 index=getMushRoomObject();
  3295.                 objMushRoomList[index].m_available_flag=FALSE;
  3296.                 //objMushRoomList[index].m_active_flag=TRUE;
  3297.                 objMushRoomList[index].m_x=x;
  3298.                 objMushRoomList[index].m_y=1.5f;
  3299.                 objMushRoomList[index].m_z=z;
  3300.             }
  3301.             x = x + (GRID_SIZE/10);
  3302.         }
  3303.         z = z + (GRID_SIZE/10);
  3304.     }    
  3305.  
  3306. }
  3307. void CMy3DFontView::mushRoom_configuration()
  3308. {
  3309.     //Row 1
  3310.     vMap[0][0] = MUSHROOM_TYPE;
  3311.     vMap[0][1] = EMPTY_TYPE;
  3312.     vMap[0][2] = EMPTY_TYPE;
  3313.     vMap[0][3] = EMPTY_TYPE;
  3314.     vMap[0][4] = EMPTY_TYPE;
  3315.     vMap[0][5] = EMPTY_TYPE;
  3316.     vMap[0][6] = EMPTY_TYPE;
  3317.     vMap[0][7] = EMPTY_TYPE;
  3318.     vMap[0][8] = EMPTY_TYPE;
  3319.     vMap[0][9] = EMPTY_TYPE;
  3320.     //Row 2
  3321.     vMap[1][0] = EMPTY_TYPE;
  3322.     vMap[1][1] = EMPTY_TYPE;
  3323.     vMap[1][2] = EMPTY_TYPE;
  3324.     vMap[1][3] = EMPTY_TYPE;
  3325.     vMap[1][4] = EMPTY_TYPE;
  3326.     vMap[1][5] = EMPTY_TYPE;
  3327.     vMap[1][6] = EMPTY_TYPE;
  3328.     vMap[1][7] = EMPTY_TYPE;
  3329.     vMap[1][8] = EMPTY_TYPE;
  3330.     vMap[1][9] = EMPTY_TYPE;
  3331.     //Row 3
  3332.     vMap[2][0] = EMPTY_TYPE;
  3333.     vMap[2][1] = EMPTY_TYPE;
  3334.     vMap[2][2] = EMPTY_TYPE;
  3335.     vMap[2][3] = EMPTY_TYPE;
  3336.     vMap[2][4] = MUSHROOM_TYPE;
  3337.     vMap[2][5] = EMPTY_TYPE;
  3338.     vMap[2][6] = EMPTY_TYPE;
  3339.     vMap[2][7] = EMPTY_TYPE;
  3340.     vMap[2][8] = EMPTY_TYPE;
  3341.     vMap[2][9] = EMPTY_TYPE;
  3342.     //Row 4
  3343.     vMap[3][0] = EMPTY_TYPE;
  3344.     vMap[3][1] = EMPTY_TYPE;
  3345.     vMap[3][2] = EMPTY_TYPE;
  3346.     vMap[3][3] = EMPTY_TYPE;
  3347.     vMap[3][4] = EMPTY_TYPE;
  3348.     vMap[3][5] = MUSHROOM_TYPE;
  3349.     vMap[3][6] = EMPTY_TYPE;
  3350.     vMap[3][7] = EMPTY_TYPE;
  3351.     vMap[3][8] = EMPTY_TYPE;
  3352.     vMap[3][9] = EMPTY_TYPE;
  3353.     //Row 5
  3354.     vMap[4][0] = EMPTY_TYPE;
  3355.     vMap[4][1] = EMPTY_TYPE;
  3356.     vMap[4][2] = EMPTY_TYPE;
  3357.     vMap[4][3] = EMPTY_TYPE;
  3358.     vMap[4][4] = EMPTY_TYPE;
  3359.     vMap[4][5] = EMPTY_TYPE;
  3360.     vMap[4][6] = EMPTY_TYPE;
  3361.     vMap[4][7] = EMPTY_TYPE;
  3362.     vMap[4][8] = EMPTY_TYPE;
  3363.     vMap[4][9] = EMPTY_TYPE;
  3364.     //Row 6
  3365.     vMap[5][0] = EMPTY_TYPE;
  3366.     vMap[5][1] = EMPTY_TYPE;
  3367.     vMap[5][2] = EMPTY_TYPE;
  3368.     vMap[5][3] = EMPTY_TYPE;
  3369.     vMap[5][4] = EMPTY_TYPE;
  3370.     vMap[5][5] = EMPTY_TYPE;
  3371.     vMap[5][6] = EMPTY_TYPE;
  3372.     vMap[5][7] = EMPTY_TYPE;
  3373.     vMap[5][8] = EMPTY_TYPE;
  3374.     vMap[5][9] = MUSHROOM_TYPE;
  3375.     //Row 7
  3376.     vMap[6][0] = EMPTY_TYPE;
  3377.     vMap[6][1] = EMPTY_TYPE;
  3378.     vMap[6][2] = EMPTY_TYPE;
  3379.     vMap[6][3] = EMPTY_TYPE;
  3380.     vMap[6][4] = EMPTY_TYPE;
  3381.     vMap[6][5] = EMPTY_TYPE;
  3382.     vMap[6][6] = EMPTY_TYPE;
  3383.     vMap[6][7] = EMPTY_TYPE;
  3384.     vMap[6][8] = EMPTY_TYPE;
  3385.     vMap[6][9] = EMPTY_TYPE;
  3386.     //Row 8
  3387.     vMap[7][0] = MUSHROOM_TYPE;
  3388.     vMap[7][1] = EMPTY_TYPE;
  3389.     vMap[7][2] = EMPTY_TYPE;
  3390.     vMap[7][3] = EMPTY_TYPE;
  3391.     vMap[7][4] = EMPTY_TYPE;
  3392.     vMap[7][5] = EMPTY_TYPE;
  3393.     vMap[7][6] = EMPTY_TYPE;
  3394.     vMap[7][7] = EMPTY_TYPE;
  3395.     vMap[7][8] = EMPTY_TYPE;
  3396.     vMap[7][9] = EMPTY_TYPE;
  3397.     //Row 9
  3398.     vMap[8][0] = EMPTY_TYPE;
  3399.     vMap[8][1] = EMPTY_TYPE;
  3400.     vMap[8][2] = EMPTY_TYPE;
  3401.     vMap[8][3] = EMPTY_TYPE;
  3402.     vMap[8][4] = EMPTY_TYPE;
  3403.     vMap[8][5] = EMPTY_TYPE;
  3404.     vMap[8][6] = EMPTY_TYPE;
  3405.     vMap[8][7] = EMPTY_TYPE;
  3406.     vMap[8][8] = EMPTY_TYPE;
  3407.     vMap[8][9] = EMPTY_TYPE;
  3408.     //Row 10
  3409.     vMap[9][0] = EMPTY_TYPE;
  3410.     vMap[9][1] = EMPTY_TYPE;
  3411.     vMap[9][2] = EMPTY_TYPE;
  3412.     vMap[9][3] = EMPTY_TYPE;
  3413.     vMap[9][4] = EMPTY_TYPE;
  3414.     vMap[9][5] = MUSHROOM_TYPE;
  3415.     vMap[9][6] = EMPTY_TYPE;
  3416.     vMap[9][7] = EMPTY_TYPE;
  3417.     vMap[9][8] = EMPTY_TYPE;
  3418.     vMap[9][9] = EMPTY_TYPE;
  3419.  
  3420. }
  3421. int CMy3DFontView::getMushRoomObjectCount(int type)
  3422. {
  3423.     int i;
  3424.     int retval=0;
  3425.  
  3426.     if(type==MUSHROOM_TYPE)
  3427.     {
  3428.         for (i=0; i<OBJECT_LIST_SIZE; i++)
  3429.         {
  3430.             if(objMushRoomList[i].m_available_flag==FALSE)
  3431.             {
  3432.                 retval++;
  3433.             }
  3434.         }
  3435.     }
  3436.     return(retval);
  3437. }
  3438.  
  3439. void CMy3DFontView::drawMushRoomObjectList()
  3440. {
  3441.     int i;
  3442.     int color;
  3443.  
  3444.         setSpecularMaterialColor(1.0f,1.0f,1.0f,1.0f);
  3445.         setMaterialShininess(128.0f);
  3446.  
  3447.         setAmbientMaterialColor(0.3f,0.3f,0.3f,1.0f);
  3448.  
  3449.         for(i=0; i<OBJECT_LIST_SIZE; i++)
  3450.         {
  3451.             if(objMushRoomList[i].m_available_flag==FALSE)
  3452.             {
  3453.                 color=rand()%3;
  3454.                 switch(color)
  3455.                 {
  3456.                 case 0:
  3457.                     setDiffuseMaterialColor(0.8f,0.0f,0.0f,1.0f);
  3458.                     break;
  3459.                 case 1:
  3460.                     setDiffuseMaterialColor(0.0f,0.8f,0.0f,1.0f);
  3461.                     break;
  3462.                 case 2:
  3463.                     setDiffuseMaterialColor(0.0f,0.0f,0.8f,1.0f);
  3464.                     break;
  3465.                 case 3:
  3466.                     setDiffuseMaterialColor(0.8f,0.8f,0.0f,1.0f);
  3467.                     break;
  3468.                 }
  3469.  
  3470.                 glPushMatrix();
  3471.                     glTranslatef(objMushRoomList[i].m_x,objMushRoomList[i].m_y,objMushRoomList[i].m_z);
  3472.                     mushRoom();
  3473.                 glPopMatrix();
  3474.             }
  3475.         }
  3476.  
  3477. }
  3478. int getMineCount()
  3479. {
  3480.     int i;
  3481.     int count=0;
  3482.  
  3483.     for(i=0; i<MINE_LIST_SIZE; i++)
  3484.     {
  3485.         if(objMineList[i].m_available_flag==FALSE)
  3486.         {
  3487.             count++;
  3488.         }
  3489.     }
  3490.     return(count);
  3491. }
  3492. void drawMineObjectList()
  3493. {
  3494.     int i;
  3495.     GLfloat x,y,z;
  3496.     int retval;
  3497.     int retVal1,retVal2;
  3498.  
  3499.         for(i=0; i<MINE_LIST_SIZE; i++)
  3500.         {
  3501.             if(objMineList[i].m_available_flag==FALSE)
  3502.             {
  3503.                 
  3504.                 x=objMineList[i].m_x;
  3505.                 y=objMineList[i].m_y;
  3506.                 z=objMineList[i].m_z;
  3507.  
  3508.                 //Check BreakOut Collision
  3509.                 retval=checkBreakOutHit(x,y,z,MOVING_MINE);
  3510.                 if(retval==1)
  3511.                 {
  3512.                     objMineList[i].m_available_flag=TRUE;
  3513.                     //objMineList[i].m_active_flag=FALSE;
  3514.                     continue;
  3515.                 }
  3516.                 //Check Enemy Collsion
  3517.                 retval=checkEnemyMineHit(x,y,z);
  3518.                 if(retval==1)
  3519.                 {
  3520.                     objMineList[i].m_available_flag=TRUE;
  3521.                     continue;
  3522.                 }
  3523.  
  3524.                 //MushRoom Collision
  3525.                 retVal1=checkMushRoomCollision(x,y,z);
  3526.                 //Check Asteroid Hit
  3527.                 retVal2=checkAsteroidHit(x,y,z,FALSE);
  3528.  
  3529.                 if ((retVal1==1) || (retVal2==1))
  3530.                 {
  3531.                     if (objMineList[i].m_direction==RIGHT_DIRECTION)
  3532.                     {
  3533.                         objMineList[i].m_direction=LEFT_DIRECTION;
  3534.                         z+=20.0f;
  3535.                     }
  3536.                     else
  3537.                     {
  3538.                         objMineList[i].m_direction=RIGHT_DIRECTION;
  3539.                         z+=20.0f;
  3540.                     }
  3541.                 }
  3542.  
  3543.                 //Check if the Mine has moved beyond the bottom of the grid
  3544.                 if(objMineList[i].m_direction==RIGHT_DIRECTION)
  3545.                 {
  3546.                     if ( ((x+10.0f)>GRID_SIZE) || (retval==1))
  3547.                     {
  3548.                         objMineList[i].m_direction=LEFT_DIRECTION;
  3549.                         z+=20.0f;
  3550.                     }
  3551.                     else
  3552.                     {
  3553.                         if (mLevel<10)
  3554.                         {
  3555.                         x+=(10.0f+(mLevel*3));
  3556.                         }
  3557.                         else
  3558.                         {
  3559.                             x+=(10.0f+(30));
  3560.                         }
  3561.                     }
  3562.                 }
  3563.                 else
  3564.                 {
  3565.                     if ( ((x-10.0f)<-GRID_SIZE) || (retval==1))
  3566.                     {
  3567.                         objMineList[i].m_direction=RIGHT_DIRECTION;
  3568.                         z+=20.0f;
  3569.                     }
  3570.                     else
  3571.                     {
  3572.                         if (mLevel<10)
  3573.                         {
  3574.                             x-=(10.0f+(mLevel*3));
  3575.                         }
  3576.                         else
  3577.                         {
  3578.                             x-=(10.0f+(30));
  3579.                         }
  3580.                     }
  3581.                 }
  3582.  
  3583.                 if (z>GRID_SIZE)
  3584.                 {
  3585.                     objMineList[i].m_available_flag=TRUE;
  3586.                     //objMineList[i].m_active_flag=FALSE;
  3587.                 }
  3588.  
  3589.                 objMineList[i].m_x=x;
  3590.                 objMineList[i].m_y=y;
  3591.                 objMineList[i].m_z=z;
  3592.  
  3593.                 glPushMatrix();
  3594.                     glTranslatef(objMineList[i].m_x,objMineList[i].m_y,objMineList[i].m_z);
  3595.                     drawMine();
  3596.                 glPopMatrix();
  3597.             }
  3598.         }
  3599.  
  3600. }
  3601.  
  3602. int getMushRoomObject()
  3603. {
  3604.     int i;
  3605.     for (i=0; i<OBJECT_LIST_SIZE; i++)
  3606.     {
  3607.         if (objMushRoomList[i].m_available_flag==TRUE)
  3608.         {
  3609.             return(i);
  3610.         }
  3611.     }
  3612.     return(-1);
  3613. }
  3614. int getMineObject()
  3615. {
  3616.     int i;
  3617.     for (i=0; i<MINE_LIST_SIZE; i++)
  3618.     {
  3619.         if (objMineList[i].m_available_flag==TRUE)
  3620.         {
  3621.             return(i);
  3622.         }
  3623.     }
  3624.     return(-1);
  3625. }
  3626. int checkMushRoomCollision(GLfloat object_x,GLfloat object_y,GLfloat object_z)
  3627. {
  3628.     GLfloat distance;
  3629.     GLfloat x,y,z;
  3630.     int i;
  3631.  
  3632.         for(i=0; i<OBJECT_LIST_SIZE; i++)
  3633.         {
  3634.             if(objMushRoomList[i].m_available_flag==FALSE)
  3635.             {
  3636.  
  3637.                 x=object_x-objMushRoomList[i].m_x;
  3638.                 y=object_y-objMushRoomList[i].m_y;
  3639.                 z=object_z-objMushRoomList[i].m_z;
  3640.  
  3641.                 distance=(GLfloat)sqrt(x*x+y*y+z*z);
  3642.  
  3643.                 if (distance<10)
  3644.                 {
  3645.                     return(1);
  3646.                     break;
  3647.                 }
  3648.  
  3649.             }
  3650.         }
  3651.         return(0);
  3652.  
  3653. }
  3654. void Enemy()
  3655. {
  3656.     drawEnemyMissiles();
  3657. }
  3658.  
  3659.  
  3660. void drawEnemyBody()
  3661. {
  3662.     int i;
  3663.  
  3664.     glPushMatrix();
  3665.         //glRotatef(spin,1,0,0);
  3666.         goldMaterial();        
  3667.  
  3668.         glPushMatrix();
  3669.             glRotatef(90.0f,0.0f,0.0f,1.0f);
  3670.             cylinder(5.0f,3.0f);
  3671.         glPopMatrix();
  3672.  
  3673.         for (i=0; i<10; i++)
  3674.         {
  3675.             glPushMatrix();
  3676.                 glRotatef((GLfloat)36.0f*i,1.0f,0.0f,0.0f);
  3677.                 glTranslatef(1.5f,8.0f,0.0f);
  3678.                 cone(1.0f,3.0f);
  3679.             glPopMatrix();
  3680.         }
  3681.  
  3682.     glPopMatrix();
  3683.  
  3684. }
  3685. void drawEnemyLeftArm()
  3686. {
  3687.     glPushMatrix();
  3688.         glTranslatef(-5.0f,0.0f,0.0f);
  3689.         drawEnemyArm();
  3690.     glPopMatrix();
  3691. }
  3692. void drawEnemyRightArm()
  3693. {
  3694.     glPushMatrix();
  3695.         glTranslatef(6.0f,0.0f,0.0f);
  3696.         drawEnemyArm();
  3697.     glPopMatrix();
  3698. }
  3699. void drawEnemyArm()
  3700. {
  3701.     static float offset=0.0f;
  3702.     static int offset_flag=0;
  3703.  
  3704.     if (offset>1.8f)
  3705.     {
  3706.         offset_flag=1;
  3707.     }
  3708.     if (offset<-0.5f)
  3709.     {
  3710.         offset_flag=0;
  3711.     }
  3712.  
  3713.     if (offset_flag==0)
  3714.     {
  3715.         offset+=0.1f;
  3716.     }
  3717.     else
  3718.     {
  3719.         offset-=0.1f;
  3720.     }
  3721.  
  3722.     glPushMatrix();
  3723.         glScalef(0.5f,0.5f,0.5f);
  3724.         glRotatef(180.0f,1.0f,0.0f,0.0f);
  3725.         glPushMatrix();
  3726.             glTranslated(3.0f-offset, 0.0f, 0.0f);
  3727.             drawClamp();
  3728.         glPopMatrix();
  3729.         glPushMatrix();
  3730.             glRotated( 180.0f, 0.0f, 1.0f, 0.0f );
  3731.             glTranslated( -3.0f - offset, 0.0f, 0.0f );
  3732.             drawClamp();
  3733.         glPopMatrix();
  3734.         glTranslated( 1.5f, -1.0f, 0.0f );
  3735.         drawBase();
  3736.     glPopMatrix();
  3737.  
  3738. }
  3739. void drawClamp()
  3740. {
  3741.     copperMaterial();
  3742.  
  3743.     glBegin( GL_POLYGON );
  3744.         // front
  3745.         glNormal3d( 0.0f, 0.0f, 1.0f );
  3746.         glVertex3d( -1.0f, 12.0f, 1.0f );
  3747.         glVertex3d( -4.0f, 4.0f, 1.0f );
  3748.         glVertex3d( -4.0f, 1.0f, 1.0f );
  3749.         glVertex3d( -2.0f, 0.0f, 1.0f );
  3750.         glVertex3d( 0.0f, 0.0f, 1.0f );
  3751.         glVertex3d( 0.0f, 12.0f, 1.0f );
  3752.     glEnd();
  3753.  
  3754.     glBegin( GL_POLYGON );
  3755.         // back
  3756.         glNormal3d( 0.0f, 0.0f, -1.0f );
  3757.         glVertex3d( 0.0f, 12.0f, -1.0f );
  3758.         glVertex3d( 0.0f, 0.0f, -1.0f );
  3759.         glVertex3d( -2.0f, 0.0f, -1.0f );
  3760.         glVertex3d( -4.0f, 1.0f, -1.0f );
  3761.         glVertex3d( -4.0f, 4.0f, -1.0f );
  3762.         glVertex3d( -1.0f, 12.0f, -1.0f );
  3763.     glEnd();
  3764.  
  3765.     glBegin( GL_POLYGON );
  3766.         // top
  3767.         glNormal3d( 0.0f, 1.0f, 0.0f );
  3768.         glVertex3d( 0.0f, 12.0f, -1.0f );
  3769.         glVertex3d( -1.0f, 12.0f, -1.0f );
  3770.         glVertex3d( -1.0f, 12.0f, 1.0f );
  3771.         glVertex3d( 0.0f, 12.0f, 1.0f );
  3772.     glEnd();
  3773.  
  3774.     glBegin( GL_POLYGON );
  3775.         // left top
  3776.         glNormal3d( -0.936329177569044511547577898766f,
  3777.             0.35112344158839169183034171203725f, 0.0f );
  3778.         glVertex3d( -1.0f, 12.0f, -1.0f );
  3779.         glVertex3d( -4.0f, 4.0f, -1.0f );
  3780.         glVertex3d( -4.0f, 4.0f, 1.0f);
  3781.         glVertex3d( -1.0f, 12.0f, 1.0f );
  3782.     glEnd();
  3783.  
  3784.     glBegin( GL_POLYGON );
  3785.         // left middle
  3786.         glNormal3d( -1.0f, 0.0f, 0.0f );
  3787.         glVertex3d( -4.0f, 4.0f, -1.0f );
  3788.         glVertex3d( -4.0f, 1.0f, -1.0f );
  3789.         glVertex3d( -4.0f, 1.0f, 1.0f );
  3790.         glVertex3d( -4.0f, 4.0f, 1.0f );
  3791.     glEnd();
  3792.  
  3793.     glBegin( GL_POLYGON );
  3794.         // left bottom
  3795.         glNormal3d( -0.44721359549995793928183473374626f,
  3796.             -0.89442719099991587856366946749251f, 0.0f );
  3797.         glVertex3d( -4.0f, 1.0f, -1.0f );
  3798.         glVertex3d( -2.0f, 0.0f, -1.0f );
  3799.         glVertex3d( -2.0f, 0.0f, 1.0f );
  3800.         glVertex3d( -4.0f, 1.0f, 1.0f );
  3801.     glEnd();
  3802.  
  3803.     glBegin( GL_POLYGON );
  3804.         // right
  3805.         glNormal3d( 1.0f, 0.0f, 0.0f );
  3806.         glVertex3d( 0.0f, 12.0f, 1.0f );
  3807.         glVertex3d( 0.0f, 0.0f, 1.0f );
  3808.         glVertex3d( 0.0f, 0.0f, -1.0f );
  3809.         glVertex3d( 0.0f, 12.0f, -1.0f );
  3810.     glEnd();
  3811.  
  3812.     glBegin( GL_POLYGON );
  3813.         // bottom
  3814.         glNormal3d( 0.0f, -1.0f, 0.0f );
  3815.         glVertex3d( 0.0f, 0.0f, 1.0f );
  3816.         glVertex3d( -2.0f, 0.0f, 1.0f );
  3817.         glVertex3d( -2.0f, 0.0f, -1.0f );
  3818.         glVertex3d( 0.0f, 0.0f, -1.0f );
  3819.     glEnd();
  3820.  
  3821. }
  3822. void drawBase()
  3823. {
  3824.  
  3825.     chromeMaterial();
  3826.  
  3827.     glBegin( GL_POLYGON );
  3828.         // base front
  3829.         glNormal3d( 0.0f, 0.0f, 1.0f );
  3830.         glVertex3d( -3.0f, 3.0f, 1.0f );
  3831.         glVertex3d( -3.0f, 1.0f, 1.0f );
  3832.         glVertex3d( -1.0f, 0.0f, 1.0f );
  3833.         glVertex3d( 1.0f, 0.0f, 1.0f );
  3834.         glVertex3d( 3.0f, 1.0f, 1.0f );
  3835.         glVertex3d( 3.0f, 3.0f, 1.0f );
  3836.     glEnd();
  3837.  
  3838.     glBegin( GL_POLYGON );
  3839.         // base back
  3840.         glNormal3d( 0.0f, 0.0f, -1.0f );
  3841.         glVertex3d( 3.0f, 3.0f, -1.0f );
  3842.         glVertex3d( 3.0f, 1.0f, -1.0f );
  3843.         glVertex3d( 1.0f, 0.0f, -1.0f );
  3844.         glVertex3d( -1.0f, 0.0f, -1.0f );
  3845.         glVertex3d( -3.0f, 1.0f, -1.0f );
  3846.         glVertex3d( -3.0f, 3.0f, -1.0f );
  3847.     glEnd();
  3848.  
  3849.     glBegin( GL_POLYGON );
  3850.         // base top
  3851.         glNormal3d( 0.0f, 1.0f, 0.0f );
  3852.         glVertex3d( -3.0f, 3.0f, -1.0f );
  3853.         glVertex3d( -3.0f, 3.0f, 1.0f );
  3854.         glVertex3d( 3.0f, 3.0f, 1.0f );
  3855.         glVertex3d( 3.0f, 3.0f, -1.0f );
  3856.     glEnd();
  3857.  
  3858.     glBegin( GL_POLYGON );
  3859.         // base left
  3860.         glNormal3d( -1.0f, 0.0f, 0.0f );
  3861.         glVertex3d( -3.0f, 3.0f, -1.0f );
  3862.         glVertex3d( -3.0f, 1.0f, -1.0f );
  3863.         glVertex3d( -3.0f, 1.0f, 1.0f );
  3864.         glVertex3d( -3.0f, 3.0f, 1.0f );
  3865.     glEnd();
  3866.  
  3867.     glBegin( GL_POLYGON );
  3868.         // base right
  3869.         glNormal3d( 1.0f, 0.0f, 0.0f );
  3870.         glVertex3d( 3.0f, 3.0f, 1.0f );
  3871.         glVertex3d( 3.0f, 1.0f, 1.0f );
  3872.         glVertex3d( 3.0f, 1.0f, -1.0f );
  3873.         glVertex3d( 3.0f, 3.0f, -1.0f );
  3874.     glEnd();
  3875.  
  3876.     glBegin( GL_POLYGON );
  3877.         // base bottom
  3878.         glNormal3d( 0.0f, -1.0f, 0.0f );
  3879.         glVertex3d( -1.0f, 0.0f, 1.0f );
  3880.         glVertex3d( -1.0f, 0.0f, -1.0f );
  3881.         glVertex3d( 1.0f, 0.0f, -1.0f );
  3882.         glVertex3d( 1.0f, 0.0f, 1.0f );
  3883.     glEnd();
  3884.  
  3885.     glBegin( GL_POLYGON );
  3886.         // base bottom left
  3887.         glNormal3d( -0.44721359549995793928183473374626f,
  3888.             -0.89442719099991587856366946749251f, 0.0f );
  3889.         glVertex3d( -3.0f, 1.0f, -1.0f );
  3890.         glVertex3d( -1.0f, 0.0f, -1.0f );
  3891.         glVertex3d( -1.0f, 0.0f, 1.0f );
  3892.         glVertex3d( -3.0f, 1.0f, 1.0f );
  3893.     glEnd();
  3894.  
  3895.     glBegin( GL_POLYGON );
  3896.         // base bottom right
  3897.         glNormal3d( 0.44721359549995793928183473374626f,
  3898.             -0.89442719099991587856366946749251f, 0.0f );
  3899.         glVertex3d( 3.0f, 1.0f, 1.0f );
  3900.         glVertex3d( 1.0f, 0.0f, 1.0f );
  3901.         glVertex3d( 1.0f, 0.0f, -1.0f );
  3902.         glVertex3d( 3.0f, 1.0f, -1.0f );
  3903.     glEnd();
  3904.  
  3905. }
  3906.  
  3907. void drawEnemy()
  3908. {
  3909.     if (EnemyEngine[0].m_sleep==FALSE)
  3910.     {
  3911.         if (EnemyEngine[0].m_type==ENEMY_ROBOT)
  3912.         {
  3913.         glPushMatrix();
  3914.             glRotatef(90.0f,0.0f,1.0f,0.0f);
  3915.             drawEnemyBody();
  3916.             drawEnemyLeftArm();
  3917.             drawEnemyRightArm();
  3918.         glPopMatrix();
  3919.         }
  3920.         else if(EnemyEngine[0].m_type==TIE_FIGHTER)
  3921.         {
  3922.             glPushMatrix();
  3923.                 pewterMaterial();
  3924.                 drawTieFighter();
  3925.             glPopMatrix();
  3926.         }
  3927.         else if(EnemyEngine[0].m_type==ENEMY_SHIP)
  3928.         {
  3929.             glPushMatrix();
  3930.                 drawEnemyShip();
  3931.             glPopMatrix();
  3932.         }
  3933.     }
  3934. }
  3935. void Enemy_engine()
  3936. {
  3937.     int retval;
  3938.  
  3939.     retval=checkEnemyCollision(EnemyEngine[0].x,EnemyEngine[0].y,EnemyEngine[0].z);
  3940.     moveEnemy(0);
  3941.  
  3942.     glTranslatef(EnemyEngine[0].x,EnemyEngine[0].y,EnemyEngine[0].z);
  3943.     glRotatef(dRadToDeg(EnemyEngine[0].m_radians+((float)PI/2.0f))+90.0f, 0.0f, 1.0f, 0.0f);
  3944.  
  3945. }
  3946. int checkEnemyCollision(GLfloat object_x,GLfloat object_y,GLfloat object_z)
  3947. {
  3948.     GLfloat distance;
  3949.     GLfloat x,y,z;
  3950.     int i;
  3951.     int explosion_index;
  3952.  
  3953.         for(i=0; i<MINE_LIST_SIZE; i++)
  3954.         {
  3955.             if(objMineList[i].m_available_flag==FALSE)
  3956.             {
  3957.  
  3958.                 x=object_x-objMineList[i].m_x;
  3959.                 y=object_y-objMineList[i].m_y;
  3960.                 z=object_z-objMineList[i].m_z;
  3961.  
  3962.                 distance=(GLfloat)sqrt(x*x+y*y+z*z);
  3963.  
  3964.                 if (distance<20)
  3965.                 {
  3966.                     explosion_index=getAvailableExplosion();
  3967.                     if(explosion_index>-1)
  3968.                     {
  3969.                         objExplosion[explosion_index].x=x;
  3970.                         objExplosion[explosion_index].y=y;
  3971.                         objExplosion[explosion_index].z=z;
  3972.                         objExplosion[explosion_index].m_cpu_seconds=clock();
  3973.                         objExplosion[explosion_index].type=SPHERE_TYPE;
  3974.                     }
  3975.                     return(1);
  3976.                 }
  3977.                 
  3978.             }
  3979.         }
  3980.         return(0);
  3981.  
  3982. }
  3983.  
  3984. void moveEnemy(int index)
  3985. {
  3986.  
  3987.     GLfloat x,z,x2,z2;
  3988.     GLfloat distance1,distance2,distance3;
  3989.     int direction;
  3990.     GLfloat angle;
  3991.     static long current_clicks=clock();
  3992.     GLfloat old_x,old_z;
  3993.     static long mushroom_current_time=clock();
  3994.  
  3995.     old_x=EnemyEngine[index].x;
  3996.     old_z=EnemyEngine[index].z;
  3997.  
  3998.  
  3999.     if (EnemyEngine[index].m_sleep==TRUE)
  4000.     {
  4001.         if ((clock()-EnemyEngine[index].m_cpu_clicks)>10000)
  4002.         {
  4003.             EnemyEngine[index].m_sleep=FALSE;
  4004.         }
  4005.         return;
  4006.     }
  4007.  
  4008.  
  4009.     x=objBreakOut.m_xPos;
  4010.     z=objBreakOut.m_zPos;
  4011.  
  4012.     angle=EnemyEngine[index].m_radians;
  4013.  
  4014.     //straight line displacement
  4015.     x2 = (GLfloat) (EnemyEngine[index].m_velocity*cos(angle)+EnemyEngine[index].x);
  4016.     z2 = (GLfloat) (-EnemyEngine[index].m_velocity*sin(angle)+EnemyEngine[index].z);
  4017.  
  4018.     distance1=(GLfloat) sqrt((x-x2)*(x-x2)+(z-z2)*(z-z2));
  4019.  
  4020.     //left of center displacement
  4021.     x2 = (GLfloat) (EnemyEngine[index].m_velocity*cos(angle+(1.57f/4.0f))+EnemyEngine[index].x);
  4022.     z2 = (GLfloat) (-EnemyEngine[index].m_velocity*sin(angle+(1.57f/4.0f))+EnemyEngine[index].z);
  4023.  
  4024.     distance2=(GLfloat) sqrt((x-x2)*(x-x2)+(z-z2)*(z-z2));
  4025.  
  4026.     //right of center displacement
  4027.     x2 = (GLfloat) (EnemyEngine[index].m_velocity*cos(angle-(1.57f/4.0f))+EnemyEngine[index].x);
  4028.     z2 = (GLfloat) (-EnemyEngine[index].m_velocity*sin(angle-(1.57f/4.0f))+EnemyEngine[index].z);
  4029.  
  4030.     distance3=(GLfloat) sqrt((x-x2)*(x-x2)+(z-z2)*(z-z2));
  4031.  
  4032.     if(distance1>60)
  4033.     {
  4034.  
  4035.         if (
  4036.             (distance2<distance1) &&
  4037.             (distance2<distance3)
  4038.             )
  4039.             
  4040.         {
  4041.             //right
  4042.             direction=RIGHT_DIRECTION;
  4043.             EnemyEngine[index].m_velocity=1.0f;
  4044.         }
  4045.         else if(
  4046.             (distance3<distance1) &&
  4047.             (distance3<distance2)
  4048.             )
  4049.         {
  4050.             //left
  4051.             direction=LEFT_DIRECTION;
  4052.             EnemyEngine[index].m_velocity=1.0f;
  4053.         }
  4054.         else
  4055.         {
  4056.             direction=FORWARD_DIRECTION;
  4057.             EnemyEngine[index].m_velocity=5.0f;
  4058.         }
  4059.         
  4060.         moveEnemyEngine(direction,index);
  4061.     }
  4062.     else
  4063.     {
  4064.         if((clock()-EnemyEngine[index].m_cpu_clicks)>(1000))
  4065.         {
  4066.             if (
  4067.                 (distance2<distance1) &&
  4068.                 (distance2<distance3)
  4069.                 )
  4070.                 
  4071.             {
  4072.                 //right
  4073.                 direction=RIGHT_DIRECTION;
  4074.                 EnemyEngine[index].m_velocity=0.1f;
  4075.             }
  4076.             else if(
  4077.                 (distance3<distance1) &&
  4078.                 (distance3<distance2)
  4079.                 )
  4080.             {
  4081.                 //left
  4082.                 direction=LEFT_DIRECTION;
  4083.                 EnemyEngine[index].m_velocity=0.1f;
  4084.             }
  4085.             else
  4086.             {
  4087.                 direction=FORWARD_DIRECTION;
  4088.                 EnemyEngine[index].m_velocity=0.2f;
  4089.                 //add levels later
  4090.                 if((clock()-current_clicks)>2000)
  4091.                 {
  4092.                     fireEnemyMissile(0,EnemyEngine[index].m_type);
  4093.                     current_clicks=clock();
  4094.                 }
  4095.             }
  4096.  
  4097.             
  4098.             moveEnemyEngine(direction,index);
  4099.  
  4100.             EnemyEngine[index].m_cpu_clicks=clock();
  4101.         
  4102.         }
  4103.     }
  4104.  
  4105.     
  4106.     if(EnemyEngine[index].x > GRID_SIZE)
  4107.         EnemyEngine[index].x = (GLfloat) GRID_SIZE;
  4108.  
  4109.     if(EnemyEngine[index].x < -GRID_SIZE)
  4110.         EnemyEngine[index].x = (GLfloat) -GRID_SIZE;
  4111.  
  4112.     
  4113.     if(EnemyEngine[index].z > GRID_SIZE)
  4114.        EnemyEngine[index].z = (GLfloat) GRID_SIZE;
  4115.  
  4116.     if(EnemyEngine[index].z < -GRID_SIZE)
  4117.        EnemyEngine[index].z = (GLfloat) -GRID_SIZE;
  4118.  
  4119.        if(checkMushRoomCollision(EnemyEngine[index].x,3.0f,EnemyEngine[index].z)==1)
  4120.     {    
  4121.         EnemyEngine[index].x=old_x+1.0f;
  4122.         EnemyEngine[index].z=old_z;
  4123.     }
  4124.     /*
  4125.     if((clock()-mushroom_current_time)>6000)
  4126.     {
  4127.         if ((old_x!=EnemyEngine[index].x) &&
  4128.             (old_z!=EnemyEngine[index].z)
  4129.             )
  4130.         {
  4131.             generateMushRoom(old_x,1.0f,old_z-20.0f);
  4132.         }
  4133.         mushroom_current_time=clock();
  4134.     }
  4135.     */
  4136. }
  4137. void moveEnemyEngine(int direction,int index)
  4138. {
  4139.     GLfloat xDelta,zDelta;
  4140.  
  4141.     if(direction==RIGHT_DIRECTION)
  4142.     {
  4143.         EnemyEngine[index].m_radians+=1.57f/8.0f;
  4144.     }
  4145.     else if(direction==LEFT_DIRECTION)
  4146.     {
  4147.         EnemyEngine[index].m_radians-=1.57f/8.0f;
  4148.     }
  4149.  
  4150.     xDelta = (GLfloat) (EnemyEngine[index].m_velocity*cos(EnemyEngine[index].m_radians));
  4151.     zDelta = (GLfloat) (-EnemyEngine[index].m_velocity*sin(EnemyEngine[index].m_radians));
  4152.     
  4153.     EnemyEngine[index].x += xDelta;
  4154.     EnemyEngine[index].z += zDelta;
  4155.  
  4156. }
  4157.  
  4158.  
  4159. void drawExplosion()
  4160. {
  4161.     int i;
  4162.  
  4163.     for(i=0; i<EXPLOSION_SIZE; i++)
  4164.     {
  4165.         if(objExplosion[i].m_available_flag==FALSE)
  4166.         {
  4167.             if((clock()-objExplosion[i].m_cpu_seconds)>1000)
  4168.             {
  4169.                 objExplosion[i].m_available_flag=TRUE;
  4170.                 //objExplosion[i].m_active_flag=FALSE;
  4171.                 objExplosion[i].scale_x=2.0f;
  4172.                 objExplosion[i].scale_y=2.0f;
  4173.                 objExplosion[i].scale_z=2.0f;
  4174.                 break;
  4175.             }
  4176.  
  4177.             glPushMatrix();
  4178.                 glTranslatef(objExplosion[i].x,objExplosion[i].y,objExplosion[i].z);
  4179.                 glScalef(objExplosion[i].scale_x,objExplosion[i].scale_y,objExplosion[i].scale_z);
  4180.                 objExplosion[i].scale_x+=1.0f;
  4181.                 objExplosion[i].scale_y+=1.0f;
  4182.                 objExplosion[i].scale_z+=1.0f;
  4183.                 glRotatef(90.0f,1.0f,0.0f,0.0f);
  4184.             
  4185.                 if (objExplosion[i].type==TORUS_TYPE)
  4186.                 {
  4187.                     setDiffuseMaterialColor(1.0f,0.0f,1.0f,0.6f);
  4188.                     torus(1.0f,3.0f);
  4189.                 }
  4190.                 else if(objExplosion[i].type==SPHERE_TYPE)
  4191.                 {
  4192.                     goldMaterial();
  4193.                     point_sphere(1.0f);
  4194.                 }
  4195.             glPopMatrix();
  4196.         }
  4197.         
  4198.     }
  4199. }
  4200. void fireEnemyMissile(int index, int type)
  4201. {
  4202.     GLint i;
  4203.  
  4204.     i=getAvailableEnemyMissile();
  4205.  
  4206.     if(i>-1)
  4207.     {
  4208.         enemyMissile[i].m_x=EnemyEngine[index].x;
  4209.         enemyMissile[i].m_y=EnemyEngine[index].y;
  4210.         enemyMissile[i].m_z=EnemyEngine[index].z;
  4211.         enemyMissile[i].m_Vo=20.0f;
  4212.         enemyMissile[i].m_radians=EnemyEngine[index].m_radians;
  4213.         enemyMissile[i].m_available_flag=FALSE;
  4214.         enemyMissile[i].m_type=type;
  4215.         //enemyMissile[i].m_active_flag=TRUE;
  4216.     }
  4217. }
  4218. int getAvailableEnemyMissile()
  4219. {
  4220.     int i;
  4221.     for(i=0; i<NUMBER_OF_MISSILES; i++)
  4222.     {
  4223.         if (enemyMissile[i].m_available_flag==TRUE)
  4224.         {
  4225.             return(i);
  4226.         }
  4227.     }
  4228.     return(-1);
  4229. }
  4230. void drawEnemyMissiles()
  4231. {
  4232.     GLint i=0;
  4233.     GLfloat x,z;
  4234.     GLfloat distance;
  4235.     GLint retVal;
  4236.  
  4237.     for(i=0; i<NUMBER_OF_MISSILES; i++)
  4238.     {
  4239.         if(enemyMissile[i].m_available_flag==FALSE)
  4240.         {
  4241.             x=(enemyMissile[i].m_Vo)*(float)cos(enemyMissile[i].m_radians);
  4242.             z=-(enemyMissile[i].m_Vo)*(float)sin(enemyMissile[i].m_radians);
  4243.  
  4244.             enemyMissile[i].m_x += x;
  4245.             enemyMissile[i].m_z += z;
  4246.  
  4247.             retVal=checkBreakOutHit(enemyMissile[i].m_x,5.0f,enemyMissile[i].m_z,enemyMissile[i].m_type);
  4248.  
  4249.             if (retVal==1)
  4250.             {
  4251.                 enemyMissile[i].m_available_flag=TRUE;
  4252.                 //enemyMissile[i].m_active_flag=FALSE;
  4253.                 objBreakOut.m_hit++;
  4254.                 break;
  4255.             }
  4256.             else
  4257.             {
  4258.             
  4259.                 glPushMatrix();
  4260.                     glTranslatef(enemyMissile[i].m_x,enemyMissile[i].m_y,enemyMissile[i].m_z);
  4261.                     
  4262.                     if((enemyMissile[i].m_type==ENEMY_ROBOT) || (enemyMissile[i].m_type==ENEMY_SHIP))
  4263.                     {
  4264.                     glPushMatrix();
  4265.                         glScalef(0.5f,0.5f,0.5f);
  4266.                         glRotatef(dRadToDeg(enemyMissile[i].m_radians),0.0f,1.0f,0.0f);
  4267.                         glTranslatef(5.0f,10.0f,0.0f);
  4268.                         glRotatef(90.0f,0.0f,1.0f,0.0f);
  4269.                         toroidal_spiral();
  4270.                     glPopMatrix();
  4271.                     }
  4272.                     else if(enemyMissile[i].m_type==TIE_FIGHTER)
  4273.                     {
  4274.                         glPushMatrix();
  4275.                             icosahedron();
  4276.                         glPopMatrix();
  4277.                     }
  4278.  
  4279.                 glPopMatrix();
  4280.             }
  4281.  
  4282.             x=EnemyEngine[0].x-enemyMissile[i].m_x;
  4283.             z=EnemyEngine[0].z-enemyMissile[i].m_z;
  4284.  
  4285.             distance=(float) sqrt(x*x+z*z);
  4286.             if (distance>100)
  4287.             {
  4288.                 enemyMissile[i].m_available_flag=TRUE;
  4289.                 //enemyMissile[i].m_active_flag=FALSE;
  4290.             }
  4291.         }
  4292.     }
  4293.  
  4294.     if((objBreakOut.m_hit>=1) || (objBreakOut.m_shield<=0))
  4295.     {
  4296.         objBreakOut.m_hit=0;
  4297.         objBreakOut.m_xPos=20.0f;
  4298.         objBreakOut.m_zPos=-50.0f;
  4299.         objBreakOut.m_radians=-1.57f;
  4300.         mLives--;
  4301.         objBreakOut.m_shield=300;
  4302.     }
  4303.  
  4304.  
  4305. }
  4306.  
  4307. int checkEnemyHit(GLfloat x,GLfloat y,GLfloat z, int index)
  4308. {
  4309. int retval;
  4310. GLfloat enemy_x,enemy_y,enemy_z;
  4311. GLfloat vector_x,vector_y,vector_z;
  4312. GLfloat distance;
  4313. int explosion_index;
  4314.  
  4315.     retval=0;
  4316.  
  4317.     enemy_x=EnemyEngine[index].x;
  4318.     enemy_y=EnemyEngine[index].y;
  4319.     enemy_z=EnemyEngine[index].z;
  4320.  
  4321.     vector_x=enemy_x-x;
  4322.     vector_y=enemy_y-y;
  4323.     vector_z=enemy_z-z;
  4324.  
  4325.     distance=(GLfloat) sqrt(vector_x*vector_x+vector_y*vector_y+vector_z*vector_z);
  4326.  
  4327.     if(distance<=10)
  4328.     {
  4329.  
  4330.         explosion_index=getAvailableExplosion();
  4331.         if(explosion_index>-1)
  4332.         {
  4333.             objExplosion[explosion_index].x=x;
  4334.             objExplosion[explosion_index].y=y;
  4335.             objExplosion[explosion_index].z=z;
  4336.             objExplosion[explosion_index].m_cpu_seconds=clock();
  4337.             objExplosion[explosion_index].type=TORUS_TYPE;
  4338.         }
  4339.  
  4340.  
  4341.         //sound("hit.wav");
  4342.         retval=1;
  4343.  
  4344.         return(retval);
  4345.     }
  4346.  
  4347.     return(retval);
  4348. }
  4349. void toroidal_spiral()
  4350. {
  4351.     GLfloat t;
  4352.     GLfloat x,y,z;
  4353.     GLfloat a,b,c,p,q;
  4354.     GLfloat theta;
  4355.  
  4356.     /*
  4357.     a=radius of the torus
  4358.     b=cross section radius of the torus
  4359.     p=number of interweavings
  4360.     q=number of twists
  4361.     c=constant
  4362.     */
  4363.         a=5.0f;
  4364.         b=3.0f;
  4365.         p=1.0f;
  4366.         q=7.0f;
  4367.         c=3.0f;
  4368.  
  4369.     glPushAttrib(GL_LIGHTING);
  4370.     glDisable(GL_LIGHTING);
  4371.     glRGB(255,0,0);
  4372.     glPushMatrix();
  4373.         glBegin(GL_LINE_STRIP);
  4374.         for(theta=0.0f; theta<=360.0f; theta+=1.0f)
  4375.         {
  4376.             t=(theta/180.0f*3.142f);
  4377.             x=(GLfloat)  ((a+b*cos(q*t))*cos(p*t));
  4378.             y=(GLfloat) ((a+b*cos(q*t))*sin(p*t));
  4379.             z=(GLfloat) (c*sin(q*t));
  4380.             glVertex3f(x,y,z);
  4381.         }
  4382.     glEnd();
  4383.     glPopMatrix();
  4384.     glPopAttrib();
  4385.     glEnable(GL_LIGHTING);
  4386.  
  4387. }
  4388. void drawMine()
  4389. {
  4390.     GLfloat glfMatColorRed[]={1.0f,0.1f,0.0f,1.0f};
  4391.     GLfloat glfMatColorYellow[]= {1.0f, 1.0f, 0.0f};
  4392.     GLfloat glfMatColorBlue[]={0.20f, 0.0f, 0.60f,1.0f};
  4393.     GLfloat glfMatColorWhite[]={0.8f, 0.8f, 0.80f,1.0f};
  4394.     GLfloat glfMatColorGrey[]={0.50f,0.50f,0.90f,1.0f};
  4395.     GLfloat glfMatColorGreen[]={0.0f, 0.6f, 0.1f,1.0f};
  4396.  
  4397.  
  4398.     glPushMatrix();
  4399.         glScalef(2.0f,2.0f,2.0f);
  4400.  
  4401.         glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,glfMatColorBlue);
  4402.  
  4403.         glBegin(GL_POLYGON);
  4404.             glNormal3f(0.0f,0.0f,1.0f);
  4405.             glVertex3f(  + 0.0f ,  + 4.0f ,  + 0.0f );
  4406.             glVertex3f(  -0.25f ,  + 2.0f ,  + 0.25f );
  4407.             glVertex3f(  + 0.25f ,  + 2.0f ,  + 0.25f );
  4408.         glEnd(); /*front of spike*/
  4409.     
  4410.         glBegin(GL_POLYGON);
  4411.             glNormal3f(0.0f,0.0f,-1.0f);
  4412.             glVertex3f(  + 0.25f ,  + 2.0f ,  -0.25f );
  4413.             glVertex3f(  -0.25f ,  + 2.0f ,  -0.25f );
  4414.             glVertex3f(  + 0.0f ,  + 4.0f ,  + 0.0f );
  4415.         glEnd();  /*back of spike*/
  4416.  
  4417.         glBegin(GL_POLYGON);
  4418.             glNormal3f(-1.0f,0.0f,0.0f);
  4419.             glVertex3f(  + 0.0f ,  + 4.0f ,  + 0.0f );
  4420.             glVertex3f(  -0.25f ,  + 2.0f ,  -0.25f );
  4421.             glVertex3f(  -0.25f ,  + 2.0f ,  + 0.25f );
  4422.         glEnd();  /*left of spike*/
  4423.  
  4424.         glBegin(GL_POLYGON);
  4425.             glNormal3f(1.0f,0.0f,0.0f);
  4426.             glVertex3f(  + 0.250f ,  + 2.0f ,  + 0.25f );
  4427.             glVertex3f(  + 0.25f ,  + 2.0f ,  -0.25f );
  4428.             glVertex3f(  + 0.0f ,  + 4.0f ,  + 0.0f );
  4429.         glEnd();  /*right of spike*/
  4430.  
  4431.  
  4432.         glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,glfMatColorRed);
  4433.  
  4434.         glBegin(GL_POLYGON);
  4435.             glNormal3f(0.0f,1.0f,0.0f);
  4436.             glVertex3f(  -0.50f ,  + 2.50f ,  -0.50f );
  4437.             glVertex3f(  -0.50f ,  + 2.50f ,  + 0.50f );
  4438.             glVertex3f(  + 0.50f ,  + 2.50f ,  + 0.50f );
  4439.             glVertex3f(  + 0.50f ,  + 2.50f ,  -0.50f );
  4440.         glEnd();      /*top of block*/
  4441.     
  4442.         glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,glfMatColorGrey);
  4443.  
  4444.         glBegin(GL_POLYGON);
  4445.             glNormal3f(0.0f,-1.0f,0.0f);
  4446.             glVertex3f(  -3.0f ,  + 0.0f ,  -3.0f );
  4447.             glVertex3f(  + 3.0f ,  + 0.0f ,  -3.0f );
  4448.             glVertex3f(  + 3.0f ,  + 0.0f ,  + 3.0f );
  4449.             glVertex3f(  -3.0f ,  + 0.0f ,  + 3.0f );
  4450.         glEnd();  /*bottom of big block*/
  4451.     
  4452.  
  4453.       
  4454.         glBegin(GL_POLYGON);
  4455.             glNormal3f(0.0f,1.0f,0.0f);
  4456.             glVertex3f(  -2.0f ,  + 2.00f ,  -2.0f );
  4457.             glVertex3f(  -2.0f ,  + 2.0f ,  + 2.0f );
  4458.             glVertex3f(  + 2.0f ,  + 2.0f ,  + 2.0f );
  4459.             glVertex3f(  + 2.0f ,  + 2.0f ,  -2.0f );
  4460.         glEnd();      /*top of big block*/
  4461.  
  4462.         glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,glfMatColorWhite);
  4463.     
  4464.         glBegin(GL_POLYGON);
  4465.             glNormal3f(0.0f,0.0f,1.0f);
  4466.             glVertex3f(  + 0.50f ,  + 3.0f ,  + 0.50f );
  4467.             glVertex3f(  - 0.50f ,  + 3.0f ,  + 0.50f );
  4468.             glVertex3f(  -1.0f ,  + 2.0f ,  + 1.0f );
  4469.             glVertex3f(  + 1.0f ,  + 2.0f ,  + 1.0f );
  4470.         glEnd(); /*front of block*/
  4471.     
  4472.         glBegin(GL_POLYGON);
  4473.             glNormal3f(0.0f,0.0f,-1.0f);
  4474.             glVertex3f(  + 0.5f ,  + 3.0f ,  -0.50f );
  4475.             glVertex3f(  + 1.0f ,  + 2.0f ,  -1.0f );
  4476.             glVertex3f(  -1.0f ,  + 2.0f ,  -1.0f );
  4477.             glVertex3f(  - 0.5f ,  + 3.0f ,  - 0.50f );
  4478.         glEnd();  /*back of block*/
  4479.  
  4480.         glBegin(GL_POLYGON);
  4481.             glNormal3f(-1.0f,0.0f,0.0f);
  4482.             glVertex3f(  -0.50f ,  + 3.0f ,  + 0.50f );
  4483.             glVertex3f(  - 0.50f ,  + 3.0f ,  - 0.50f );
  4484.             glVertex3f(  -1.0f ,  + 2.0f ,  -1.0f );
  4485.             glVertex3f(  -1.0f ,  + 2.0f ,  + 1.0f );
  4486.         glEnd();  /*left of block*/
  4487.  
  4488.         glBegin(GL_POLYGON);
  4489.             glNormal3f(1.0f,0.0f,0.0f);
  4490.             glVertex3f(  + 0.50f ,  + 3.0f ,  + 0.50f );
  4491.             glVertex3f(  + 1.0f ,  + 2.0f ,  + 1.0f );
  4492.             glVertex3f(  + 1.0f ,  + 2.0f ,  -1.0f );
  4493.             glVertex3f(  + 0.50f ,  + 3.0f ,  - 0.50f );
  4494.         glEnd();  /*right of block*/
  4495.             
  4496.             
  4497.             
  4498.         glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,glfMatColorWhite);        
  4499.  
  4500.         glBegin(GL_POLYGON);
  4501.             glNormal3f(0.0f,0.0f,1.0f);
  4502.             glVertex3f(  + 0.50f ,  + 2.0f ,  + 0.50f );
  4503.             glVertex3f(  - 0.50f ,  + 2.0f ,  + 0.50f );
  4504.             glVertex3f(  -0.50f ,  + 3.0f ,  + 0.50f );
  4505.             glVertex3f(  + 0.50f ,  + 3.0f ,  + 0.50f );
  4506.         glEnd(); /*front of inside of block*/
  4507.     
  4508.         glBegin(GL_POLYGON);
  4509.             glNormal3f(0.0f,0.0f,-1.0f);
  4510.             glVertex3f(  + 0.5f ,  + 2.0f ,  -0.50f );
  4511.             glVertex3f(  + 0.50f ,  + 3.0f ,  -0.50f );
  4512.             glVertex3f(  -0.50f ,  + 3.0f ,  -0.50f );
  4513.             glVertex3f(  - 0.5f ,  + 2.0f ,  - 0.50f );
  4514.         glEnd();  /*back of  inside of block*/
  4515.  
  4516.         glBegin(GL_POLYGON);
  4517.             glNormal3f(1.0f,0.0f,0.0f);
  4518.             glVertex3f(  -0.50f ,  + 2.0f ,  + 0.50f );
  4519.             glVertex3f(  -0.50f ,  + 2.0f ,  -0.50f );
  4520.             glVertex3f(  - 0.50f ,  + 3.0f ,  - 0.50f );
  4521.             glVertex3f(  -0.50f ,  + 3.0f ,  + 0.50f );
  4522.         glEnd();  /*left of  inside of block*/
  4523.  
  4524.         glBegin(GL_POLYGON);
  4525.             glNormal3f(1.0f,0.0f,0.0f);
  4526.             glVertex3f(  + 0.50f ,  + 3.0f ,  - 0.50f );
  4527.             glVertex3f(  + 0.50f ,  + 2.0f ,  - 0.50f );
  4528.             glVertex3f(  + 0.50f ,  + 2.0f ,  +0.50f );
  4529.             glVertex3f(  + 0.50f ,  + 3.0f ,  + 0.50f );
  4530.         glEnd();  /*right of  inside of block*/        
  4531.             
  4532.         glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,glfMatColorGrey);
  4533.  
  4534.         glBegin(GL_POLYGON);
  4535.             glNormal3f(0.0f,0.0f,1.0f);
  4536.             glVertex3f(  + 2.0f ,  + 2.0f ,  + 2.0f );
  4537.             glVertex3f(  - 2.0f ,  + 2.0f ,  + 2.0f );
  4538.             glVertex3f(  -3.0f ,  + 0.0f ,  + 3.0f );
  4539.             glVertex3f(  + 3.0f ,  + 0.0f ,  + 3.0f );
  4540.         glEnd(); /*front of big block*/
  4541.     
  4542.         glBegin(GL_POLYGON);
  4543.             glNormal3f(0.0f,0.0f,-1.0f);
  4544.             glVertex3f(  + 2.0f ,  + 2.0f ,  -2.0f );
  4545.             glVertex3f(  + 3.0f ,  + 0.0f ,  -3.0f );
  4546.             glVertex3f(  -3.0f ,  + 0.0f ,  -3.0f );
  4547.             glVertex3f(  - 2.0f ,  + 2.0f ,  - 2.00f );
  4548.         glEnd();  /*back of big block*/
  4549.  
  4550.         glBegin(GL_POLYGON);
  4551.             glNormal3f(-1.0f,0.0f,0.0f);
  4552.             glVertex3f(  -2.0f ,  + 2.0f ,  + 2.0f );
  4553.             glVertex3f(  - 2.0f ,  + 2.0f ,  - 2.0f );
  4554.             glVertex3f(  -3.0f ,  + 0.0f ,  -3.0f );
  4555.             glVertex3f(  -3.0f ,  + 0.0f ,  + 3.0f );
  4556.         glEnd();  /*left of big block*/
  4557.  
  4558.         glBegin(GL_POLYGON);
  4559.             glNormal3f(1.0f,0.0f,0.0f);
  4560.             glVertex3f(  + 2.0f ,  + 2.0f ,  + 2.0f );
  4561.             glVertex3f(  + 3.0f ,  + 0.0f ,  + 3.0f );
  4562.             glVertex3f(  + 3.0f ,  + 0.0f ,  -3.0f );
  4563.             glVertex3f(  + 2.0f ,  + 2.0f ,  - 2.0f );
  4564.         glEnd();  /*right of big block*/
  4565.         
  4566.     glPopMatrix();
  4567.  
  4568. }
  4569. int getAvailableBreakOutMissile()
  4570. {
  4571.     int i;
  4572.     for(i=0; i<NUMBER_OF_MISSILES; i++)
  4573.     {
  4574.         if (breakOutMissile[i].m_available_flag==TRUE)
  4575.         {
  4576.             return(i);
  4577.         }
  4578.     }
  4579.     return(-1);
  4580. }
  4581. void missileObject()
  4582. {
  4583.     glPushMatrix();
  4584.     copperMaterial();
  4585.     glScalef(0.5f,0.5f,0.5f);
  4586.     glRotatef(180.0f,0.0f,1.0f,0.0f);
  4587.     glRotatef(90.0f,0.0f,0.0f,1.0f);
  4588.     glPushMatrix();
  4589.         glPushMatrix();
  4590.             glTranslatef(0.0f,3.0f,0.0f);
  4591.             cone(1.5f,3.0f);
  4592.         glPopMatrix();
  4593.  
  4594.         cylinder(1.5f,10.0f);
  4595.  
  4596.         glPushMatrix();
  4597.             glTranslatef(0.0f,-5.0f,0.0f);
  4598.             glBegin(GL_POLYGON);
  4599.                 glNormal3f(0.0f,1.0f,0.0f);
  4600.                 glVertex3f(0.0f,0.0f,0.0f);
  4601.                 glVertex3f(0.0f,-5.0f,0.0f);
  4602.                 glVertex3f(-3.6f,-5.0f,0.0f);
  4603.                 glVertex3f(-3.5f,-5.0f,0.0f);
  4604.             glEnd();
  4605.  
  4606.             glBegin(GL_POLYGON);
  4607.                 glNormal3f(0.0f,1.0f,0.0f);
  4608.                 glVertex3f(0.0f,0.0f,0.0f);
  4609.                 glVertex3f(5.1f,-5.0f,0.0f);
  4610.                 glVertex3f(5.0f,-5.0f,0.0f);
  4611.                 glVertex3f(0.0f,-3.0f,0.0f);
  4612.             glEnd();
  4613.             
  4614.             glBegin(GL_POLYGON);
  4615.                 glNormal3f(0.0f,1.0f,0.0f);
  4616.                 glVertex3f(0.0f,0.0f,0.0f);
  4617.                 glVertex3f(0.0f,-5.0f,0.0f);
  4618.                 glVertex3f(5.0f,-5.0f,3.0f);
  4619.                 glVertex3f(0.0f,-5.0f,0.0f);
  4620.             glEnd();
  4621.  
  4622.             glBegin(GL_POLYGON);
  4623.                 glNormal3f(0.0f,1.0f,0.0f);
  4624.                 glVertex3f(0.0f,0.0f,0.0f);
  4625.                 glVertex3f(0.0f,-5.0f,0.0f);
  4626.                 glVertex3f(5.0f,-5.0f,-3.0f);
  4627.                 glVertex3f(0.0f,-5.0f,0.0f);
  4628.             glEnd();
  4629.  
  4630.         glPopMatrix();
  4631.  
  4632.     glPopMatrix();
  4633. glPopMatrix();
  4634. }
  4635. int checkBreakOutHit(GLfloat x,GLfloat y,GLfloat z,int projectile_type)
  4636. {
  4637. int retval;
  4638. GLfloat breakOut_x,breakOut_y,breakOut_z;
  4639. GLfloat vector_x,vector_y,vector_z;
  4640. GLfloat distance;
  4641. int explosion_index;
  4642.  
  4643.     retval=0;
  4644.  
  4645.     breakOut_x=objBreakOut.m_xPos;
  4646.     breakOut_y=objBreakOut.m_yPos;
  4647.     breakOut_z=objBreakOut.m_zPos;
  4648.  
  4649.     vector_x=breakOut_x-x;
  4650.     vector_y=breakOut_y-y;
  4651.     vector_z=breakOut_z-z;
  4652.  
  4653.     distance=(GLfloat) sqrt(vector_x*vector_x+vector_y*vector_y+vector_z*vector_z);
  4654.  
  4655.     if(distance<=10)
  4656.     {
  4657.         explosion_index=getAvailableExplosion();
  4658.         if(explosion_index>-1)
  4659.         {
  4660.             objExplosion[explosion_index].x=x;
  4661.             objExplosion[explosion_index].y=y;
  4662.             objExplosion[explosion_index].z=z;
  4663.             objExplosion[explosion_index].m_cpu_seconds=clock();
  4664.             objExplosion[explosion_index].type=TORUS_TYPE;
  4665.         }
  4666.  
  4667.         //sound("hit.wav");
  4668.         retval=1;
  4669.  
  4670.         return(retval);
  4671.     }
  4672.  
  4673.     return(retval);
  4674. }
  4675. int checkEnemyMineHit(GLfloat x,GLfloat y,GLfloat z)
  4676. {
  4677. int retval;
  4678. GLfloat enemy_x,enemy_y,enemy_z;
  4679. GLfloat vector_x,vector_y,vector_z;
  4680. GLfloat distance;
  4681. int explosion_index;
  4682.  
  4683.     retval=0;
  4684.  
  4685.     enemy_x=EnemyEngine[0].x;
  4686.     enemy_y=EnemyEngine[0].y;
  4687.     enemy_z=EnemyEngine[0].z;
  4688.  
  4689.     vector_x=enemy_x-x;
  4690.     vector_y=enemy_y-y;
  4691.     vector_z=enemy_z-z;
  4692.  
  4693.     distance=(GLfloat) sqrt(vector_x*vector_x+vector_y*vector_y+vector_z*vector_z);
  4694.  
  4695.     if(distance<=10)
  4696.     {
  4697.         explosion_index=getAvailableExplosion();
  4698.         if(explosion_index>-1)
  4699.         {
  4700.             objExplosion[explosion_index].x=x;
  4701.             objExplosion[explosion_index].y=y;
  4702.             objExplosion[explosion_index].z=z;
  4703.             objExplosion[explosion_index].m_cpu_seconds=clock();
  4704.             objExplosion[explosion_index].type=TORUS_TYPE;
  4705.         }
  4706.  
  4707.         //sound("hit.wav");
  4708.         retval=1;
  4709.  
  4710.         return(retval);
  4711.     }
  4712.  
  4713.     return(retval);
  4714. }
  4715.  
  4716. void mushRoom()
  4717. {
  4718.  
  4719.     /*
  4720. GLUnurbsObj *pNurb = NULL;
  4721. GLint nNumPoints = 4; 
  4722. GLfloat ctrlPoints[4][4][3]= {{{  -3.0f, -5.0f, 0.0f},    // u = 0,    v = 0
  4723.                               {      -6.0f, -2.0f, 0.0f},    //            v = 1
  4724.                               {   -6.0f,  2.0f, 0.0f},    //            v = 2    
  4725.                               {   -3.0f,  5.0f, 0.0f}}, //            v = 3
  4726.                              
  4727.                               {{  -2.0f, -6.0f, 0.0f},    // u = 1    v = 0
  4728.                               {   -2.0f, -2.0f, 8.0f},    //            v = 1
  4729.                               {   -2.0f,  2.0f, 8.0f},    //            v = 2
  4730.                               {   -2.0f,  6.0f, 0.0f}},    //            v = 3
  4731.                               
  4732.                               {{   2.0f, -6.0f, 0.0f }, // u =2        v = 0
  4733.                               {    2.0f, -2.0f, 8.0f }, //            v = 1
  4734.                               {    2.0f,  2.0f, 8.0f },    //            v = 2
  4735.                               {    2.0f,  6.0f, 0.0f }},//            v = 3
  4736.  
  4737.                               {{   3.0f, -5.0f, 0.0f},    // u = 3    v = 0
  4738.                               {    6.0f, -2.0f, 0.0f},    //            v = 1
  4739.                               {    6.0f,  2.0f, 0.0f},    //            v = 2
  4740.                               {    3.0f,  5.0f, 0.0f}}};//            v = 3
  4741.  
  4742.     // Knot sequence for the NURB
  4743.     GLfloat Knots[8] = {0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f};
  4744.  
  4745.     pNurb = gluNewNurbsRenderer();
  4746.  
  4747.     gluNurbsProperty(pNurb, GLU_DISPLAY_MODE, GLU_FILL);
  4748.  
  4749.     gluBeginSurface(pNurb);
  4750.     
  4751.     gluNurbsSurface(pNurb, 
  4752.         8, 
  4753.         Knots, 
  4754.         8, 
  4755.         Knots, 
  4756.         4 * 3, 
  4757.         3, 
  4758.         &ctrlPoints[0][0][0], 
  4759.         4, 
  4760.         4, 
  4761.         GL_MAP2_VERTEX_3);
  4762.  
  4763.     
  4764.     // Done with surface
  4765.     gluEndSurface(pNurb);
  4766.  
  4767.     if(pNurb)
  4768.         gluDeleteNurbsRenderer(pNurb);
  4769.  
  4770.   */
  4771.     cylinder(5.0f,5.0f);
  4772.     glTranslatef(0.0f,1.5f,0.0f);
  4773.     cylinder(10.0f,1.0f);
  4774. }
  4775. int checkMushRoomHit(GLfloat missile_x,GLfloat missile_y,GLfloat missile_z)
  4776. {
  4777.  int i;
  4778.  GLfloat wall_x1,wall_x2;
  4779.  GLfloat wall_z1,wall_z2;
  4780.  GLfloat cellsize;
  4781.  int index;
  4782.     
  4783.     cellsize=(GLfloat)(GRID_SIZE/10.0f);
  4784.  
  4785.     for(i=0; i<OBJECT_LIST_SIZE; i++)
  4786.     {
  4787.         if    (objMushRoomList[i].m_available_flag==FALSE)
  4788.         {
  4789.                 wall_x1=objMushRoomList[i].m_x-(cellsize/2);
  4790.                 wall_x2=objMushRoomList[i].m_x+(cellsize/2);
  4791.                 wall_z1=objMushRoomList[i].m_z+(cellsize/2);
  4792.                 wall_z2=objMushRoomList[i].m_z-(cellsize/2);
  4793.  
  4794.                 if (
  4795.                     (missile_x>wall_x1) &&
  4796.                     (missile_x<wall_x2) &&
  4797.                     (missile_z<wall_z1) &&
  4798.                     (missile_z>wall_z2)
  4799.                 )
  4800.                 {
  4801.                     index=getAvailableExplosion();
  4802.                     if(index>-1)
  4803.                     {
  4804.                         objExplosion[index].x=objMushRoomList[i].m_x;
  4805.                         objExplosion[index].y=2.0f;
  4806.                         objExplosion[index].z=objMushRoomList[i].m_z;
  4807.                         objExplosion[index].m_cpu_seconds=clock();
  4808.                         objExplosion[index].type=SPHERE_TYPE;
  4809.                     }
  4810.  
  4811.                     objMushRoomList[i].m_available_flag=TRUE;
  4812.                     objBreakOut.m_score+=10;
  4813.                     m_subtotal_score+=10;
  4814.  
  4815.                     return(1);
  4816.                 }
  4817.                 /*
  4818.  
  4819.                 glPushMatrix();
  4820.                     glBegin(GL_LINE_LOOP);
  4821.                         glVertex3f(wall_x1,5.0f,wall_z1);
  4822.                         glVertex3f(wall_x2,5.0f,wall_z1);
  4823.                         glVertex3f(wall_x2,5.0f,wall_z2);
  4824.                         glVertex3f(wall_x1,5.0f,wall_z2);
  4825.                     glEnd();
  4826.                 glPopMatrix();
  4827.                 */
  4828.         } // end if
  4829.     } //end for
  4830.     return(0);
  4831.  
  4832. }
  4833. void generateMushRoom(GLfloat x,GLfloat y,GLfloat z)
  4834. {
  4835.     int i;
  4836.  
  4837.     for(i=0; i<OBJECT_LIST_SIZE; i++)
  4838.     {
  4839.         if    (objMushRoomList[i].m_available_flag==TRUE)
  4840.         {
  4841.             objMushRoomList[i].m_available_flag=FALSE;
  4842.             objMushRoomList[i].m_x=x;
  4843.             objMushRoomList[i].m_y=y;
  4844.             objMushRoomList[i].m_z=z;
  4845.             break;
  4846.         } // end if
  4847.     } //end for
  4848.  
  4849. }
  4850. void icosahedron()
  4851. {
  4852.     GLfloat normal[3];
  4853.     VECTOR_STRUCT_TYPE vertex[12];
  4854.     GLfloat t;
  4855.  
  4856.     setAmbientMaterialColor(0.0f,0.0f,0.5f,1.0f);
  4857.     setDiffuseMaterialColor(0.0f,0.0f,0.8f,1.0f);
  4858.  
  4859.     t=(float) sqrt((float)(5)-1)/2;
  4860.  
  4861.     /*Icoshedron*/
  4862.     vertex[0].m_x=0.0f;
  4863.     vertex[0].m_y=1.0f;
  4864.     vertex[0].m_z=t;
  4865.  
  4866.     vertex[1].m_x=0.0f;
  4867.     vertex[1].m_y=1.0f;
  4868.     vertex[1].m_z=-t;
  4869.  
  4870.     vertex[2].m_x=1.0f;
  4871.     vertex[2].m_y=t;
  4872.     vertex[2].m_z=0.0f;
  4873.  
  4874.     vertex[3].m_x=1.0f;
  4875.     vertex[3].m_y=-t;
  4876.     vertex[3].m_z=0.0f;
  4877.  
  4878.     vertex[4].m_x=0.0f;
  4879.     vertex[4].m_y=-1.0f;
  4880.     vertex[4].m_z=-t;
  4881.  
  4882.     vertex[5].m_x=0.0f;
  4883.     vertex[5].m_y=-1.0f;
  4884.     vertex[5].m_z=t;
  4885.  
  4886.     vertex[6].m_x=t;
  4887.     vertex[6].m_y=0.0f;
  4888.     vertex[6].m_z=1.0f;
  4889.  
  4890.     vertex[7].m_x=-t;
  4891.     vertex[7].m_y=0.0f;
  4892.     vertex[7].m_z=1.0f;
  4893.  
  4894.     vertex[8].m_x=t;
  4895.     vertex[8].m_y=0.0f;
  4896.     vertex[8].m_z=-1.0f;
  4897.  
  4898.     vertex[9].m_x=-t;
  4899.     vertex[9].m_y=0.0f;
  4900.     vertex[9].m_z=-1.0f;
  4901.  
  4902.     vertex[10].m_x=-1.0f;
  4903.     vertex[10].m_y=t;
  4904.     vertex[10].m_z=0.0f;
  4905.  
  4906.     vertex[11].m_x=-1.0f;
  4907.     vertex[11].m_y=-t;
  4908.     vertex[11].m_z=0.0f;
  4909.  
  4910.     /*Face 0 - 6,2,0*/
  4911.     glBegin(GL_POLYGON);
  4912.         calcNormal2(&vertex[0],&vertex[1],&vertex[2],normal);
  4913.         glNormal3f(normal[0],normal[1],normal[2]);
  4914.         glVertex3f(vertex[6].m_x,vertex[6].m_y,vertex[6].m_z);
  4915.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  4916.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  4917.     glEnd();
  4918.  
  4919.     /*Face 1 - 2,6,3*/
  4920.     glBegin(GL_POLYGON);
  4921.         calcNormal2(&vertex[0],&vertex[3],&vertex[2],normal);
  4922.         glNormal3f(normal[0],normal[1],normal[2]);
  4923.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  4924.         glVertex3f(vertex[6].m_x,vertex[6].m_y,vertex[6].m_z);
  4925.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  4926.     glEnd();
  4927.  
  4928.     /*Face 2 - 5,3,6*/
  4929.     glBegin(GL_POLYGON);
  4930.         calcNormal2(&vertex[0],&vertex[1],&vertex[3],normal);
  4931.         glNormal3f(normal[0],normal[1],normal[2]);
  4932.         glVertex3f(vertex[5].m_x,vertex[5].m_y,vertex[5].m_z);
  4933.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  4934.         glVertex3f(vertex[6].m_x,vertex[6].m_y,vertex[6].m_z);
  4935.     glEnd();
  4936.  
  4937.     /*Face 3 - 5,6,7*/
  4938.     glBegin(GL_POLYGON);
  4939.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  4940.         glNormal3f(normal[0],normal[1],normal[2]);
  4941.         glVertex3f(vertex[5].m_x,vertex[5].m_y,vertex[5].m_z);
  4942.         glVertex3f(vertex[6].m_x,vertex[6].m_y,vertex[6].m_z);
  4943.         glVertex3f(vertex[7].m_x,vertex[7].m_y,vertex[7].m_z);
  4944.     glEnd();
  4945.  
  4946.     /*Face 4 - 0,7,6*/
  4947.     glBegin(GL_POLYGON);
  4948.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  4949.         glNormal3f(normal[0],normal[1],normal[2]);
  4950.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  4951.         glVertex3f(vertex[7].m_x,vertex[7].m_y,vertex[7].m_z);
  4952.         glVertex3f(vertex[6].m_x,vertex[6].m_y,vertex[6].m_z);
  4953.     glEnd();
  4954.  
  4955.  
  4956.     /*Face 5 - 3,8,2*/
  4957.     glBegin(GL_POLYGON);
  4958.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  4959.         glNormal3f(normal[0],normal[1],normal[2]);
  4960.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  4961.         glVertex3f(vertex[8].m_x,vertex[8].m_y,vertex[8].m_z);
  4962.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  4963.     glEnd();
  4964.  
  4965.     /*Face 6 - 2,8,1*/
  4966.     glBegin(GL_POLYGON);
  4967.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  4968.         glNormal3f(normal[0],normal[1],normal[2]);
  4969.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  4970.         glVertex3f(vertex[8].m_x,vertex[8].m_y,vertex[8].m_z);
  4971.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  4972.     glEnd();
  4973.  
  4974.  
  4975.     /*Face 7 - 1,0,2*/
  4976.     glBegin(GL_POLYGON);
  4977.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  4978.         glNormal3f(normal[0],normal[1],normal[2]);
  4979.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  4980.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  4981.         glVertex3f(vertex[2].m_x,vertex[2].m_y,vertex[2].m_z);
  4982.     glEnd();
  4983.  
  4984.     /*Face 8 - 0,1,10*/
  4985.     glBegin(GL_POLYGON);
  4986.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  4987.         glNormal3f(normal[0],normal[1],normal[2]);
  4988.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  4989.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  4990.         glVertex3f(vertex[10].m_x,vertex[10].m_y,vertex[10].m_z);
  4991.     glEnd();
  4992.  
  4993.         /*Face 9 - 9,10,1*/
  4994.     glBegin(GL_POLYGON);
  4995.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  4996.         glNormal3f(normal[0],normal[1],normal[2]);
  4997.         glVertex3f(vertex[9].m_x,vertex[9].m_y,vertex[9].m_z);
  4998.         glVertex3f(vertex[10].m_x,vertex[10].m_y,vertex[10].m_z);
  4999.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  5000.     glEnd();
  5001.  
  5002.         /*Face 10 - 9,1,8*/
  5003.     glBegin(GL_POLYGON);
  5004.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5005.         glNormal3f(normal[0],normal[1],normal[2]);
  5006.         glVertex3f(vertex[9].m_x,vertex[9].m_y,vertex[9].m_z);
  5007.         glVertex3f(vertex[1].m_x,vertex[1].m_y,vertex[1].m_z);
  5008.         glVertex3f(vertex[8].m_x,vertex[8].m_y,vertex[8].m_z);
  5009.     glEnd();
  5010.  
  5011.         /*Face 11 - 8,3,4*/
  5012.     glBegin(GL_POLYGON);
  5013.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5014.         glNormal3f(normal[0],normal[1],normal[2]);
  5015.         glVertex3f(vertex[8].m_x,vertex[8].m_y,vertex[8].m_z);
  5016.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  5017.         glVertex3f(vertex[4].m_x,vertex[4].m_y,vertex[4].m_z);
  5018.     glEnd();
  5019.  
  5020.         /*Face 12 - 3,5,4*/
  5021.     glBegin(GL_POLYGON);
  5022.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5023.         glNormal3f(normal[0],normal[1],normal[2]);
  5024.         glVertex3f(vertex[3].m_x,vertex[3].m_y,vertex[3].m_z);
  5025.         glVertex3f(vertex[5].m_x,vertex[5].m_y,vertex[5].m_z);
  5026.         glVertex3f(vertex[4].m_x,vertex[4].m_y,vertex[4].m_z);
  5027.     glEnd();
  5028.  
  5029.             /*Face 13 - 4,5,11*/
  5030.     glBegin(GL_POLYGON);
  5031.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5032.         glNormal3f(normal[0],normal[1],normal[2]);
  5033.         glVertex3f(vertex[4].m_x,vertex[4].m_y,vertex[4].m_z);
  5034.         glVertex3f(vertex[5].m_x,vertex[5].m_y,vertex[5].m_z);
  5035.         glVertex3f(vertex[11].m_x,vertex[11].m_y,vertex[11].m_z);
  5036.     glEnd();
  5037.  
  5038.             /*Face 14 - 7,10,11*/
  5039.     glBegin(GL_POLYGON);
  5040.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5041.         glNormal3f(normal[0],normal[1],normal[2]);
  5042.         glVertex3f(vertex[7].m_x,vertex[7].m_y,vertex[7].m_z);
  5043.         glVertex3f(vertex[10].m_x,vertex[10].m_y,vertex[10].m_z);
  5044.         glVertex3f(vertex[11].m_x,vertex[11].m_y,vertex[11].m_z);
  5045.     glEnd();
  5046.  
  5047.     /*Face 15 - 10,7,0*/
  5048.     glBegin(GL_POLYGON);
  5049.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5050.         glNormal3f(normal[0],normal[1],normal[2]);
  5051.         glVertex3f(vertex[10].m_x,vertex[10].m_y,vertex[10].m_z);
  5052.         glVertex3f(vertex[7].m_x,vertex[7].m_y,vertex[7].m_z);
  5053.         glVertex3f(vertex[0].m_x,vertex[0].m_y,vertex[0].m_z);
  5054.     glEnd();
  5055.  
  5056.     /*Face 16 - 11,9,4*/
  5057.     glBegin(GL_POLYGON);
  5058.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5059.         glNormal3f(normal[0],normal[1],normal[2]);
  5060.         glVertex3f(vertex[11].m_x,vertex[11].m_y,vertex[11].m_z);
  5061.         glVertex3f(vertex[9].m_x,vertex[9].m_y,vertex[9].m_z);
  5062.         glVertex3f(vertex[4].m_x,vertex[4].m_y,vertex[4].m_z);
  5063.     glEnd();
  5064.  
  5065.     /*Face 17 - 8,4,9*/
  5066.     glBegin(GL_POLYGON);
  5067.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5068.         glNormal3f(normal[0],normal[1],normal[2]);
  5069.         glVertex3f(vertex[8].m_x,vertex[8].m_y,vertex[8].m_z);
  5070.         glVertex3f(vertex[4].m_x,vertex[4].m_y,vertex[4].m_z);
  5071.         glVertex3f(vertex[9].m_x,vertex[9].m_y,vertex[9].m_z);
  5072.     glEnd();
  5073.  
  5074.     /*Face 18 - 7,11,5*/
  5075.     glBegin(GL_POLYGON);
  5076.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5077.         glNormal3f(normal[0],normal[1],normal[2]);
  5078.         glVertex3f(vertex[7].m_x,vertex[7].m_y,vertex[7].m_z);
  5079.         glVertex3f(vertex[11].m_x,vertex[11].m_y,vertex[11].m_z);
  5080.         glVertex3f(vertex[5].m_x,vertex[5].m_y,vertex[5].m_z);
  5081.     glEnd();
  5082.     
  5083.     /*Face 19 - 10,9,11*/
  5084.     glBegin(GL_POLYGON);
  5085.         calcNormal2(&vertex[0],&vertex[2],&vertex[1],normal);
  5086.         glNormal3f(normal[0],normal[1],normal[2]);
  5087.         glVertex3f(vertex[10].m_x,vertex[10].m_y,vertex[10].m_z);
  5088.         glVertex3f(vertex[9].m_x,vertex[9].m_y,vertex[9].m_z);
  5089.         glVertex3f(vertex[11].m_x,vertex[11].m_y,vertex[11].m_z);
  5090.     glEnd();
  5091.  
  5092. }
  5093. int checkAsteroidCollision(int exclude_index, GLfloat asteroid1_x,GLfloat asteroid1_y,GLfloat asteroid1_z,GLfloat asteroid1_radius)
  5094. {
  5095. GLfloat asteroid2_x,asteroid2_y,asteroid2_z;
  5096. GLfloat x,y,z;
  5097. GLfloat distance;
  5098. GLfloat radius_threshold;
  5099. int i;
  5100.  
  5101.     for(i=0; i<ASTEROID_COUNT; i++)
  5102.     {
  5103.         if( 
  5104.             (objAsteroid[i].m_availableFlag==FALSE) &&
  5105.             (i != exclude_index)
  5106.         )
  5107.         {
  5108.             asteroid2_x=objAsteroid[i].m_x;
  5109.             asteroid2_y=objAsteroid[i].m_y;
  5110.             asteroid2_z=objAsteroid[i].m_z;
  5111.  
  5112.             x=asteroid2_x-asteroid1_x;
  5113.             y=asteroid2_y-asteroid1_y;
  5114.             z=asteroid2_z-asteroid1_z;
  5115.  
  5116.             radius_threshold=objAsteroid[i].m_radius+asteroid1_radius;
  5117.  
  5118.             distance=(GLfloat) sqrt(x*x+y*y+z*z);
  5119.  
  5120.             if(distance<radius_threshold)
  5121.             {
  5122.                 //reduce the velocity after collision
  5123.                 objAsteroid[i].m_velocity*=0.5f;
  5124.                 return(i);
  5125.             }
  5126.         }
  5127.     }
  5128.     return(-1);
  5129.  
  5130. }
  5131.  
  5132. int checkAsteroidHit(GLfloat x,GLfloat y,GLfloat z,BOOLEAN m_score_flag)
  5133. {
  5134. int i;
  5135. int retval;
  5136. GLfloat asteroid_x,asteroid_y,asteroid_z;
  5137. GLfloat vector_x,vector_y,vector_z;
  5138. GLfloat distance;
  5139. int size;
  5140. int index;
  5141.  
  5142.     retval=0;
  5143.  
  5144.     for(i=0; i<ASTEROID_COUNT; i++)
  5145.     {
  5146.         if (objAsteroid[i].m_availableFlag==FALSE)
  5147.         {
  5148.  
  5149.             asteroid_x=objAsteroid[i].m_x;
  5150.             asteroid_y=objAsteroid[i].m_y;
  5151.             asteroid_z=objAsteroid[i].m_z;
  5152.         
  5153.             vector_x=asteroid_x-x;
  5154.             vector_y=asteroid_y-y;
  5155.             vector_z=asteroid_z-z;
  5156.  
  5157.             distance=(GLfloat) sqrt(vector_x*vector_x+vector_y*vector_y+vector_z*vector_z);
  5158.  
  5159.             if(distance<=10)
  5160.             {
  5161.                 size=(int)objAsteroid[i].m_size;
  5162.  
  5163.                 if (m_score_flag==TRUE)
  5164.                 {
  5165.                     if(size>1 && size<5)
  5166.                     {
  5167.                         objBreakOut.m_score+=10;
  5168.                     }
  5169.                     else if(size>5 && size<20)
  5170.                     {
  5171.                         objBreakOut.m_score+=5;
  5172.                           generateMultipleAsteroids(i);
  5173.                     }
  5174.                     else
  5175.                     {
  5176.                         objBreakOut.m_score+=1;
  5177.                     }
  5178.                 }
  5179.  
  5180.                 index=getAvailableExplosion();
  5181.                 if(index>-1)
  5182.                 {
  5183.                     objExplosion[index].x=asteroid_x;
  5184.                     objExplosion[index].y=asteroid_y;
  5185.                     objExplosion[index].z=asteroid_z;
  5186.                     objExplosion[index].m_cpu_seconds=clock();
  5187.                     objExplosion[index].type=SPHERE_TYPE;
  5188.                 }
  5189.  
  5190.                 //sound("hit.wav");
  5191.                 objAsteroid[i].m_availableFlag=TRUE;
  5192.                  retval=1;
  5193.                 return(retval);
  5194.             }
  5195.         }
  5196.     }
  5197.     return(retval);
  5198. }
  5199. void generateMultipleAsteroids(int index)
  5200. {
  5201.     GLint color_index;
  5202.     GLfloat new_size;
  5203.     GLfloat angle;
  5204.     GLfloat velocity;
  5205.     int asteroid1_index;
  5206.     int asteroid2_index;
  5207.     GLfloat x,z;
  5208.     GLfloat parent_asteroid_x,parent_asteroid_z;
  5209.  
  5210.     color_index=objAsteroid[index].m_colorIndex;
  5211.     new_size=objAsteroid[index].m_size/3.0f;
  5212.  
  5213.  
  5214.     parent_asteroid_x=objAsteroid[index].m_x;
  5215.     parent_asteroid_z=objAsteroid[index].m_z;
  5216.  
  5217.     if(parent_asteroid_x > GRID_SIZE)
  5218.         parent_asteroid_x-=20.0f;
  5219.  
  5220.     if(parent_asteroid_x < GRID_SIZE)
  5221.         parent_asteroid_x+=20.0f;
  5222.  
  5223.     if(parent_asteroid_z > GRID_SIZE)
  5224.         parent_asteroid_z-=20.0f;
  5225.  
  5226.     if(parent_asteroid_z < GRID_SIZE)
  5227.         parent_asteroid_z+=20.0f;
  5228.  
  5229.     angle= (GLfloat) ((rand()%360)/180.0f*3.142f);
  5230.  
  5231.     velocity=10.0f;
  5232.  
  5233.     asteroid1_index=getAvailableAsteroid();
  5234.     asteroid2_index=getAvailableAsteroid();
  5235.  
  5236.     if (asteroid1_index!=0)
  5237.     {
  5238.         x= (GLfloat) (velocity*cos(angle));
  5239.         z= (GLfloat) (-velocity*sin(angle));
  5240.  
  5241.         objAsteroid[asteroid1_index].m_angle_radians=angle;
  5242.         objAsteroid[asteroid1_index].m_velocity=velocity;
  5243.         objAsteroid[asteroid1_index].m_radius=new_size/2.0f;
  5244.         objAsteroid[asteroid1_index].m_size=new_size;
  5245.         objAsteroid[asteroid1_index].m_mass=new_size;
  5246.         objAsteroid[asteroid1_index].dir_x=x;
  5247.         objAsteroid[asteroid1_index].dir_y=0.0f;
  5248.         objAsteroid[asteroid1_index].dir_z=z;
  5249.         objAsteroid[asteroid1_index].m_movement_interval=clock();
  5250.         objAsteroid[asteroid1_index].m_colorIndex=color_index;
  5251.     }
  5252.     if (asteroid2_index!=0)
  5253.     {
  5254.         x= (GLfloat) (velocity*cos(-angle));
  5255.         z= (GLfloat) (-velocity*sin(-angle));
  5256.  
  5257.         objAsteroid[asteroid2_index].m_angle_radians=-angle;
  5258.         objAsteroid[asteroid2_index].m_velocity=velocity;
  5259.         objAsteroid[asteroid2_index].m_radius=new_size/2.0f;
  5260.         objAsteroid[asteroid2_index].m_size=new_size;
  5261.         objAsteroid[asteroid2_index].m_mass=new_size;
  5262.         objAsteroid[asteroid2_index].m_x=parent_asteroid_x;
  5263.         objAsteroid[asteroid2_index].m_y=0.0f;
  5264.         objAsteroid[asteroid2_index].m_z=parent_asteroid_z;
  5265.         objAsteroid[asteroid2_index].dir_x=x;
  5266.         objAsteroid[asteroid2_index].dir_y=0.0f;
  5267.         objAsteroid[asteroid2_index].dir_z=z;
  5268.         objAsteroid[asteroid2_index].m_movement_interval=clock();
  5269.         objAsteroid[asteroid2_index].m_colorIndex=color_index;
  5270.     }
  5271.  
  5272. }
  5273. int getAvailableAsteroid()
  5274. {
  5275.     int i;
  5276.     int retval;
  5277.  
  5278.     retval=0;
  5279.     for (i=0; i<ASTEROID_COUNT; i++)
  5280.     {
  5281.         if(objAsteroid[i].m_availableFlag==TRUE)
  5282.         {
  5283.             objAsteroid[i].m_availableFlag=FALSE;
  5284.             retval=i;
  5285.             break;
  5286.         }
  5287.     }
  5288.     return(retval);
  5289. }
  5290. int getAsteroidCount()
  5291. {
  5292.     int count;
  5293.     int i;
  5294.  
  5295.     count=0;
  5296.     for (i=0; i<ASTEROID_COUNT; i++)
  5297.     {
  5298.         if(objAsteroid[i].m_availableFlag==FALSE)
  5299.         {
  5300.             count++;
  5301.         }
  5302.     }
  5303.     return (count);
  5304.  
  5305. }
  5306. void generateAsteroid()
  5307. {
  5308.     int i;
  5309.     GLfloat angle;
  5310.     GLfloat x,z;
  5311.     GLfloat velocity;
  5312.     
  5313.     //Keep 10 reserved for multiple asteroid generation
  5314.     for (i=0; i<ASTEROID_COUNT-10; i++)
  5315.     {
  5316.         if(objAsteroid[i].m_availableFlag==TRUE)
  5317.         {
  5318.             objAsteroid[i].m_availableFlag=FALSE;
  5319.  
  5320.             if((rand()%2)==0)
  5321.             {
  5322.                 objAsteroid[i].m_x=(GLfloat) (rand()%(GRID_SIZE-30));
  5323.             }
  5324.             else if ((rand()%2)==1)
  5325.             {
  5326.                 objAsteroid[i].m_x=(GLfloat) -(rand()%(GRID_SIZE-30));
  5327.             }
  5328.             else
  5329.             {
  5330.                 objAsteroid[i].m_x=(GLfloat) (GRID_SIZE-30);
  5331.             }
  5332.             objAsteroid[i].m_y=0.0f;
  5333.  
  5334.             if((rand()%2)==0)
  5335.             {
  5336.                 objAsteroid[i].m_z=(GLfloat) GRID_SIZE-30.0f;
  5337.             }
  5338.  
  5339.             else if((rand()%2)==1)
  5340.             {
  5341.                 objAsteroid[i].m_z=(GLfloat) -(GRID_SIZE-30.0f);
  5342.             }
  5343.             else
  5344.             {
  5345.                 objAsteroid[i].m_z=(GLfloat) (GRID_SIZE-30.0f);
  5346.             }
  5347.  
  5348.             objAsteroid[i].m_colorIndex=rand()%7;
  5349.             objAsteroid[i].m_size=(GLfloat) (rand()%10);
  5350.  
  5351.             angle= (GLfloat) ((rand()%360)/180.0f*3.142f);
  5352.             velocity=(GLfloat) (rand()%20);
  5353.  
  5354.             x= (GLfloat) (velocity*cos(angle));
  5355.             z= (GLfloat) (-velocity*sin(angle));
  5356.  
  5357.             objAsteroid[i].m_angle_radians=angle;
  5358.             objAsteroid[i].m_velocity=velocity;
  5359.             objAsteroid[i].m_radius=objAsteroid[i].m_size/2.0f;
  5360.             objAsteroid[i].m_mass=objAsteroid[i].m_size;
  5361.  
  5362.             objAsteroid[i].dir_x=x;
  5363.             objAsteroid[i].dir_y=0.0f;
  5364.             objAsteroid[i].dir_z=z;
  5365.  
  5366.             objAsteroid[i].m_movement_interval=clock();
  5367.         }//if
  5368.     }//for
  5369. }
  5370. void drawAsteroids()
  5371. {
  5372.     GLint i;
  5373.     GLfloat distance;
  5374.     GLfloat x,y,z;
  5375.     GLfloat asteroid1_x,asteroid1_y,asteroid1_z;
  5376.     GLfloat asteroid1_radius;
  5377.     int other_index;
  5378.  
  5379.     for(i=0; i<ASTEROID_COUNT; i++)
  5380.     {
  5381.         if(objAsteroid[i].m_availableFlag==FALSE)
  5382.         {
  5383.             if ((clock()-objAsteroid[i].m_movement_interval)>2*CLOCKS_PER_SEC)
  5384.             {
  5385.                 asteroid1_x=objAsteroid[i].m_x;
  5386.                 asteroid1_y=objAsteroid[i].m_y;
  5387.                 asteroid1_z=objAsteroid[i].m_z;
  5388.                 asteroid1_radius=objAsteroid[i].m_radius;
  5389.  
  5390.                 if ((asteroid1_x+asteroid1_radius)>GRID_SIZE)
  5391.                 {
  5392.                     objAsteroid[i].dir_x*=-1.0f;
  5393.                     objAsteroid[i].m_velocity*=1.10f;
  5394.                 }
  5395.                 else if ((asteroid1_x-asteroid1_radius)<-GRID_SIZE)
  5396.                 {
  5397.                     objAsteroid[i].dir_x*=-1.0f;
  5398.                     objAsteroid[i].m_velocity*=1.10f;
  5399.                 }
  5400.  
  5401.                 if ((asteroid1_z+asteroid1_radius)>GRID_SIZE)
  5402.                 {
  5403.                     objAsteroid[i].dir_z*=-1.0f;
  5404.                     objAsteroid[i].m_velocity*=1.10f;
  5405.                 }
  5406.                 else if ((asteroid1_z-asteroid1_radius)<-GRID_SIZE)
  5407.                 {
  5408.                     objAsteroid[i].dir_z*=-1.0f;
  5409.                     objAsteroid[i].m_velocity*=1.10f;
  5410.                 }
  5411.  
  5412.                 //asteroid hit the ship
  5413.                 if(distanceToBreakOut(asteroid1_x,asteroid1_y,asteroid1_z)<asteroid1_radius+10)
  5414.                 {
  5415.                     objBreakOut.m_shield--;
  5416.                     changeAsteroidDirection(i,objBreakOut.m_velocity);
  5417.                 }
  5418.  
  5419.                 //asteroid hit the enemy
  5420.                 x=asteroid1_x-EnemyEngine[0].x;
  5421.                 y=asteroid1_y-EnemyEngine[0].y;
  5422.                 z=asteroid1_z-EnemyEngine[0].z;
  5423.                 
  5424.                 distance=(GLfloat) sqrt(x*x+y*y+z*z);
  5425.  
  5426.                 if(distance<30)
  5427.                 {
  5428.                     EnemyEngine[0].m_shield--;
  5429.  
  5430.                     changeAsteroidDirection(i,EnemyEngine[0].m_velocity);
  5431.                 }
  5432.                 //asteroid hit a mushroom
  5433.                 if(checkMushRoomCollision(asteroid1_x,asteroid1_y,asteroid1_z)==1)
  5434.                 {
  5435.                     changeAsteroidDirection(i,0.0f);
  5436.                 }
  5437.  
  5438.                 //asteroid collision with another asteroid
  5439.  
  5440.                 other_index=checkAsteroidCollision(i,asteroid1_x,asteroid1_y,asteroid1_z,asteroid1_radius);
  5441.  
  5442.                 if (other_index!=-1)
  5443.                 {
  5444.                     collision(i,other_index);
  5445.                     //displace beyond the radius
  5446.                 
  5447.                     //Asteroid 1
  5448.                     x= (GLfloat) (objAsteroid[i].m_radius*cos(objAsteroid[i].m_radius));
  5449.                     z= (GLfloat) (-objAsteroid[i].m_radius*sin(objAsteroid[i].m_radius));
  5450.                     
  5451.                     objAsteroid[i].m_x+=x;
  5452.                     objAsteroid[i].m_z+=z;
  5453.                     //Asteroid 2
  5454.                     x= (GLfloat) (objAsteroid[other_index].m_radius*cos(objAsteroid[other_index].m_radius));
  5455.                     z= (GLfloat) (-objAsteroid[other_index].m_radius*sin(objAsteroid[other_index].m_radius));
  5456.                     
  5457.                     objAsteroid[other_index].m_x+=x;
  5458.                     objAsteroid[other_index].m_z+=z;
  5459.                 }
  5460.                 objAsteroid[i].m_x+=objAsteroid[i].dir_x;
  5461.                 objAsteroid[i].m_y=0.0f;
  5462.                 objAsteroid[i].m_z+=objAsteroid[i].dir_z;
  5463.             }
  5464.             setSpecularMaterialColor(1.0f,1.0f,1.0f,0.6f);
  5465.             setMaterialShininess(128.0f);
  5466.             setAmbientMaterialColor(0.2f,0.0f,0.0f,0.6f);
  5467.  
  5468.             switch(objAsteroid[i].m_colorIndex)
  5469.             {
  5470.             case 7:
  5471.                 copperMaterial();
  5472.                 break;
  5473.             case 6:
  5474.                 brassMaterial();
  5475.                 break;
  5476.             case 5:
  5477.                 goldMaterial();
  5478.                 break;
  5479.             case 4:  //blue
  5480.                 setDiffuseMaterialColor(0.0f,0.0f,0.78f,1.0f);
  5481.                 break;
  5482.             case 3:  //green
  5483.                 setDiffuseMaterialColor(0.0f,0.78f,0.0f,1.0f);
  5484.                 break;            
  5485.             case 2:  //red
  5486.                 setDiffuseMaterialColor(0.78f,0.0f,0.0f,1.0f);
  5487.                 break;            
  5488.             case 1:  //yellow
  5489.                 setDiffuseMaterialColor(0.78f,0.78f,0.0f,1.0f);
  5490.                 break;            
  5491.             }
  5492.             glPushMatrix();
  5493.                 glTranslatef(objAsteroid[i].m_x,objAsteroid[i].m_y,objAsteroid[i].m_z);
  5494.                 glScalef(objAsteroid[i].m_size,objAsteroid[i].m_size,objAsteroid[i].m_size);
  5495.                 sphere(1.0f);
  5496.             glPopMatrix();
  5497.         }
  5498.     }
  5499.  
  5500. }
  5501. void changeAsteroidDirection(int index,GLfloat increaseVelocity)
  5502. {
  5503.     GLfloat angle,velocity;
  5504.  
  5505.     angle=objAsteroid[index].m_angle_radians+3.142f;
  5506.     velocity=objAsteroid[index].m_velocity+increaseVelocity;
  5507.  
  5508.     objAsteroid[index].dir_x= (GLfloat) (velocity*cos(angle));
  5509.     objAsteroid[index].dir_z= (GLfloat) (-velocity*sin(angle));
  5510.  
  5511. }
  5512. float distanceToBreakOut(float asteroid_x, float asteroid_y, float asteroid_z)
  5513. {
  5514.     float x,y,z;
  5515.     GLfloat distance;
  5516.  
  5517.     x=asteroid_x-objBreakOut.m_xPos;
  5518.     y=asteroid_y-objBreakOut.m_yPos;
  5519.     z=asteroid_z-objBreakOut.m_zPos;
  5520.     
  5521.     distance=(GLfloat) sqrt(x*x+y*y+z*z);
  5522.  
  5523.     return(distance);
  5524. }
  5525. void collision(int index1, int index2)
  5526. {
  5527. GLfloat angle, velocity;
  5528. //1/2 m1*pow(v1,2)=1/2*m1*pow(v1prim,2)+1/2*m2*pow(v2prim,2)
  5529.  
  5530.     /*The momentum type is oblique collision.  However, I use a headon elastic equation.*/
  5531.     objAsteroid[index1].m_angle_radians+=3.142f;
  5532.     objAsteroid[index2].m_angle_radians+=3.142f;
  5533.  
  5534.     //Asteroid 1
  5535.     angle=objAsteroid[index1].m_angle_radians;
  5536.     velocity=objAsteroid[index1].m_velocity;
  5537.  
  5538.     objAsteroid[index1].dir_x= (GLfloat) (velocity*cos(angle));
  5539.     objAsteroid[index1].dir_z= (GLfloat) (-velocity*sin(angle));
  5540.  
  5541.     //Asteroid 2
  5542.     angle=objAsteroid[index2].m_angle_radians;
  5543.     velocity=objAsteroid[index2].m_velocity;
  5544.  
  5545.     objAsteroid[index2].dir_x= (GLfloat) (velocity*cos(angle));
  5546.     objAsteroid[index2].dir_z= (GLfloat) (-velocity*sin(angle));
  5547. }
  5548. void checkBonusCollision()
  5549. {
  5550.     GLfloat distance;
  5551.     GLfloat x,y,z;
  5552.     int i;
  5553.  
  5554.         for(i=0; i<BONUS_LIST_SIZE; i++)
  5555.         {
  5556.             if(objBonusList[i].m_available_flag==TRUE)
  5557.             {
  5558.  
  5559.                 x=objBreakOut.m_xPos-objBonusList[i].m_x;
  5560.                 y=objBreakOut.m_yPos-objBonusList[i].m_y;
  5561.                 z=objBreakOut.m_zPos-objBonusList[i].m_z;
  5562.  
  5563.                 distance=(GLfloat)sqrt(x*x+y*y+z*z);
  5564.  
  5565.                 if (distance<20)
  5566.                 {
  5567.                     objBonusList[i].m_available_flag=TRUE;
  5568.                     //objBonusList[i].m_active_flag=FALSE;
  5569.                     objBreakOut.m_shield+=10;
  5570.                     break;
  5571.                 }
  5572.  
  5573.             }
  5574.         }
  5575.  
  5576. }
  5577. void drawEnemyShipBody()
  5578. {
  5579.     glPushMatrix();
  5580.  
  5581.         glTranslatef(50.0f,48.0f,0.0f);
  5582.         
  5583.         setAmbientMaterialColor(0.5f,0.5f,0.5f,1.0f);
  5584.         setDiffuseMaterialColor(1.0f,1.0f,1.0f,1.0f);
  5585.         setSpecularMaterialColor(1.0f,1.0f,1.0f,1.0f);
  5586.         setMaterialShininess(100.0f);
  5587.  
  5588.         glNormal3f(0.0f,0.0f,1.0f);
  5589.  
  5590.         glRotatef(90.0f,0.0f,0.0f,1.0f);
  5591.  
  5592.         cylinder(10.0f,150.0f);
  5593.  
  5594.  
  5595.     glPopMatrix();
  5596.  
  5597.     // Left Cyl
  5598.     glPushMatrix();
  5599.         
  5600.         glTranslatef(140.0f,48.0f,-10.0f);
  5601.         glNormal3f(0.0f,0.0f,1.0f);
  5602.         glRotatef(90.0f,0.0f,0.0f,1.0f);
  5603.         
  5604.         cylinder(11.0f,60.0f);
  5605.  
  5606.     glPopMatrix();
  5607.  
  5608.     // Right Cyl
  5609.     glPushMatrix();
  5610.         
  5611.         glTranslatef(140.0f,48.0f,10.0f);
  5612.         glNormal3f(0.0f,0.0f,1.0f);
  5613.         glRotatef(90.0f,0.0f,0.0f,1.0f);
  5614.         
  5615.         cylinder(11.0f,60.0f);
  5616.         glTranslatef(-140.0f,-48.0f,-10.0f);
  5617.  
  5618.     glPopMatrix();
  5619.  
  5620.     // Top Cyl
  5621.     glPushMatrix();
  5622.         
  5623.         glTranslatef(140.0f,58.0f,0.0f);
  5624.         glNormal3f(0.0f,0.0f,1.0f);
  5625.         glRotatef(90.0f,0.0f,0.0f,1.0f);
  5626.         cylinder(11.0f,60.0f);
  5627.     glPopMatrix();
  5628.  
  5629.     // Bottom Cyl
  5630.     glPushMatrix();
  5631.         
  5632.         glTranslatef(140.0f,38.0f,0.0f);
  5633.         glNormal3f(0.0f,0.0f,1.0f);
  5634.         glRotatef(90.0f,0.0f,0.0f,1.0f);
  5635.         cylinder(11.0f,60.0f);
  5636.  
  5637.     glPopMatrix();
  5638.  
  5639.     // Sphere
  5640.     glPushMatrix();
  5641.         
  5642.         glTranslatef(200.0f,48.0f,0.0f);
  5643.         glNormal3f(0.0f,0.0f,1.0f);
  5644.         glRotatef(90.0f,0.0f,0.0f,1.0f);
  5645.         
  5646.         sphere(20.0f);
  5647.  
  5648.     glPopMatrix();
  5649.  
  5650.     glPushMatrix();
  5651.         glTranslatef(200.0f,48.0f,0.0f);
  5652.         
  5653.         // Bottom
  5654.         glPushMatrix();
  5655.         
  5656.             //glRotatef(engRot,0.0,0.0,1.0);
  5657.             cylinder(8.0f,70.0f);
  5658.             glTranslatef(0.0f,-75.0f,0.0f);
  5659.             sphere(10.0f);
  5660.             glRotatef(60.0f,0.0f,0.0f,1.0f);
  5661.             cylinder(8.0f,50.0f);
  5662.         
  5663.         glPopMatrix();            
  5664.  
  5665.         glRotatef(90.0f,1.0f,0.0f,0.0f);
  5666.  
  5667.         // Right
  5668.         glPushMatrix();
  5669.         
  5670.             //glRotatef(engRot,0.0,0.0,1.0);
  5671.             cylinder(8.0f,70.0f);
  5672.             glTranslatef(0.0f,-75.0f,0.0f);
  5673.             sphere(10.0f);
  5674.             glRotatef(60.0f,0.0f,0.0f,1.0f);
  5675.             cylinder(8.0f,50.0f);
  5676.         
  5677.         glPopMatrix();
  5678.  
  5679.         glRotatef(90.0f,1.0f,0.0f,0.0f);
  5680.  
  5681.         // Top
  5682.         glPushMatrix();
  5683.         
  5684.             //glRotatef(engRot,0.0,0.0,1.0);
  5685.             cylinder(8.0f,70.0f);
  5686.             glTranslatef(0.0f,-75.0f,0.0f);
  5687.             sphere(10.0f);
  5688.             glRotatef(60.0f,0.0f,0.0f,1.0f);
  5689.             cylinder(8.0f,50.0f);
  5690.         
  5691.         glPopMatrix();
  5692.         
  5693.                     
  5694.         glRotatef(90.0f,1.0f,0.0f,0.0f);
  5695.  
  5696.         // Left
  5697.         glPushMatrix();
  5698.         
  5699.             //glRotatef(engRot,0.0,0.0,1.0);
  5700.             cylinder(8.0f,70.0f);
  5701.             glTranslatef(0.0f,-75.0f,0.0f);
  5702.             sphere(10.0f);
  5703.             glRotatef(60.0f,0.0f,0.0f,1.0f);
  5704.             cylinder(8.0f,50.0f);
  5705.         
  5706.         glPopMatrix();
  5707.  
  5708.     glPopMatrix();
  5709.  
  5710.     glTranslatef(-80.0f,-50.0f,0.0f);
  5711.  
  5712.     // Back - Connect
  5713.     
  5714.     setAmbientMaterialColor(0.5f,0.5f,0.5f,1.0f);
  5715.     setDiffuseMaterialColor(1.0f,1.0f,1.0f,1.0f);
  5716.     setSpecularMaterialColor(1.0f,1.0f,1.0f,1.0f);
  5717.     setMaterialShininess(100.0f);
  5718.     
  5719.     glBegin(GL_POLYGON);
  5720.         //glNormal3f(0.0f,0.0f,1.0f);
  5721.         glNormal3f(1.0f,0.0f,0.0f);
  5722.         glVertex3f(200.0f,112.0f,20.0f);
  5723.         glVertex3f(200.0f,80.0f,20.0f);
  5724.         glVertex3f(200.0f,80.0f,-20.0f);
  5725.         glVertex3f(200.0f,112.0f,-20.0f);
  5726.         glVertex3f(200.0f,112.0f,20.0f);
  5727.     glEnd();
  5728.  
  5729.     // Top
  5730.     
  5731.     glBegin(GL_POLYGON);
  5732.         //glNormal3f(0.0f,0.0f,1.0f);
  5733.         glNormal3f(-0.06651901052377393f,-0.997785157856609f,0.0f);
  5734.  
  5735.         glVertex3f(200.0f,112.0f,20.0f);
  5736.         glVertex3f(80.0f,120.0f,20.0f);
  5737.         glVertex3f(80.0f,120.0f,-20.0f);
  5738.         glVertex3f(200.0f,112.0f,-20.0f);
  5739.         glVertex3f(200.0f,112.0f,20.0f);
  5740.     glEnd();
  5741.  
  5742.  
  5743.     // Front
  5744.     
  5745.     glBegin(GL_POLYGON);
  5746.         //glNormal3f(0.0f,0.0f,1.0f);
  5747.         glNormal3f(0.7071067811865475f,-0.7071067811865475f,0.0f);
  5748.         glVertex3f(80.0f,120.0f,20.0f);
  5749.         glVertex3f(0.0f,40.0f,60.0f);
  5750.         glVertex3f(0.0f,40.0f,-60.0f);
  5751.         glVertex3f(80.0f,120.0f,-20.0f);
  5752.         glVertex3f(80.0f,120.0f,20.0f);
  5753.     glEnd();
  5754.     
  5755.     // Bottom Front
  5756.     
  5757.     glBegin(GL_POLYGON);
  5758.         //glNormal3f(0.0f,0.0f,1.0f);
  5759.         glNormal3f(0.3713906763541037f,0.9284766908852593f,0.0f);
  5760.  
  5761.         glVertex3f(0.0f,40.0f,60.0f);
  5762.         glVertex3f(100.0f,0.0f,0.0f);
  5763.         glVertex3f(0.0f,40.0f,-60.0f);
  5764.         glVertex3f(0.0f,40.0f,60.0f);
  5765.     glEnd();
  5766.  
  5767.  
  5768.     // Bottom Back
  5769.     
  5770.     glBegin(GL_POLYGON);
  5771.         //glNormal3f(0.0f,0.0f,1.0f);
  5772.         glNormal3f(0.6246950475544243f,-0.7808688094430304f,0.0f);
  5773.         glVertex3f(200.0f,80.0f,-20.0f);
  5774.         glVertex3f(200.0f,80.0f,20.0f);
  5775.         glVertex3f(100.0f,0.0f,0.0f);
  5776.         glVertex3f(200.0f,80.0f,-20.0f);
  5777.     glEnd();
  5778.  
  5779.     // Left Side Bottom
  5780.     
  5781.     glBegin(GL_POLYGON);
  5782.         //glNormal3f(0.0f,0.0f,1.0f);
  5783.         //glNormal3f(0.48507125007266594f,-0.7276068751089989f,0.48507125007266594f);
  5784.         glNormal3f(-0.48507125007266594f,0.7276068751089989f,-0.48507125007266594f);
  5785.  
  5786.         glVertex3f(100.0f,0.0f,0.0f);
  5787.         glVertex3f(200.0f,80.0f,20.0f);
  5788.         glVertex3f(100.0f,40.0f,60.0f);
  5789.         glVertex3f(0.0f,40.0f,60.0f);
  5790.         glVertex3f(100.0f,0.0f,0.0f);
  5791.     glEnd();
  5792.  
  5793.     
  5794.     // Left Side Top
  5795.  
  5796.     glBegin(GL_POLYGON);
  5797.         //glNormal3f(0.0f,0.0f,1.0f);
  5798.         glNormal3f(-0.3713906763541037f,0.0f,-0.9284766908852593f);
  5799.  
  5800.         glVertex3f(200.0f,80.0f,20.0f);
  5801.         glVertex3f(100.0f,40.0f,60.0f);
  5802.         glVertex3f(200.0f,112.0f,20.0f);
  5803.         glVertex3f(80.0f,120.0f,20.0f);
  5804.         glVertex3f(0.0f,40.0f,60.0f);
  5805.         glVertex3f(100.0f,40.0f,60.0f);
  5806.         glVertex3f(200.0f,80.0f,20.0f);
  5807.     glEnd();
  5808.  
  5809.     // Right Side Bottom
  5810.     
  5811.     glBegin(GL_POLYGON);
  5812.         //glNormal3f(0.0f,0.0f,1.0f);
  5813.         glNormal3f(-0.48507125007266594f,0.7276068751089989f,0.48507125007266594f);
  5814.                 
  5815.         glVertex3f(100.0f,0.0f,0.0f);
  5816.         glVertex3f(200.0f,80.0f,-20.0f);
  5817.         glVertex3f(100.0f,40.0f,-60.0f);
  5818.         glVertex3f(0.0f,40.0f,-60.0f);
  5819.         glVertex3f(100.0f,0.0f,0.0f);
  5820.     glEnd();
  5821.     
  5822.     // Right Side Top
  5823.  
  5824.     glBegin(GL_POLYGON);
  5825.         //glNormal3f(0.0f,0.0f,1.0f);
  5826.         //glNormal3f(-0.062347968638854966f,0.7793496079856871f,-0.6234796863885497f);
  5827.         glNormal3f(0.062347968638854966f,-0.7793496079856871f,0.6234796863885497f);
  5828.         
  5829.         glVertex3f(200.0f,80.0f,-20.0f);
  5830.         glVertex3f(100.0f,40.0f,-60.0f);
  5831.         glVertex3f(200.0f,112.0f,-20.0f);
  5832.         glVertex3f(80.0f,120.0f,-20.0f);
  5833.         glVertex3f(0.0f,40.0f,-60.0f);
  5834.         glVertex3f(100.0f,40.0f,-60.0f);
  5835.         glVertex3f(200.0f,80.0f,-20.0f);
  5836.     glEnd();
  5837.  
  5838. }
  5839.  
  5840. void drawEnemyShipWindshield()
  5841. {
  5842.     // Front Windshield
  5843.     setAmbientMaterialColor(0.3f,0.3f,0.6f,1.0f);
  5844.     setDiffuseMaterialColor(0.3f,0.3f,0.6f,1.0f);
  5845.     setSpecularMaterialColor(0.3f,0.3f,0.6f,1.0f);
  5846.     setMaterialShininess(100.0f);
  5847.     
  5848.     glPushMatrix();
  5849.         glTranslatef(-1.0f,0.0f,0.0f);
  5850.         
  5851.         glBegin(GL_POLYGON);
  5852.             //glNormal3f(0.0f,0.0f,1.0f);
  5853.             glNormal3f(0.7071067811865475f,-0.7071067811865475f,0.0f);
  5854.  
  5855.             glVertex3f(0.0f,40.0f,-40.0f);
  5856.             glVertex3f(80.0f,120.0f,-20.0f);
  5857.             glVertex3f(80.0f,120.0f,20.0f);
  5858.             glVertex3f(0.0f,40.0f,40.0f);
  5859.             glVertex3f(0.0f,40.0f,-40.0f);
  5860.         glEnd();
  5861.  
  5862.     glPopMatrix();
  5863. }
  5864. void drawEnemyShip()
  5865. {
  5866.     if (EnemyEngine[0].m_sleep==FALSE)
  5867.     {
  5868.         glPushMatrix();
  5869.             glScalef(0.1f,0.1f,0.1f);
  5870.             drawEnemyShipBody();
  5871.             drawEnemyShipWindshield();
  5872.         glPopMatrix();
  5873.     }
  5874. }
  5875.  
  5876.