PageRenderTime 59ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/1/internet_examples/terminator.c

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