glutmech.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:37k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /**
  2. * program : glutmech V1.1
  3. * author : Simon Parkinson-Bates.
  4. * E-mail : sapb@yallara.cs.rmit.edu.au
  5. * Copyright Simon Parkinson-Bates.
  6. * "source if freely avaliable to anyone to copy as long as they
  7. *  acknowledge me in their work."
  8. *
  9. * Funtional features 
  10. * ------------------
  11. * * online menu system avaliable by pressing left mouse button
  12. * * online cascading help system avaliable, providing information on
  13. * the several  key strokes and what they do.
  14. * * animation sequence coded which makes the mech walk through an
  15. * environment.  Shadows will soon be added to make it look
  16. * more realistic.
  17. * * menu control to view mech in wireframe or sold mode.
  18. * * various key strokes avaliable to control idependently the mechs
  19. * many joints.
  20. * * various key strokes avaliable to view mech and environment from 
  21. * different angles
  22. * * various key strokes avaliable to alter positioning of the single
  23. * light source.
  24. *
  25. *
  26. * Program features
  27. * ----------------
  28. * * uses double buffering
  29. * * uses display lists
  30. * * uses glut to manage windows, callbacks, and online menu.
  31. * * uses glpolygonfill() to maintain colors in wireframe and solid
  32. * mode.
  33. *
  34. **/
  35. /* start of compilation conditions */
  36. #define SPHERE
  37. #define COLOR
  38. #define LIGHT
  39. #define TORSO
  40. #define HIP
  41. #define SHOULDER
  42. #define UPPER_ARM
  43. #define LOWER_ARM
  44. #define ROCKET_POD
  45. #define UPPER_LEG
  46. #define LOWER_LEG
  47. #define NO_NORM
  48. #define ANIMATION
  49. #define DRAW_MECH
  50. #define DRAW_ENVIRO
  51. #define MOVE_LIGHT
  52. /* end of compilation conditions */
  53. /* start various header files needed */
  54. #include <stdlib.h>
  55. #include <math.h>
  56. #define GLUT
  57. #define GLUT_KEY
  58. #define GLUT_SPEC
  59. #include <GL/glut.h>
  60. /* end of header files */
  61. /* start of display list definitions */
  62. #define SOLID_MECH_TORSO        1
  63. #define SOLID_MECH_HIP          2
  64. #define SOLID_MECH_SHOULDER     3
  65. #define SOLID_MECH_UPPER_ARM    4
  66. #define SOLID_MECH_FOREARM 5
  67. #define SOLID_MECH_UPPER_LEG    6
  68. #define SOLID_MECH_FOOT         7
  69. #define SOLID_MECH_ROCKET       8
  70. #define SOLID_MECH_VULCAN 9
  71. #define SOLID_ENVIRO 10
  72. /* end of display list definitions */
  73. /* start of motion rate variables */
  74. #define ANKLE_RATE 3
  75. #define HEEL_RATE 3
  76. #define ROTATE_RATE 10
  77. #define TILT_RATE 10
  78. #define ELBOW_RATE 2
  79. #define SHOULDER_RATE 5
  80. #define LAT_RATE 5
  81. #define CANNON_RATE 40
  82. #define UPPER_LEG_RATE 3
  83. #define UPPER_LEG_RATE_GROIN 10
  84. #define LIGHT_TURN_RATE 10
  85. #define VIEW_TURN_RATE 10
  86. /* end of motion rate variables */
  87. /* start of motion  variables */
  88. /* Some <math.h> files do not define M_PI... */
  89. #ifndef M_PI
  90. #define M_PI 3.14159265358979323846
  91. #endif
  92. GLUquadricObj *qobj;
  93. char leg = 0;
  94. int shoulder1 = 0, shoulder2 = 0, shoulder3 = 0, shoulder4 = 0, lat1 = 20, lat2 = 20,
  95.   elbow1 = 0, elbow2 = 0, pivot = 0, tilt = 10, ankle1 = 0, ankle2 = 0, heel1 = 0,
  96.   heel2 = 0, hip11 = 0, hip12 = 10, hip21 = 0, hip22 = 10, fire = 0, solid_part = 0,
  97.   anim = 0, turn = 0, turn1 = 0, lightturn = 0, lightturn1 = 0;
  98. float elevation = 0.0, distance = 0.0, frame = 3.0
  99.  /* foot1v[] = {} foot2v[] = {} */ ;
  100. /* end of motion variables */
  101. /* start of material definitions */
  102. #ifdef LIGHT
  103. GLfloat mat_specular[] =
  104. {0.628281, 0.555802, 0.366065, 1.0};
  105. GLfloat mat_ambient[] =
  106. {0.24725, 0.1995, 0.0745, 1.0};
  107. GLfloat mat_diffuse[] =
  108. {0.75164, 0.60648, 0.22648, 1.0};
  109. GLfloat mat_shininess[] =
  110. {128.0 * 0.4};
  111. GLfloat mat_specular2[] =
  112. {0.508273, 0.508273, 0.508373};
  113. GLfloat mat_ambient2[] =
  114. {0.19225, 0.19225, 0.19225};
  115. GLfloat mat_diffuse2[] =
  116. {0.50754, 0.50754, 0.50754};
  117. GLfloat mat_shininess2[] =
  118. {128.0 * 0.6};
  119. GLfloat mat_specular3[] =
  120. {0.296648, 0.296648, 0.296648};
  121. GLfloat mat_ambient3[] =
  122. {0.25, 0.20725, 0.20725};
  123. GLfloat mat_diffuse3[] =
  124. {1, 0.829, 0.829};
  125. GLfloat mat_shininess3[] =
  126. {128.0 * 0.088};
  127. GLfloat mat_specular4[] =
  128. {0.633, 0.727811, 0.633};
  129. GLfloat mat_ambient4[] =
  130. {0.0215, 0.1745, 0.0215};
  131. GLfloat mat_diffuse4[] =
  132. {0.07568, 0.61424, 0.07568};
  133. GLfloat mat_shininess4[] =
  134. {128 * 0.6};
  135. GLfloat mat_specular5[] =
  136. {0.60, 0.60, 0.50};
  137. GLfloat mat_ambient5[] =
  138. {0.0, 0.0, 0.0};
  139. GLfloat mat_diffuse5[] =
  140. {0.5, 0.5, 0.0};
  141. GLfloat mat_shininess5[] =
  142. {128.0 * 0.25};
  143. #endif
  144. /* end of material definitions */
  145. /* start of the body motion functions */
  146. void
  147. Heel1Add(void)
  148. {
  149.   heel1 = (heel1 + HEEL_RATE) % 360;
  150. }
  151. void
  152. Heel1Subtract(void)
  153. {
  154.   heel1 = (heel1 - HEEL_RATE) % 360;
  155. }
  156. void
  157. Heel2Add(void)
  158. {
  159.   heel2 = (heel2 + HEEL_RATE) % 360;
  160. }
  161. void
  162. Heel2Subtract(void)
  163. {
  164.   heel2 = (heel2 - HEEL_RATE) % 360;
  165. }
  166. void
  167. Ankle1Add(void)
  168. {
  169.   ankle1 = (ankle1 + ANKLE_RATE) % 360;
  170. }
  171. void
  172. Ankle1Subtract(void)
  173. {
  174.   ankle1 = (ankle1 - ANKLE_RATE) % 360;
  175. }
  176. void
  177. Ankle2Add(void)
  178. {
  179.   ankle2 = (ankle2 + ANKLE_RATE) % 360;
  180. }
  181. void
  182. Ankle2Subtract(void)
  183. {
  184.   ankle2 = (ankle2 - ANKLE_RATE) % 360;
  185. }
  186. void
  187. RotateAdd(void)
  188. {
  189.   pivot = (pivot + ROTATE_RATE) % 360;
  190. }
  191. void
  192. RotateSubtract(void)
  193. {
  194.   pivot = (pivot - ROTATE_RATE) % 360;
  195. }
  196. void
  197. MechTiltSubtract(void)
  198. {
  199.   tilt = (tilt - TILT_RATE) % 360;
  200. }
  201. void
  202. MechTiltAdd(void)
  203. {
  204.   tilt = (tilt + TILT_RATE) % 360;
  205. }
  206. void
  207. elbow1Add(void)
  208. {
  209.   elbow1 = (elbow1 + ELBOW_RATE) % 360;
  210. }
  211. void
  212. elbow1Subtract(void)
  213. {
  214.   elbow1 = (elbow1 - ELBOW_RATE) % 360;
  215. }
  216. void
  217. elbow2Add(void)
  218. {
  219.   elbow2 = (elbow2 + ELBOW_RATE) % 360;
  220. }
  221. void
  222. elbow2Subtract(void)
  223. {
  224.   elbow2 = (elbow2 - ELBOW_RATE) % 360;
  225. }
  226. void
  227. shoulder1Add(void)
  228. {
  229.   shoulder1 = (shoulder1 + SHOULDER_RATE) % 360;
  230. }
  231. void
  232. shoulder1Subtract(void)
  233. {
  234.   shoulder1 = (shoulder1 - SHOULDER_RATE) % 360;
  235. }
  236. void
  237. shoulder2Add(void)
  238. {
  239.   shoulder2 = (shoulder2 + SHOULDER_RATE) % 360;
  240. }
  241. void
  242. shoulder2Subtract(void)
  243. {
  244.   shoulder2 = (shoulder2 - SHOULDER_RATE) % 360;
  245. }
  246. void
  247. shoulder3Add(void)
  248. {
  249.   shoulder3 = (shoulder3 + SHOULDER_RATE) % 360;
  250. }
  251. void
  252. shoulder3Subtract(void)
  253. {
  254.   shoulder3 = (shoulder3 - SHOULDER_RATE) % 360;
  255. }
  256. void
  257. shoulder4Add(void)
  258. {
  259.   shoulder4 = (shoulder4 + SHOULDER_RATE) % 360;
  260. }
  261. void
  262. shoulder4Subtract(void)
  263. {
  264.   shoulder4 = (shoulder4 - SHOULDER_RATE) % 360;
  265. }
  266. void
  267. lat1Raise(void)
  268. {
  269.   lat1 = (lat1 + LAT_RATE) % 360;
  270. }
  271. void
  272. lat1Lower(void)
  273. {
  274.   lat1 = (lat1 - LAT_RATE) % 360;
  275. }
  276. void
  277. lat2Raise(void)
  278. {
  279.   lat2 = (lat2 + LAT_RATE) % 360;
  280. }
  281. void
  282. lat2Lower(void)
  283. {
  284.   lat2 = (lat2 - LAT_RATE) % 360;
  285. }
  286. void
  287. FireCannon(void)
  288. {
  289.   fire = (fire + CANNON_RATE) % 360;
  290. }
  291. void
  292. RaiseLeg1Forward(void)
  293. {
  294.   hip11 = (hip11 + UPPER_LEG_RATE) % 360;
  295. }
  296. void
  297. LowerLeg1Backwards(void)
  298. {
  299.   hip11 = (hip11 - UPPER_LEG_RATE) % 360;
  300. }
  301. void
  302. RaiseLeg1Outwards(void)
  303. {
  304.   hip12 = (hip12 + UPPER_LEG_RATE_GROIN) % 360;
  305. }
  306. void
  307. LowerLeg1Inwards(void)
  308. {
  309.   hip12 = (hip12 - UPPER_LEG_RATE_GROIN) % 360;
  310. }
  311. void
  312. RaiseLeg2Forward(void)
  313. {
  314.   hip21 = (hip21 + UPPER_LEG_RATE) % 360;
  315. }
  316. void
  317. LowerLeg2Backwards(void)
  318. {
  319.   hip21 = (hip21 - UPPER_LEG_RATE) % 360;
  320. }
  321. void
  322. RaiseLeg2Outwards(void)
  323. {
  324.   hip22 = (hip22 + UPPER_LEG_RATE_GROIN) % 360;
  325. }
  326. void
  327. LowerLeg2Inwards(void)
  328. {
  329.   hip22 = (hip22 - UPPER_LEG_RATE_GROIN) % 360;
  330. }
  331. /* end of body motion functions */
  332. /* start of light source position functions */
  333. void
  334. TurnRight(void)
  335. {
  336.   turn = (turn - VIEW_TURN_RATE) % 360;
  337. }
  338. void
  339. TurnLeft(void)
  340. {
  341.   turn = (turn + VIEW_TURN_RATE) % 360;
  342. }
  343. void
  344. TurnForwards(void)
  345. {
  346.   turn1 = (turn1 - VIEW_TURN_RATE) % 360;
  347. }
  348. void
  349. TurnBackwards(void)
  350. {
  351.   turn1 = (turn1 + VIEW_TURN_RATE) % 360;
  352. }
  353. void
  354. LightTurnRight(void)
  355. {
  356.   lightturn = (lightturn + LIGHT_TURN_RATE) % 360;
  357. }
  358. void
  359. LightTurnLeft(void)
  360. {
  361.   lightturn = (lightturn - LIGHT_TURN_RATE) % 360;
  362. }
  363. void
  364. LightForwards(void)
  365. {
  366.   lightturn1 = (lightturn1 + LIGHT_TURN_RATE) % 360;
  367. }
  368. void
  369. LightBackwards(void)
  370. {
  371.   lightturn1 = (lightturn1 - LIGHT_TURN_RATE) % 360;
  372. }
  373. /* end of light source position functions */
  374. /* start of geometric shape functions */
  375. void
  376. Box(float width, float height, float depth, char solid)
  377. {
  378.   char i, j = 0;
  379.   float x = width / 2.0, y = height / 2.0, z = depth / 2.0;
  380.   for (i = 0; i < 4; i++) {
  381.     glRotatef(90.0, 0.0, 0.0, 1.0);
  382.     if (j) {
  383.       if (!solid)
  384.         glBegin(GL_LINE_LOOP);
  385.       else
  386.         glBegin(GL_QUADS);
  387.       glNormal3f(-1.0, 0.0, 0.0);
  388.       glVertex3f(-x, y, z);
  389.       glVertex3f(-x, -y, z);
  390.       glVertex3f(-x, -y, -z);
  391.       glVertex3f(-x, y, -z);
  392.       glEnd();
  393.       if (solid) {
  394.         glBegin(GL_TRIANGLES);
  395.         glNormal3f(0.0, 0.0, 1.0);
  396.         glVertex3f(0.0, 0.0, z);
  397.         glVertex3f(-x, y, z);
  398.         glVertex3f(-x, -y, z);
  399.         glNormal3f(0.0, 0.0, -1.0);
  400.         glVertex3f(0.0, 0.0, -z);
  401.         glVertex3f(-x, -y, -z);
  402.         glVertex3f(-x, y, -z);
  403.         glEnd();
  404.       }
  405.       j = 0;
  406.     } else {
  407.       if (!solid)
  408.         glBegin(GL_LINE_LOOP);
  409.       else
  410.         glBegin(GL_QUADS);
  411.       glNormal3f(-1.0, 0.0, 0.0);
  412.       glVertex3f(-y, x, z);
  413.       glVertex3f(-y, -x, z);
  414.       glVertex3f(-y, -x, -z);
  415.       glVertex3f(-y, x, -z);
  416.       glEnd();
  417.       if (solid) {
  418.         glBegin(GL_TRIANGLES);
  419.         glNormal3f(0.0, 0.0, 1.0);
  420.         glVertex3f(0.0, 0.0, z);
  421.         glVertex3f(-y, x, z);
  422.         glVertex3f(-y, -x, z);
  423.         glNormal3f(0.0, 0.0, -1.0);
  424.         glVertex3f(0.0, 0.0, -z);
  425.         glVertex3f(-y, -x, -z);
  426.         glVertex3f(-y, x, -z);
  427.         glEnd();
  428.       }
  429.       j = 1;
  430.     }
  431.   }
  432. }
  433. void
  434. Octagon(float side, float height, char solid)
  435. {
  436.   char j;
  437.   float x = sin(0.785398163) * side, y = side / 2.0, z = height / 2.0, c;
  438.   c = x + y;
  439.   for (j = 0; j < 8; j++) {
  440.     glTranslatef(-c, 0.0, 0.0);
  441.     if (!solid)
  442.       glBegin(GL_LINE_LOOP);
  443.     else
  444.       glBegin(GL_QUADS);
  445.     glNormal3f(-1.0, 0.0, 0.0);
  446.     glVertex3f(0.0, -y, z);
  447.     glVertex3f(0.0, y, z);
  448.     glVertex3f(0.0, y, -z);
  449.     glVertex3f(0.0, -y, -z);
  450.     glEnd();
  451.     glTranslatef(c, 0.0, 0.0);
  452.     if (solid) {
  453.       glBegin(GL_TRIANGLES);
  454.       glNormal3f(0.0, 0.0, 1.0);
  455.       glVertex3f(0.0, 0.0, z);
  456.       glVertex3f(-c, -y, z);
  457.       glVertex3f(-c, y, z);
  458.       glNormal3f(0.0, 0.0, -1.0);
  459.       glVertex3f(0.0, 0.0, -z);
  460.       glVertex3f(-c, y, -z);
  461.       glVertex3f(-c, -y, -z);
  462.       glEnd();
  463.     }
  464.     glRotatef(45.0, 0.0, 0.0, 1.0);
  465.   }
  466. }
  467. /* end of geometric shape functions */
  468. #ifdef NORM
  469. void
  470. Normalize(float v[3])
  471. {
  472.   GLfloat d = sqrt(v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
  473.   if (d == 0.0) {
  474.     printf("zero length vector");
  475.     return;
  476.   }
  477.   v[1] /= d;
  478.   v[2] /= d;
  479.   v[3] /= d;
  480. }
  481. void
  482. NormXprod(float v1[3], float v2[3], float v[3], float out[3])
  483. {
  484.   GLint i, j;
  485.   GLfloat length;
  486.   out[0] = v1[1] * v2[2] - v1[2] * v2[1];
  487.   out[1] = v1[2] * v2[0] - v1[0] * v2[2];
  488.   out[2] = v1[0] * v2[1] - v1[1] * v2[0];
  489.   Normalize(out);
  490. }
  491. #endif
  492. void
  493. SetMaterial(GLfloat spec[], GLfloat amb[], GLfloat diff[], GLfloat shin[])
  494. {
  495.   glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
  496.   glMaterialfv(GL_FRONT, GL_SHININESS, shin);
  497.   glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
  498.   glMaterialfv(GL_FRONT, GL_DIFFUSE, diff);
  499. }
  500. void
  501. MechTorso(char solid)
  502. {
  503.   glNewList(SOLID_MECH_TORSO, GL_COMPILE);
  504. #ifdef LIGHT
  505.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  506. #endif
  507.   glColor3f(1.0, 1.0, 0.0);
  508.   Box(1.0, 1.0, 3.0, solid);
  509.   glTranslatef(0.75, 0.0, 0.0);
  510. #ifdef LIGHT
  511.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  512. #endif
  513.   glColor3f(0.5, 0.5, 0.5);
  514.   Box(0.5, 0.6, 2.0, solid);
  515.   glTranslatef(-1.5, 0.0, 0.0);
  516.   Box(0.5, 0.6, 2.0, solid);
  517.   glTranslatef(0.75, 0.0, 0.0);
  518.   glEndList();
  519. }
  520. void
  521. MechHip(char solid)
  522. {
  523.   int i;
  524.   glNewList(SOLID_MECH_HIP, GL_COMPILE);
  525. #ifdef LIGHT
  526.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  527. #endif
  528.   glColor3f(1.0, 1.0, 0.0);
  529.   Octagon(0.7, 0.5, solid);
  530. #ifdef SPHERE
  531.   for (i = 0; i < 2; i++) {
  532.     if (i)
  533.       glScalef(-1.0, 1.0, 1.0);
  534.     glTranslatef(1.0, 0.0, 0.0);
  535. #ifdef LIGHT
  536.     SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  537. #endif
  538.     glColor3f(0.5, 0.5, 0.5);
  539.     if (!solid)
  540.       gluQuadricDrawStyle(qobj, GLU_LINE);
  541.     gluSphere(qobj, 0.2, 16, 16);
  542.     glTranslatef(-1.0, 0.0, 0.0);
  543.   }
  544.   glScalef(-1.0, 1.0, 1.0);
  545. #endif
  546.   glEndList();
  547. }
  548. void
  549. Shoulder(char solid)
  550. {
  551.   glNewList(SOLID_MECH_SHOULDER, GL_COMPILE);
  552. #ifdef LIGHT
  553.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  554. #endif
  555.   glColor3f(1.0, 1.0, 0.0);
  556.   Box(1.0, 0.5, 0.5, solid);
  557.   glTranslatef(0.9, 0.0, 0.0);
  558. #ifdef LIGHT
  559.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  560. #endif
  561.   glColor3f(0.5, 0.5, 0.5);
  562. #ifdef SPHERE
  563.   if (!solid)
  564.     gluQuadricDrawStyle(qobj, GLU_LINE);
  565.   gluSphere(qobj, 0.6, 16, 16);
  566. #endif
  567.   glTranslatef(-0.9, 0.0, 0.0);
  568.   glEndList();
  569. }
  570. void
  571. UpperArm(char solid)
  572. {
  573.   int i;
  574.   glNewList(SOLID_MECH_UPPER_ARM, GL_COMPILE);
  575. #ifdef LIGHT
  576.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  577. #endif
  578.   glColor3f(1.0, 1.0, 0.0);
  579.   Box(1.0, 2.0, 1.0, solid);
  580.   glTranslatef(0.0, -0.95, 0.0);
  581.   glRotatef(90.0, 1.0, 0.0, 0.0);
  582. #ifdef LIGHT
  583.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  584. #endif
  585.   glColor3f(0.5, 0.5, 0.5);
  586.   if (!solid)
  587.     gluQuadricDrawStyle(qobj, GLU_LINE);
  588.   gluCylinder(qobj, 0.4, 0.4, 1.5, 16, 10);
  589. #ifdef LIGHT
  590.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  591. #endif
  592.   glColor3f(1.0, 1.0, 0.0);
  593.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  594.   glTranslatef(-0.4, -1.85, 0.0);
  595.   glRotatef(90.0, 0.0, 1.0, 0.0);
  596.   for (i = 0; i < 2; i++) {
  597.     if (!solid)
  598.       gluQuadricDrawStyle(qobj, GLU_LINE);
  599.     if (i)
  600.       gluCylinder(qobj, 0.5, 0.5, 0.8, 16, 10);
  601.     else
  602.       gluCylinder(qobj, 0.2, 0.2, 0.8, 16, 10);
  603.   }
  604.   for (i = 0; i < 2; i++) {
  605.     if (i)
  606.       glScalef(-1.0, 1.0, 1.0);
  607.     if (!solid)
  608.       gluQuadricDrawStyle(qobj, GLU_LINE);
  609.     if (i)
  610.       glTranslatef(0.0, 0.0, 0.8);
  611.     gluDisk(qobj, 0.2, 0.5, 16, 10);
  612.     if (i)
  613.       glTranslatef(0.0, 0.0, -0.8);
  614.   }
  615.   glScalef(-1.0, 1.0, 1.0);
  616.   glRotatef(-90.0, 0.0, 1.0, 0.0);
  617.   glTranslatef(0.4, 2.9, 0.0);
  618.   glEndList();
  619. }
  620. void
  621. VulcanGun(char solid)
  622. {
  623.   int i;
  624.   glNewList(SOLID_MECH_VULCAN, GL_COMPILE);
  625. #ifdef LIGHT
  626.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  627. #endif
  628.   glColor3f(0.5, 0.5, 0.5);
  629.   if (!solid) {
  630.     gluQuadricDrawStyle(qobj, GLU_LINE);
  631.   }
  632.   gluCylinder(qobj, 0.5, 0.5, 0.5, 16, 10);
  633.   glTranslatef(0.0, 0.0, 0.5);
  634.   gluDisk(qobj, 0.0, 0.5, 16, 10);
  635.   for (i = 0; i < 5; i++) {
  636.     glRotatef(72.0, 0.0, 0.0, 1.0);
  637.     glTranslatef(0.0, 0.3, 0.0);
  638.     if (!solid) {
  639.       gluQuadricDrawStyle(qobj, GLU_LINE);
  640.     }
  641.     gluCylinder(qobj, 0.15, 0.15, 2.0, 16, 10);
  642.     gluCylinder(qobj, 0.06, 0.06, 2.0, 16, 10);
  643.     glTranslatef(0.0, 0.0, 2.0);
  644.     gluDisk(qobj, 0.1, 0.15, 16, 10);
  645.     gluCylinder(qobj, 0.1, 0.1, 0.1, 16, 5);
  646.     glTranslatef(0.0, 0.0, 0.1);
  647.     gluDisk(qobj, 0.06, 0.1, 16, 5);
  648.     glTranslatef(0.0, -0.3, -2.1);
  649.   }
  650.   glEndList();
  651. }
  652. void
  653. ForeArm(char solid)
  654. {
  655.   char i;
  656.   glNewList(SOLID_MECH_FOREARM, GL_COMPILE);
  657. #ifdef LIGHT
  658.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  659. #endif
  660.   glColor3f(1.0, 1.0, 0.0);
  661.   for (i = 0; i < 5; i++) {
  662.     glTranslatef(0.0, -0.1, -0.15);
  663.     Box(0.6, 0.8, 0.2, solid);
  664.     glTranslatef(0.0, 0.1, -0.15);
  665.     Box(0.4, 0.6, 0.1, solid);
  666.   }
  667.   glTranslatef(0.0, 0.0, 2.45);
  668.   Box(1.0, 1.0, 2.0, solid);
  669.   glTranslatef(0.0, 0.0, -1.0);
  670.   glEndList();
  671. }
  672. void
  673. UpperLeg(char solid)
  674. {
  675.   int i;
  676.   glNewList(SOLID_MECH_UPPER_LEG, GL_COMPILE);
  677. #ifdef LIGHT
  678.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  679. #endif
  680.   glColor3f(1.0, 1.0, 0.0);
  681.   if (!solid) {
  682.     gluQuadricDrawStyle(qobj, GLU_LINE);
  683.   }
  684.   glTranslatef(0.0, -1.0, 0.0);
  685.   Box(0.4, 1.0, 0.7, solid);
  686.   glTranslatef(0.0, -0.65, 0.0);
  687.   for (i = 0; i < 5; i++) {
  688.     Box(1.2, 0.3, 1.2, solid);
  689.     glTranslatef(0.0, -0.2, 0.0);
  690.     Box(1.0, 0.1, 1.0, solid);
  691.     glTranslatef(0.0, -0.2, 0.0);
  692.   }
  693.   glTranslatef(0.0, -0.15, -0.4);
  694.   Box(2.0, 0.5, 2.0, solid);
  695.   glTranslatef(0.0, -0.3, -0.2);
  696.   glRotatef(90.0, 1.0, 0.0, 0.0);
  697. #ifdef LIGHT
  698.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  699. #endif
  700.   glColor3f(0.5, 0.5, 0.5);
  701.   gluCylinder(qobj, 0.6, 0.6, 3.0, 16, 10);
  702. #ifdef LIGHT
  703.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  704. #endif
  705.   glColor3f(1.0, 1.0, 0.0);
  706.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  707.   glTranslatef(0.0, -1.5, 1.0);
  708.   Box(1.5, 3.0, 0.5, solid);
  709.   glTranslatef(0.0, -1.75, -0.8);
  710.   Box(2.0, 0.5, 2.0, solid);
  711.   glTranslatef(0.0, -0.9, -0.85);
  712. #ifdef LIGHT
  713.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  714. #endif
  715.   glColor3f(0.5, 0.5, 0.5);
  716.   gluCylinder(qobj, 0.8, 0.8, 1.8, 16, 10);
  717.   for (i = 0; i < 2; i++) {
  718.     if (i)
  719.       glScalef(-1.0, 1.0, 1.0);
  720.     if (!solid)
  721.       gluQuadricDrawStyle(qobj, GLU_LINE);
  722.     if (i)
  723.       glTranslatef(0.0, 0.0, 1.8);
  724.     gluDisk(qobj, 0.0, 0.8, 16, 10);
  725.     if (i)
  726.       glTranslatef(0.0, 0.0, -1.8);
  727.   }
  728.   glScalef(-1.0, 1.0, 1.0);
  729.   glEndList();
  730. }
  731. void
  732. Foot(char solid)
  733. {
  734.   glNewList(SOLID_MECH_FOOT, GL_COMPILE);
  735. #ifdef LIGHT
  736.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  737. #endif
  738.   glColor3f(0.5, 0.5, 0.5);
  739.   glRotatef(90.0, 1.0, 0.0, 0.0);
  740.   Octagon(1.5, 0.6, solid);
  741.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  742.   glEndList();
  743. }
  744. void
  745. LowerLeg(char solid)
  746. {
  747.   float k, l;
  748. #ifdef LIGHT
  749.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  750. #endif
  751.   glColor3f(1.0, 1.0, 0.0);
  752.   for (k = 0.0; k < 2.0; k++) {
  753.     for (l = 0.0; l < 2.0; l++) {
  754.       glPushMatrix();
  755.       glTranslatef(k, 0.0, l);
  756. #ifdef LIGHT
  757.       SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  758. #endif
  759.       glColor3f(1.0, 1.0, 0.0);
  760.       Box(1.0, 0.5, 1.0, solid);
  761.       glTranslatef(0.0, -0.45, 0.0);
  762. #ifdef LIGHT
  763.       SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  764. #endif
  765.       glColor3f(0.5, 0.5, 0.5);
  766. #ifdef SPHERE
  767.       if (!solid)
  768.         glutWireSphere(0.2, 16, 10);
  769.       else
  770.         glutSolidSphere(0.2, 16, 10);
  771. #endif
  772.       if (leg)
  773.         glRotatef((GLfloat) heel1, 1.0, 0.0, 0.0);
  774.       else
  775.         glRotatef((GLfloat) heel2, 1.0, 0.0, 0.0);
  776.       /* glTranslatef(0.0, -0.2, 0.0); */
  777.       glTranslatef(0.0, -1.7, 0.0);
  778. #ifdef LIGHT
  779.       SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  780. #endif
  781.       glColor3f(1.0, 1.0, 0.0);
  782.       Box(0.25, 3.0, 0.25, solid);
  783.       glTranslatef(0.0, -1.7, 0.0);
  784. #ifdef LIGHT
  785.       SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  786. #endif
  787.       glColor3f(0.5, 0.5, 0.5);
  788. #ifdef SPHERE
  789.       if (!solid)
  790.         glutWireSphere(0.2, 16, 10);
  791.       else
  792.         glutSolidSphere(0.2, 16, 10);
  793. #endif
  794.       if (leg)
  795.         glRotatef((GLfloat) - heel1, 1.0, 0.0, 0.0);
  796.       else
  797.         glRotatef((GLfloat) - heel2, 1.0, 0.0, 0.0);
  798.       glTranslatef(0.0, -0.45, 0.0);
  799. #ifdef LIGHT
  800.       SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  801. #endif
  802.       glColor3f(1.0, 1.0, 0.0);
  803.       Box(1.0, 0.5, 1.0, solid);
  804.       if (!k && !l) {
  805.         int j;
  806.         glTranslatef(-0.4, -0.8, 0.5);
  807.         if (leg)
  808.           glRotatef((GLfloat) ankle1, 1.0, 0.0, 0.0);
  809.         else
  810.           glRotatef((GLfloat) ankle2, 1.0, 0.0, 0.0);
  811.         glRotatef(90.0, 0.0, 1.0, 0.0);
  812.         if (!solid)
  813.           gluQuadricDrawStyle(qobj, GLU_LINE);
  814.         gluCylinder(qobj, 0.8, 0.8, 1.8, 16, 10);
  815.         for (j = 0; j < 2; j++) {
  816.           if (!solid)
  817.             gluQuadricDrawStyle(qobj, GLU_LINE);
  818.           if (j) {
  819.             glScalef(-1.0, 1.0, 1.0);
  820.             glTranslatef(0.0, 0.0, 1.8);
  821.           }
  822.           gluDisk(qobj, 0.0, 0.8, 16, 10);
  823.           if (j)
  824.             glTranslatef(0.0, 0.0, -1.8);
  825.         }
  826.         glScalef(-1.0, 1.0, 1.0);
  827.         glRotatef(-90.0, 0.0, 1.0, 0.0);
  828.         glTranslatef(0.95, -0.8, 0.0);
  829.         glCallList(SOLID_MECH_FOOT);
  830.       }
  831.       glPopMatrix();
  832.     }
  833.   }
  834. }
  835. void
  836. RocketPod(char solid)
  837. {
  838.   int i, j, k = 0;
  839.   glNewList(SOLID_MECH_ROCKET, GL_COMPILE);
  840. #ifdef LIGHT
  841.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  842. #endif
  843.   glColor3f(0.5, 0.5, 0.5);
  844.   glScalef(0.4, 0.4, 0.4);
  845.   glRotatef(45.0, 0.0, 0.0, 1.0);
  846.   glTranslatef(1.0, 0.0, 0.0);
  847.   Box(2.0, 0.5, 3.0, solid);
  848.   glTranslatef(1.0, 0.0, 0.0);
  849.   glRotatef(45.0, 0.0, 0.0, 1.0);
  850.   glTranslatef(0.5, 0.0, 0.0);
  851.   Box(1.2, 0.5, 3.0, solid);
  852.   glTranslatef(2.1, 0.0, 0.0);
  853.   glRotatef(-90.0, 0.0, 0.0, 1.0);
  854. #ifdef LIGHT
  855.   SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
  856. #endif
  857.   glColor3f(1.0, 1.0, 0.0);
  858.   Box(2.0, 3.0, 4.0, solid);
  859.   glTranslatef(-0.5, -1.0, 1.3);
  860.   for (i = 0; i < 2; i++) {
  861.     for (j = 0; j < 3; j++) {
  862.       if (!solid) {
  863.         gluQuadricDrawStyle(qobj, GLU_LINE);
  864.       }
  865.       glTranslatef(i, j, 0.6);
  866. #ifdef LIGHT
  867.       SetMaterial(mat_specular3, mat_ambient3, mat_diffuse3, mat_shininess3);
  868. #endif
  869.       glColor3f(1.0, 1.0, 1.0);
  870.       gluCylinder(qobj, 0.4, 0.4, 0.3, 16, 10);
  871.       glTranslatef(0.0, 0.0, 0.3);
  872. #ifdef LIGHT
  873.       SetMaterial(mat_specular4, mat_ambient4, mat_diffuse4, mat_shininess4);
  874. #endif
  875.       glColor3f(0.0, 1.0, 0.0);
  876.       gluCylinder(qobj, 0.4, 0.0, 0.5, 16, 10);
  877.       k++;
  878.       glTranslatef(-i, -j, -0.9);
  879.     }
  880.   }
  881.   glEndList();
  882. }
  883. void
  884. Enviro(char solid)
  885. {
  886.   int i, j;
  887.   glNewList(SOLID_ENVIRO, GL_COMPILE);
  888.   SetMaterial(mat_specular4, mat_ambient4, mat_diffuse4, mat_shininess4);
  889.   glColor3f(0.0, 1.0, 0.0);
  890.   Box(20.0, 0.5, 30.0, solid);
  891.   SetMaterial(mat_specular4, mat_ambient3, mat_diffuse2, mat_shininess);
  892.   glColor3f(0.6, 0.6, 0.6);
  893.   glTranslatef(0.0, 0.0, -10.0);
  894.   for (j = 0; j < 6; j++) {
  895.     for (i = 0; i < 2; i++) {
  896.       if (i)
  897.         glScalef(-1.0, 1.0, 1.0);
  898.       glTranslatef(10.0, 4.0, 0.0);
  899.       Box(4.0, 8.0, 2.0, solid);
  900.       glTranslatef(0.0, -1.0, -3.0);
  901.       Box(4.0, 6.0, 2.0, solid);
  902.       glTranslatef(-10.0, -3.0, 3.0);
  903.     }
  904.     glScalef(-1.0, 1.0, 1.0);
  905.     glTranslatef(0.0, 0.0, 5.0);
  906.   }
  907.   glEndList();
  908. }
  909. void
  910. Toggle(void)
  911. {
  912.   if (solid_part)
  913.     solid_part = 0;
  914.   else
  915.     solid_part = 1;
  916. }
  917. void
  918. disable(void)
  919. {
  920.   glDisable(GL_LIGHTING);
  921.   glDisable(GL_DEPTH_TEST);
  922.   glDisable(GL_NORMALIZE);
  923.   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  924. }
  925. void
  926. lighting(void)
  927. {
  928.   GLfloat position[] =
  929.   {0.0, 0.0, 2.0, 1.0};
  930. #ifdef MOVE_LIGHT
  931.   glRotatef((GLfloat) lightturn1, 1.0, 0.0, 0.0);
  932.   glRotatef((GLfloat) lightturn, 0.0, 1.0, 0.0);
  933.   glRotatef(0.0, 1.0, 0.0, 0.0);
  934. #endif
  935.   glEnable(GL_LIGHTING);
  936.   glEnable(GL_LIGHT0);
  937.   glEnable(GL_NORMALIZE);
  938.   glDepthFunc(GL_LESS);
  939.   glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  940.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  941.   glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 80.0);
  942.   glTranslatef(0.0, 0.0, 2.0);
  943.   glDisable(GL_LIGHTING);
  944.   Box(0.1, 0.1, 0.1, 0);
  945.   glEnable(GL_LIGHTING);
  946. }
  947. void
  948. DrawMech(void)
  949. {
  950.   int i, j;
  951.   glScalef(0.5, 0.5, 0.5);
  952.   glPushMatrix();
  953.   glTranslatef(0.0, -0.75, 0.0);
  954.   glRotatef((GLfloat) tilt, 1.0, 0.0, 0.0);
  955.   glRotatef(90.0, 1.0, 0.0, 0.0);
  956. #ifdef HIP
  957.   glCallList(SOLID_MECH_HIP);
  958. #endif
  959.   glRotatef(-90.0, 1.0, 0.0, 0.0);
  960.   glTranslatef(0.0, 0.75, 0.0);
  961.   glPushMatrix();
  962.   glRotatef((GLfloat) pivot, 0.0, 1.0, 0.0);
  963.   glPushMatrix();
  964. #ifdef TORSO
  965.   glCallList(SOLID_MECH_TORSO);
  966. #endif
  967.   glPopMatrix();
  968.   glPushMatrix();
  969.   glTranslatef(0.5, 0.5, 0.0);
  970. #ifdef ROCKET_POD
  971.   glCallList(SOLID_MECH_ROCKET);
  972. #endif
  973.   glPopMatrix();
  974.   for (i = 0; i < 2; i++) {
  975.     glPushMatrix();
  976.     if (i)
  977.       glScalef(-1.0, 1.0, 1.0);
  978.     glTranslatef(1.5, 0.0, 0.0);
  979. #ifdef SHOULDER
  980.     glCallList(SOLID_MECH_SHOULDER);
  981. #endif
  982.     glTranslatef(0.9, 0.0, 0.0);
  983.     if (i) {
  984.       glRotatef((GLfloat) lat1, 0.0, 0.0, 1.0);
  985.       glRotatef((GLfloat) shoulder1, 1.0, 0.0, 0.0);
  986.       glRotatef((GLfloat) shoulder3, 0.0, 1.0, 0.0);
  987.     } else {
  988.       glRotatef((GLfloat) lat2, 0.0, 0.0, 1.0);
  989.       glRotatef((GLfloat) shoulder2, 1.0, 0.0, 0.0);
  990.       glRotatef((GLfloat) shoulder4, 0.0, 1.0, 0.0);
  991.     }
  992.     glTranslatef(0.0, -1.4, 0.0);
  993. #ifdef UPPER_ARM
  994.     glCallList(SOLID_MECH_UPPER_ARM);
  995. #endif
  996.     glTranslatef(0.0, -2.9, 0.0);
  997.     if (i)
  998.       glRotatef((GLfloat) elbow1, 1.0, 0.0, 0.0);
  999.     else
  1000.       glRotatef((GLfloat) elbow2, 1.0, 0.0, 0.0);
  1001.     glTranslatef(0.0, -0.9, -0.2);
  1002. #ifdef LOWER_ARM
  1003.     glCallList(SOLID_MECH_FOREARM);
  1004.     glPushMatrix();
  1005.     glTranslatef(0.0, 0.0, 2.0);
  1006.     glRotatef((GLfloat) fire, 0.0, 0.0, 1.0);
  1007.     glCallList(SOLID_MECH_VULCAN);
  1008.     glPopMatrix();
  1009. #endif
  1010.     glPopMatrix();
  1011.   }
  1012.   glPopMatrix();
  1013.   glPopMatrix();
  1014.   for (j = 0; j < 2; j++) {
  1015.     glPushMatrix();
  1016.     if (j) {
  1017.       glScalef(-0.5, 0.5, 0.5);
  1018.       leg = 1;
  1019.     } else {
  1020.       glScalef(0.5, 0.5, 0.5);
  1021.       leg = 0;
  1022.     }
  1023.     glTranslatef(2.0, -1.5, 0.0);
  1024.     if (j) {
  1025.       glRotatef((GLfloat) hip11, 1.0, 0.0, 0.0);
  1026.       glRotatef((GLfloat) hip12, 0.0, 0.0, 1.0);
  1027.     } else {
  1028.       glRotatef((GLfloat) hip21, 1.0, 0.0, 0.0);
  1029.       glRotatef((GLfloat) hip22, 0.0, 0.0, 1.0);
  1030.     }
  1031.     glTranslatef(0.0, 0.3, 0.0);
  1032. #ifdef UPPER_LEG
  1033.     glPushMatrix();
  1034.     glCallList(SOLID_MECH_UPPER_LEG);
  1035.     glPopMatrix();
  1036. #endif
  1037.     glTranslatef(0.0, -8.3, -0.4);
  1038.     if (j)
  1039.       glRotatef((GLfloat) - hip12, 0.0, 0.0, 1.0);
  1040.     else
  1041.       glRotatef((GLfloat) - hip22, 0.0, 0.0, 1.0);
  1042.     glTranslatef(-0.5, -0.85, -0.5);
  1043. #ifdef LOWER_LEG
  1044.     LowerLeg(1);
  1045. #endif
  1046.     glPopMatrix();
  1047.   }
  1048. }
  1049. void
  1050. display(void)
  1051. {
  1052.   glClearColor(0.0, 0.0, 0.0, 0.0);
  1053.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  1054.   glEnable(GL_DEPTH_TEST);
  1055.   glPushMatrix();
  1056.   glRotatef((GLfloat) turn, 0.0, 1.0, 0.0);
  1057.   glRotatef((GLfloat) turn1, 1.0, 0.0, 0.0);
  1058. #ifdef LIGHT
  1059.   if (solid_part) {
  1060.     glPushMatrix();
  1061.     lighting();
  1062.     glPopMatrix();
  1063.   } else
  1064.     disable();
  1065. #endif
  1066. #ifdef DRAW_MECH
  1067.   glPushMatrix();
  1068.   glTranslatef(0.0, elevation, 0.0);
  1069.   DrawMech();
  1070.   glPopMatrix();
  1071. #endif
  1072. #ifdef DRAW_ENVIRO
  1073.   glPushMatrix();
  1074.   if (distance >= 20.136)
  1075.     distance = 0.0;
  1076.   glTranslatef(0.0, -5.0, -distance);
  1077.   glCallList(SOLID_ENVIRO);
  1078.   glTranslatef(0.0, 0.0, 10.0);
  1079.   glCallList(SOLID_ENVIRO);
  1080.   glPopMatrix();
  1081. #endif
  1082.   glPopMatrix();
  1083.   glFlush();
  1084.   glutSwapBuffers();
  1085. }
  1086. void
  1087. myinit(void)
  1088. {
  1089.   char i = 1;
  1090.   qobj = gluNewQuadric();
  1091. #ifdef LIGHT
  1092.   SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
  1093. #endif
  1094.   glEnable(GL_DEPTH_TEST);
  1095.   MechTorso(i);
  1096.   MechHip(i);
  1097.   Shoulder(i);
  1098.   RocketPod(i);
  1099.   UpperArm(i);
  1100.   ForeArm(i);
  1101.   UpperLeg(i);
  1102.   Foot(i);
  1103.   VulcanGun(i);
  1104.   Enviro(i);
  1105. }
  1106. void
  1107. myReshape(int w, int h)
  1108. {
  1109.   glViewport(0, 0, w, h);
  1110.   glMatrixMode(GL_PROJECTION);
  1111.   glLoadIdentity();
  1112.   gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 1.0, 20.0);
  1113.   glMatrixMode(GL_MODELVIEW);
  1114.   glLoadIdentity();
  1115.   glTranslatef(0.0, 1.2, -5.5);  /* viewing transform  */
  1116. }
  1117. #ifdef ANIMATION
  1118. void
  1119. animation_walk(void)
  1120. {
  1121.   float angle;
  1122.   static int step;
  1123.   if (step == 0 || step == 2) {
  1124.     /* for(frame=3.0; frame<=21.0; frame=frame+3.0){ */
  1125.     if (frame >= 0.0 && frame <= 21.0) {
  1126.       if (frame == 0.0)
  1127.         frame = 3.0;
  1128.       angle = (180 / M_PI) * (acos(((cos((M_PI / 180) * frame) * 2.043) + 1.1625) / 3.2059));
  1129.       if (frame > 0) {
  1130.         elevation = -(3.2055 - (cos((M_PI / 180) * angle) * 3.2055));
  1131.       } else
  1132.         elevation = 0.0;
  1133.       if (step == 0) {
  1134.         hip11 = -(frame * 1.7);
  1135.         if (1.7 * frame > 15)
  1136.           heel1 = frame * 1.7;
  1137.         heel2 = 0;
  1138.         ankle1 = frame * 1.7;
  1139.         if (frame > 0)
  1140.           hip21 = angle;
  1141.         else
  1142.           hip21 = 0;
  1143.         ankle2 = -hip21;
  1144.         shoulder1 = frame * 1.5;
  1145.         shoulder2 = -frame * 1.5;
  1146.         elbow1 = frame;
  1147.         elbow2 = -frame;
  1148.       } else {
  1149.         hip21 = -(frame * 1.7);
  1150.         if (1.7 * frame > 15)
  1151.           heel2 = frame * 1.7;
  1152.         heel1 = 0;
  1153.         ankle2 = frame * 1.7;
  1154.         if (frame > 0)
  1155.           hip11 = angle;
  1156.         else
  1157.           hip11 = 0;
  1158.         ankle1 = -hip11;
  1159.         shoulder1 = -frame * 1.5;
  1160.         shoulder2 = frame * 1.5;
  1161.         elbow1 = -frame;
  1162.         elbow2 = frame;
  1163.       }
  1164.       if (frame == 21)
  1165.         step++;
  1166.       if (frame < 21)
  1167.         frame = frame + 3.0;
  1168.     }
  1169.   }
  1170.   if (step == 1 || step == 3) {
  1171.     /* for(x=21.0; x>=0.0; x=x-3.0){ */
  1172.     if (frame <= 21.0 && frame >= 0.0) {
  1173.       angle = (180 / M_PI) * (acos(((cos((M_PI / 180) * frame) * 2.043) + 1.1625) / 3.2029));
  1174.       if (frame > 0)
  1175.         elevation = -(3.2055 - (cos((M_PI / 180) * angle) * 3.2055));
  1176.       else
  1177.         elevation = 0.0;
  1178.       if (step == 1) {
  1179.         elbow2 = hip11 = -frame;
  1180.         elbow1 = heel1 = frame;
  1181.         heel2 = 15;
  1182.         ankle1 = frame;
  1183.         if (frame > 0)
  1184.           hip21 = angle;
  1185.         else
  1186.           hip21 = 0;
  1187.         ankle2 = -hip21;
  1188.         shoulder1 = 1.5 * frame;
  1189.         shoulder2 = -frame * 1.5;
  1190.       } else {
  1191.         elbow1 = hip21 = -frame;
  1192.         elbow2 = heel2 = frame;
  1193.         heel1 = 15;
  1194.         ankle2 = frame;
  1195.         if (frame > 0)
  1196.           hip11 = angle;
  1197.         else
  1198.           hip11 = 0;
  1199.         ankle1 = -hip11;
  1200.         shoulder1 = -frame * 1.5;
  1201.         shoulder2 = frame * 1.5;
  1202.       }
  1203.       if (frame == 0.0)
  1204.         step++;
  1205.       if (frame > 0)
  1206.         frame = frame - 3.0;
  1207.     }
  1208.   }
  1209.   if (step == 4)
  1210.     step = 0;
  1211.   distance += 0.1678;
  1212.   glutPostRedisplay();
  1213. }
  1214. void
  1215. animation(void)
  1216. {
  1217.   animation_walk();
  1218. }
  1219. #endif
  1220. #ifdef GLUT
  1221. #ifdef GLUT_KEY
  1222. /* ARGSUSED1 */
  1223. void
  1224. keyboard(unsigned char key, int x, int y)
  1225. {
  1226.   int i = 0;
  1227.   switch (key) {
  1228.     /* start arm control functions */
  1229.   case 'q':{
  1230.       shoulder2Subtract();
  1231.       i++;
  1232.     }
  1233.     break;
  1234.   case 'a':{
  1235.       shoulder2Add();
  1236.       i++;
  1237.     }
  1238.     break;
  1239.   case 'w':{
  1240.       shoulder1Subtract();
  1241.       i++;
  1242.     }
  1243.     break;
  1244.   case 's':{
  1245.       shoulder1Add();
  1246.       i++;
  1247.     }
  1248.     break;
  1249.   case '2':{
  1250.       shoulder3Add();
  1251.       i++;
  1252.     }
  1253.     break;
  1254.   case '1':{
  1255.       shoulder4Add();
  1256.       i++;
  1257.     }
  1258.     break;
  1259.   case '4':{
  1260.       shoulder3Subtract();
  1261.       i++;
  1262.     }
  1263.     break;
  1264.   case '3':{
  1265.       shoulder4Subtract();
  1266.       i++;
  1267.     }
  1268.     break;
  1269.   case 'z':{
  1270.       lat2Raise();
  1271.       i++;
  1272.     }
  1273.     break;
  1274.   case 'Z':{
  1275.       lat2Lower();
  1276.       i++;
  1277.     }
  1278.     break;
  1279.   case 'x':{
  1280.       lat1Raise();
  1281.       i++;
  1282.     }
  1283.     break;
  1284.   case 'X':{
  1285.       lat1Lower();
  1286.       i++;
  1287.     }
  1288.     break;
  1289.   case 'A':{
  1290.       elbow2Add();
  1291.       i++;
  1292.     }
  1293.     break;
  1294.   case 'Q':{
  1295.       elbow2Subtract();
  1296.       i++;
  1297.     }
  1298.     break;
  1299.   case 'S':{
  1300.       elbow1Add();
  1301.       i++;
  1302.     }
  1303.     break;
  1304.   case 'W':{
  1305.       elbow1Subtract();
  1306.       i++;
  1307.     }
  1308.     break;
  1309.     /* end of arm control functions */
  1310.     /* start of torso control functions */
  1311.   case 'd':{
  1312.       RotateAdd();
  1313.       i++;
  1314.     }
  1315.     break;
  1316.   case 'g':{
  1317.       RotateSubtract();
  1318.       i++;
  1319.     }
  1320.     break;
  1321.   case 'r':{
  1322.       MechTiltAdd();
  1323.       i++;
  1324.     }
  1325.     break;
  1326.   case 'f':{
  1327.       MechTiltSubtract();
  1328.       i++;
  1329.     }
  1330.     break;
  1331.     /* end of torso control functions */
  1332.     /* start of leg control functions */
  1333.   case 'h':{
  1334.       RaiseLeg2Forward();
  1335.       i++;
  1336.     }
  1337.     break;
  1338.   case 'y':{
  1339.       LowerLeg2Backwards();
  1340.       i++;
  1341.     }
  1342.     break;
  1343.   case 'Y':{
  1344.       RaiseLeg2Outwards();
  1345.       i++;
  1346.     }
  1347.     break;
  1348.   case 'H':{
  1349.       LowerLeg2Inwards();
  1350.       i++;
  1351.     }
  1352.     break;
  1353.   case 'j':{
  1354.       RaiseLeg1Forward();
  1355.       i++;
  1356.     }
  1357.     break;
  1358.   case 'u':{
  1359.       LowerLeg1Backwards();
  1360.       i++;
  1361.     }
  1362.     break;
  1363.   case 'U':{
  1364.       RaiseLeg1Outwards();
  1365.       i++;
  1366.     }
  1367.     break;
  1368.   case 'J':{
  1369.       LowerLeg1Inwards();
  1370.       i++;
  1371.     }
  1372.     break;
  1373.   case 'N':{
  1374.       Heel2Add();
  1375.       i++;
  1376.     }
  1377.     break;
  1378.   case 'n':{
  1379.       Heel2Subtract();
  1380.       i++;
  1381.     }
  1382.     break;
  1383.   case 'M':{
  1384.       Heel1Add();
  1385.       i++;
  1386.     }
  1387.     break;
  1388.   case 'm':{
  1389.       Heel1Subtract();
  1390.       i++;
  1391.     }
  1392.     break;
  1393.   case 'k':{
  1394.       Ankle2Add();
  1395.       i++;
  1396.     }
  1397.     break;
  1398.   case 'K':{
  1399.       Ankle2Subtract();
  1400.       i++;
  1401.     }
  1402.     break;
  1403.   case 'l':{
  1404.       Ankle1Add();
  1405.       i++;
  1406.     }
  1407.     break;
  1408.   case 'L':{
  1409.       Ankle1Subtract();
  1410.       i++;
  1411.     }
  1412.     break;
  1413.     /* end of leg control functions */
  1414.     /* start of light source position functions */
  1415.   case 'p':{
  1416.       LightTurnRight();
  1417.       i++;
  1418.     }
  1419.     break;
  1420.   case 'i':{
  1421.       LightTurnLeft();
  1422.       i++;
  1423.     }
  1424.     break;
  1425.   case 'o':{
  1426.       LightForwards();
  1427.       i++;
  1428.     }
  1429.     break;
  1430.   case '9':{
  1431.       LightBackwards();
  1432.       i++;
  1433.     }
  1434.     break;
  1435.     /* end of light source position functions */
  1436.   }
  1437.   if (i)
  1438.     glutPostRedisplay();
  1439. }
  1440. #endif
  1441. #ifdef GLUT_SPEC
  1442. /* ARGSUSED1 */
  1443. void
  1444. special(int key, int x, int y)
  1445. {
  1446.   int i = 0;
  1447.   switch (key) {
  1448.     /* start of view position functions */
  1449.   case GLUT_KEY_RIGHT:{
  1450.       TurnRight();
  1451.       i++;
  1452.     }
  1453.     break;
  1454.   case GLUT_KEY_LEFT:{
  1455.       TurnLeft();
  1456.       i++;
  1457.     }
  1458.     break;
  1459.   case GLUT_KEY_DOWN:{
  1460.       TurnForwards();
  1461.       i++;
  1462.     }
  1463.     break;
  1464.   case GLUT_KEY_UP:{
  1465.       TurnBackwards();
  1466.       i++;
  1467.     }
  1468.     break;
  1469.     /* end of view postions functions */
  1470.     /* start of miseclleneous functions */
  1471.   case GLUT_KEY_PAGE_UP:{
  1472.       FireCannon();
  1473.       i++;
  1474.     }
  1475.     break;
  1476.     /* end of miscelleneous functions */
  1477.   }
  1478.   if (i)
  1479.     glutPostRedisplay();
  1480. }
  1481. #endif
  1482. #endif
  1483. void
  1484. menu_select(int mode)
  1485. {
  1486.   switch (mode) {
  1487. #ifdef ANIMATION
  1488.   case 1:
  1489.     glutIdleFunc(animation);
  1490.     break;
  1491. #endif
  1492.   case 2:
  1493.     glutIdleFunc(NULL);
  1494.     break;
  1495.   case 3:
  1496.     Toggle();
  1497.     glutPostRedisplay();
  1498.     break;
  1499.   case 4:
  1500.     exit(EXIT_SUCCESS);
  1501.   }
  1502. }
  1503. /* ARGSUSED */
  1504. void
  1505. null_select(int mode)
  1506. {
  1507. }
  1508. void
  1509. glutMenu(void)
  1510. {
  1511.   int glut_menu[13];
  1512.   glut_menu[5] = glutCreateMenu(null_select);
  1513.   glutAddMenuEntry("forward       : q,w", 0);
  1514.   glutAddMenuEntry("backwards     : a,s", 0);
  1515.   glutAddMenuEntry("outwards      : z,x", 0);
  1516.   glutAddMenuEntry("inwards       : Z,X", 0);
  1517.   glut_menu[6] = glutCreateMenu(null_select);
  1518.   glutAddMenuEntry("upwards       : Q,W", 0);
  1519.   glutAddMenuEntry("downwards     : A,S", 0);
  1520.   glutAddMenuEntry("outwards      : 1,2", 0);
  1521.   glutAddMenuEntry("inwards       : 3,4", 0);
  1522.   glut_menu[1] = glutCreateMenu(null_select);
  1523.   glutAddMenuEntry(" : Page_up", 0);
  1524.   glut_menu[8] = glutCreateMenu(null_select);
  1525.   glutAddMenuEntry("forward       : y,u", 0);
  1526.   glutAddMenuEntry("backwards     : h.j", 0);
  1527.   glutAddMenuEntry("outwards      : Y,U", 0);
  1528.   glutAddMenuEntry("inwards       : H,J", 0);
  1529.   glut_menu[9] = glutCreateMenu(null_select);
  1530.   glutAddMenuEntry("forward       : n,m", 0);
  1531.   glutAddMenuEntry("backwards     : N,M", 0);
  1532.   glut_menu[9] = glutCreateMenu(null_select);
  1533.   glutAddMenuEntry("forward       : n,m", 0);
  1534.   glutAddMenuEntry("backwards     : N,M", 0);
  1535.   glut_menu[10] = glutCreateMenu(null_select);
  1536.   glutAddMenuEntry("toes up       : K,L", 0);
  1537.   glutAddMenuEntry("toes down     : k,l", 0);
  1538.   glut_menu[11] = glutCreateMenu(null_select);
  1539.   glutAddMenuEntry("right         : right arrow", 0);
  1540.   glutAddMenuEntry("left          : left arrow", 0);
  1541.   glutAddMenuEntry("down          : up arrow", 0);
  1542.   glutAddMenuEntry("up            : down arrow", 0);
  1543.   glut_menu[12] = glutCreateMenu(null_select);
  1544.   glutAddMenuEntry("right         : p", 0);
  1545.   glutAddMenuEntry("left          : i", 0);
  1546.   glutAddMenuEntry("up            : 9", 0);
  1547.   glutAddMenuEntry("down          : o", 0);
  1548.   glut_menu[4] = glutCreateMenu(NULL);
  1549.   glutAddSubMenu("at the shoulders? ", glut_menu[5]);
  1550.   glutAddSubMenu("at the elbows?", glut_menu[6]);
  1551.   glut_menu[7] = glutCreateMenu(NULL);
  1552.   glutAddSubMenu("at the hip? ", glut_menu[8]);
  1553.   glutAddSubMenu("at the knees?", glut_menu[9]);
  1554.   glutAddSubMenu("at the ankles? ", glut_menu[10]);
  1555.   glut_menu[2] = glutCreateMenu(null_select);
  1556.   glutAddMenuEntry("turn left    : d", 0);
  1557.   glutAddMenuEntry("turn right    : g", 0);
  1558.   glut_menu[3] = glutCreateMenu(null_select);
  1559.   glutAddMenuEntry("tilt backwards : f", 0);
  1560.   glutAddMenuEntry("tilt forwards  : r", 0);
  1561.   glut_menu[0] = glutCreateMenu(NULL);
  1562.   glutAddSubMenu("move the arms.. ", glut_menu[4]);
  1563.   glutAddSubMenu("fire the vulcan guns?", glut_menu[1]);
  1564.   glutAddSubMenu("move the legs.. ", glut_menu[7]);
  1565.   glutAddSubMenu("move the torso?", glut_menu[2]);
  1566.   glutAddSubMenu("move the hip?", glut_menu[3]);
  1567.   glutAddSubMenu("rotate the scene..", glut_menu[11]);
  1568. #ifdef MOVE_LIGHT
  1569.   glutAddSubMenu("rotate the light source..", glut_menu[12]);
  1570. #endif
  1571.   glutCreateMenu(menu_select);
  1572. #ifdef ANIMATION
  1573.   glutAddMenuEntry("Start Walk", 1);
  1574.   glutAddMenuEntry("Stop Walk", 2);
  1575. #endif
  1576.   glutAddMenuEntry("Toggle Wireframe", 3);
  1577.   glutAddSubMenu("How do I ..", glut_menu[0]);
  1578.   glutAddMenuEntry("Quit", 4);
  1579.   glutAttachMenu(GLUT_LEFT_BUTTON);
  1580.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  1581. }
  1582. int
  1583. main(int argc, char **argv)
  1584. {
  1585. #ifdef GLUT
  1586.   /* start of glut windowing and control functions */
  1587.   glutInit(&argc, argv);
  1588.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
  1589.   glutInitWindowSize(800, 600);
  1590.   glutCreateWindow("glutmech: Vulcan Gunner");
  1591.   myinit();
  1592.   glutDisplayFunc(display);
  1593.   glutReshapeFunc(myReshape);
  1594. #ifdef GLUT_KEY
  1595.   glutKeyboardFunc(keyboard);
  1596. #endif
  1597. #ifdef GLUT_SPEC
  1598.   glutSpecialFunc(special);
  1599. #endif
  1600.   glutMenu();
  1601.   glutMainLoop();
  1602.   /* end of glut windowing and control functions */
  1603. #endif
  1604.   return 0;             /* ANSI C requires main to return int. */
  1605. }