source: trunk/sys/TinyGL/examples/mech.c @ 50

Last change on this file since 50 was 1, checked in by alain, 8 years ago

First import

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