Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5098 clevermous 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 
57
#include 
58
#include 
59
 
60
#define GLUT
61
#define GLUT_KEY
62
#define GLUT_SPEC
63
#include 
64
#include 
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
 
103
char leg = 0;
104
 
105
int 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
 
110
float 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
117
GLfloat mat_specular[] =
118
{0.628281, 0.555802, 0.366065, 1.0};
119
GLfloat mat_ambient[] =
120
{0.24725, 0.1995, 0.0745, 1.0};
121
GLfloat mat_diffuse[] =
122
{0.75164, 0.60648, 0.22648, 1.0};
123
GLfloat mat_shininess[] =
124
{128.0 * 0.4};
125
 
126
GLfloat mat_specular2[] =
127
{0.508273, 0.508273, 0.508373, 1.0};
128
GLfloat mat_ambient2[] =
129
{0.19225, 0.19225, 0.19225, 1.0};
130
GLfloat mat_diffuse2[] =
131
{0.50754, 0.50754, 0.50754, 1.0};
132
GLfloat mat_shininess2[] =
133
{128.0 * 0.6};
134
 
135
GLfloat mat_specular3[] =
136
{0.296648, 0.296648, 0.296648, 1.0};
137
GLfloat mat_ambient3[] =
138
{0.25, 0.20725, 0.20725, 1.0};
139
GLfloat mat_diffuse3[] =
140
{1, 0.829, 0.829, 1.0};
141
GLfloat mat_shininess3[] =
142
{128.0 * 0.088};
143
 
144
GLfloat mat_specular4[] =
145
{0.633, 0.727811, 0.633, 1.0};
146
GLfloat mat_ambient4[] =
147
{0.0215, 0.1745, 0.0215, 1.0};
148
GLfloat mat_diffuse4[] =
149
{0.07568, 0.61424, 0.07568, 1.0};
150
GLfloat mat_shininess4[] =
151
{128 * 0.6};
152
 
153
GLfloat mat_specular5[] =
154
{0.60, 0.60, 0.50, 1.0};
155
GLfloat mat_ambient5[] =
156
{0.0, 0.0, 0.0, 1.0};
157
GLfloat mat_diffuse5[] =
158
{0.5, 0.5, 0.0, 1.0};
159
GLfloat mat_shininess5[] =
160
{128.0 * 0.25};
161
 
162
#endif
163
/* end of material definitions */
164
 
165
/* start of the body motion functions */
166
void
167
Heel1Add(void)
168
{
169
  heel1 = (heel1 + HEEL_RATE) % 360;
170
}
171
 
172
void
173
Heel1Subtract(void)
174
{
175
  heel1 = (heel1 - HEEL_RATE) % 360;
176
}
177
 
178
void
179
Heel2Add(void)
180
{
181
  heel2 = (heel2 + HEEL_RATE) % 360;
182
}
183
 
184
void
185
Heel2Subtract(void)
186
{
187
  heel2 = (heel2 - HEEL_RATE) % 360;
188
}
189
 
190
void
191
Ankle1Add(void)
192
{
193
  ankle1 = (ankle1 + ANKLE_RATE) % 360;
194
}
195
 
196
void
197
Ankle1Subtract(void)
198
{
199
  ankle1 = (ankle1 - ANKLE_RATE) % 360;
200
}
201
 
202
void
203
Ankle2Add(void)
204
{
205
  ankle2 = (ankle2 + ANKLE_RATE) % 360;
206
}
207
 
208
void
209
Ankle2Subtract(void)
210
{
211
  ankle2 = (ankle2 - ANKLE_RATE) % 360;
212
}
213
 
214
void
215
RotateAdd(void)
216
{
217
  pivot = (pivot + ROTATE_RATE) % 360;
218
}
219
 
220
void
221
RotateSubtract(void)
222
{
223
  pivot = (pivot - ROTATE_RATE) % 360;
224
}
225
 
226
void
227
MechTiltSubtract(void)
228
{
229
  tilt = (tilt - TILT_RATE) % 360;
230
}
231
 
232
void
233
MechTiltAdd(void)
234
{
235
  tilt = (tilt + TILT_RATE) % 360;
236
}
237
 
238
void
239
elbow1Add(void)
240
{
241
  elbow1 = (elbow1 + ELBOW_RATE) % 360;
242
}
243
 
244
void
245
elbow1Subtract(void)
246
{
247
  elbow1 = (elbow1 - ELBOW_RATE) % 360;
248
}
249
 
250
void
251
elbow2Add(void)
252
{
253
  elbow2 = (elbow2 + ELBOW_RATE) % 360;
254
}
255
 
256
void
257
elbow2Subtract(void)
258
{
259
  elbow2 = (elbow2 - ELBOW_RATE) % 360;
260
}
261
 
262
void
263
shoulder1Add(void)
264
{
265
  shoulder1 = (shoulder1 + SHOULDER_RATE) % 360;
266
}
267
 
268
void
269
shoulder1Subtract(void)
270
{
271
  shoulder1 = (shoulder1 - SHOULDER_RATE) % 360;
272
}
273
 
274
void
275
shoulder2Add(void)
276
{
277
  shoulder2 = (shoulder2 + SHOULDER_RATE) % 360;
278
}
279
 
280
void
281
shoulder2Subtract(void)
282
{
283
  shoulder2 = (shoulder2 - SHOULDER_RATE) % 360;
284
}
285
 
286
void
287
shoulder3Add(void)
288
{
289
  shoulder3 = (shoulder3 + SHOULDER_RATE) % 360;
290
}
291
 
292
void
293
shoulder3Subtract(void)
294
{
295
  shoulder3 = (shoulder3 - SHOULDER_RATE) % 360;
296
}
297
 
298
void
299
shoulder4Add(void)
300
{
301
  shoulder4 = (shoulder4 + SHOULDER_RATE) % 360;
302
}
303
 
304
void
305
shoulder4Subtract(void)
306
{
307
  shoulder4 = (shoulder4 - SHOULDER_RATE) % 360;
308
}
309
 
310
void
311
lat1Raise(void)
312
{
313
  lat1 = (lat1 + LAT_RATE) % 360;
314
}
315
 
316
void
317
lat1Lower(void)
318
{
319
  lat1 = (lat1 - LAT_RATE) % 360;
320
}
321
 
322
void
323
lat2Raise(void)
324
{
325
  lat2 = (lat2 + LAT_RATE) % 360;
326
}
327
 
328
void
329
lat2Lower(void)
330
{
331
  lat2 = (lat2 - LAT_RATE) % 360;
332
}
333
 
334
void
335
FireCannon(void)
336
{
337
  fire = (fire + CANNON_RATE) % 360;
338
}
339
 
340
void
341
RaiseLeg1Forward(void)
342
{
343
  hip11 = (hip11 + UPPER_LEG_RATE) % 360;
344
}
345
 
346
void
347
LowerLeg1Backwards(void)
348
{
349
  hip11 = (hip11 - UPPER_LEG_RATE) % 360;
350
}
351
 
352
void
353
RaiseLeg1Outwards(void)
354
{
355
  hip12 = (hip12 + UPPER_LEG_RATE_GROIN) % 360;
356
}
357
 
358
void
359
LowerLeg1Inwards(void)
360
{
361
  hip12 = (hip12 - UPPER_LEG_RATE_GROIN) % 360;
362
}
363
 
364
void
365
RaiseLeg2Forward(void)
366
{
367
  hip21 = (hip21 + UPPER_LEG_RATE) % 360;
368
}
369
 
370
void
371
LowerLeg2Backwards(void)
372
{
373
  hip21 = (hip21 - UPPER_LEG_RATE) % 360;
374
}
375
 
376
void
377
RaiseLeg2Outwards(void)
378
{
379
  hip22 = (hip22 + UPPER_LEG_RATE_GROIN) % 360;
380
}
381
 
382
void
383
LowerLeg2Inwards(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 */
391
void
392
TurnRight(void)
393
{
394
  turn = (turn - VIEW_TURN_RATE) % 360;
395
}
396
 
397
void
398
TurnLeft(void)
399
{
400
  turn = (turn + VIEW_TURN_RATE) % 360;
401
}
402
 
403
void
404
TurnForwards(void)
405
{
406
  turn1 = (turn1 - VIEW_TURN_RATE) % 360;
407
}
408
 
409
void
410
TurnBackwards(void)
411
{
412
  turn1 = (turn1 + VIEW_TURN_RATE) % 360;
413
}
414
 
415
void
416
LightTurnRight(void)
417
{
418
  lightturn = (lightturn + LIGHT_TURN_RATE) % 360;
419
}
420
 
421
void
422
LightTurnLeft(void)
423
{
424
  lightturn = (lightturn - LIGHT_TURN_RATE) % 360;
425
}
426
 
427
void
428
LightForwards(void)
429
{
430
  lightturn1 = (lightturn1 + LIGHT_TURN_RATE) % 360;
431
}
432
 
433
void
434
LightBackwards(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 */
442
void
443
Box(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
 
502
void
503
Octagon(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
540
void
541
Normalize(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
 
554
void
555
NormXprod(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
 
568
void
569
SetMaterial(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
 
578
void
579
MechTorso(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
 
599
void
600
MechHip(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
 
631
void
632
Shoulder(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
 
656
void
657
UpperArm(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
 
713
void
714
VulcanGun(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
 
767
void
768
ForeArm(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
 
789
void
790
UpperLeg(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
 
855
void
856
Foot(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
 
870
void
871
LowerLeg(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
 
966
void
967
RocketPod(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
 
1022
void
1023
Enviro(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
 
1053
void
1054
Toggle(void)
1055
{
1056
  if (solid_part)
1057
    solid_part = 0;
1058
  else
1059
    solid_part = 1;
1060
}
1061
 
1062
void
1063
disable(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
 
1071
void
1072
lighting(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
 
1100
void
1101
DrawMech(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
 
1208
void
1209
display(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
 
1247
void
1248
init(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
 
1268
void
1269
reshape(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
1281
void
1282
animation_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
 
1378
void
1379
animation(void)
1380
{
1381
  animation_walk();
1382
}
1383
 
1384
#endif
1385
 
1386
GLenum 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
 
1633
void 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
 
1719
void 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
1733
extern int count_triangles;
1734
#endif
1735
 
1736
// #define LINUX_TEST_FLOAT
1737
 
1738
#ifdef LINUX_TEST_FLOAT
1739
#include 
1740
#endif
1741
 
1742
int
1743
main(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
}