aboutsummaryrefslogtreecommitdiffstats
path: root/3rdparty/tinygl-0.4-ugfx/examples/mech.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/tinygl-0.4-ugfx/examples/mech.c')
-rw-r--r--3rdparty/tinygl-0.4-ugfx/examples/mech.c1753
1 files changed, 1753 insertions, 0 deletions
diff --git a/3rdparty/tinygl-0.4-ugfx/examples/mech.c b/3rdparty/tinygl-0.4-ugfx/examples/mech.c
new file mode 100644
index 00000000..f071ee39
--- /dev/null
+++ b/3rdparty/tinygl-0.4-ugfx/examples/mech.c
@@ -0,0 +1,1753 @@
+/**
+* program : glutmech V1.1
+* author : Simon Parkinson-Bates.
+* E-mail : sapb@yallara.cs.rmit.edu.au
+* Copyright Simon Parkinson-Bates.
+* "source if freely avaliable to anyone to copy as long as they
+* acknowledge me in their work."
+*
+* Funtional features
+* ------------------
+* * online menu system avaliable by pressing left mouse button
+* * online cascading help system avaliable, providing information on
+* the several key strokes and what they do.
+* * animation sequence coded which makes the mech walk through an
+* environment. Shadows will soon be added to make it look
+* more realistic.
+* * menu control to view mech in wireframe or sold mode.
+* * various key strokes avaliable to control idependently the mechs
+* many joints.
+* * various key strokes avaliable to view mech and environment from
+* different angles
+* * various key strokes avaliable to alter positioning of the single
+* light source.
+*
+*
+* Program features
+* ----------------
+* * uses double buffering
+* * uses display lists
+* * uses glut to manage windows, callbacks, and online menu.
+* * uses glpolygonfill() to maintain colors in wireframe and solid
+* mode.
+*
+**/
+
+/* start of compilation conditions */
+#define SPHERE
+#define COLOR
+#define LIGHT
+#define TORSO
+#define HIP
+#define SHOULDER
+#define UPPER_ARM
+#define LOWER_ARM
+#define ROCKET_POD
+#define UPPER_LEG
+#define LOWER_LEG
+#define NO_NORM
+#define ANIMATION
+#define DRAW_MECH
+#define DRAW_ENVIRO
+#define MOVE_LIGHT
+/* end of compilation conditions */
+
+/* start various header files needed */
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#define GLUT
+#define GLUT_KEY
+#define GLUT_SPEC
+#include <GL/gl.h>
+#include <GL/glx.h>
+#include "glu.h"
+#include "ui.h"
+
+/* end of header files */
+
+/* start of display list definitions */
+#define SOLID_MECH_TORSO 1
+#define SOLID_MECH_HIP 2
+#define SOLID_MECH_SHOULDER 3
+#define SOLID_MECH_UPPER_ARM 4
+#define SOLID_MECH_FOREARM 5
+#define SOLID_MECH_UPPER_LEG 6
+#define SOLID_MECH_FOOT 7
+#define SOLID_MECH_ROCKET 8
+#define SOLID_MECH_VULCAN 9
+#define SOLID_ENVIRO 10
+/* end of display list definitions */
+
+/* start of motion rate variables */
+#define ANKLE_RATE 3
+#define HEEL_RATE 3
+#define ROTATE_RATE 10
+#define TILT_RATE 10
+#define ELBOW_RATE 2
+#define SHOULDER_RATE 5
+#define LAT_RATE 5
+#define CANNON_RATE 40
+#define UPPER_LEG_RATE 3
+#define UPPER_LEG_RATE_GROIN 10
+#define LIGHT_TURN_RATE 10
+#define VIEW_TURN_RATE 10
+/* end of motion rate variables */
+
+/* start of motion variables */
+#ifndef PI
+#define PI 3.141592654
+#endif
+
+char leg = 0;
+
+int shoulder1 = 0, shoulder2 = 0, shoulder3 = 0, shoulder4 = 0, lat1 = 20, lat2 = 20,
+ elbow1 = 0, elbow2 = 0, pivot = 0, tilt = 10, ankle1 = 0, ankle2 = 0, heel1 = 0,
+ heel2 = 0, hip11 = 0, hip12 = 10, hip21 = 0, hip22 = 10, fire = 0, solid_part = 0,
+ anim = 0, turn = 0, turn1 = 0, lightturn = 0, lightturn1 = 0;
+
+float elevation = 0.0, distance = 0.0, frame = 3.0
+ /* foot1v[] = {} foot2v[] = {} */ ;
+
+/* end of motion variables */
+
+/* start of material definitions */
+#ifdef LIGHT
+GLfloat mat_specular[] =
+{0.628281, 0.555802, 0.366065, 1.0};
+GLfloat mat_ambient[] =
+{0.24725, 0.1995, 0.0745, 1.0};
+GLfloat mat_diffuse[] =
+{0.75164, 0.60648, 0.22648, 1.0};
+GLfloat mat_shininess[] =
+{128.0 * 0.4};
+
+GLfloat mat_specular2[] =
+{0.508273, 0.508273, 0.508373, 1.0};
+GLfloat mat_ambient2[] =
+{0.19225, 0.19225, 0.19225, 1.0};
+GLfloat mat_diffuse2[] =
+{0.50754, 0.50754, 0.50754, 1.0};
+GLfloat mat_shininess2[] =
+{128.0 * 0.6};
+
+GLfloat mat_specular3[] =
+{0.296648, 0.296648, 0.296648, 1.0};
+GLfloat mat_ambient3[] =
+{0.25, 0.20725, 0.20725, 1.0};
+GLfloat mat_diffuse3[] =
+{1, 0.829, 0.829, 1.0};
+GLfloat mat_shininess3[] =
+{128.0 * 0.088};
+
+GLfloat mat_specular4[] =
+{0.633, 0.727811, 0.633, 1.0};
+GLfloat mat_ambient4[] =
+{0.0215, 0.1745, 0.0215, 1.0};
+GLfloat mat_diffuse4[] =
+{0.07568, 0.61424, 0.07568, 1.0};
+GLfloat mat_shininess4[] =
+{128 * 0.6};
+
+GLfloat mat_specular5[] =
+{0.60, 0.60, 0.50, 1.0};
+GLfloat mat_ambient5[] =
+{0.0, 0.0, 0.0, 1.0};
+GLfloat mat_diffuse5[] =
+{0.5, 0.5, 0.0, 1.0};
+GLfloat mat_shininess5[] =
+{128.0 * 0.25};
+
+#endif
+/* end of material definitions */
+
+/* start of the body motion functions */
+void
+Heel1Add(void)
+{
+ heel1 = (heel1 + HEEL_RATE) % 360;
+}
+
+void
+Heel1Subtract(void)
+{
+ heel1 = (heel1 - HEEL_RATE) % 360;
+}
+
+void
+Heel2Add(void)
+{
+ heel2 = (heel2 + HEEL_RATE) % 360;
+}
+
+void
+Heel2Subtract(void)
+{
+ heel2 = (heel2 - HEEL_RATE) % 360;
+}
+
+void
+Ankle1Add(void)
+{
+ ankle1 = (ankle1 + ANKLE_RATE) % 360;
+}
+
+void
+Ankle1Subtract(void)
+{
+ ankle1 = (ankle1 - ANKLE_RATE) % 360;
+}
+
+void
+Ankle2Add(void)
+{
+ ankle2 = (ankle2 + ANKLE_RATE) % 360;
+}
+
+void
+Ankle2Subtract(void)
+{
+ ankle2 = (ankle2 - ANKLE_RATE) % 360;
+}
+
+void
+RotateAdd(void)
+{
+ pivot = (pivot + ROTATE_RATE) % 360;
+}
+
+void
+RotateSubtract(void)
+{
+ pivot = (pivot - ROTATE_RATE) % 360;
+}
+
+void
+MechTiltSubtract(void)
+{
+ tilt = (tilt - TILT_RATE) % 360;
+}
+
+void
+MechTiltAdd(void)
+{
+ tilt = (tilt + TILT_RATE) % 360;
+}
+
+void
+elbow1Add(void)
+{
+ elbow1 = (elbow1 + ELBOW_RATE) % 360;
+}
+
+void
+elbow1Subtract(void)
+{
+ elbow1 = (elbow1 - ELBOW_RATE) % 360;
+}
+
+void
+elbow2Add(void)
+{
+ elbow2 = (elbow2 + ELBOW_RATE) % 360;
+}
+
+void
+elbow2Subtract(void)
+{
+ elbow2 = (elbow2 - ELBOW_RATE) % 360;
+}
+
+void
+shoulder1Add(void)
+{
+ shoulder1 = (shoulder1 + SHOULDER_RATE) % 360;
+}
+
+void
+shoulder1Subtract(void)
+{
+ shoulder1 = (shoulder1 - SHOULDER_RATE) % 360;
+}
+
+void
+shoulder2Add(void)
+{
+ shoulder2 = (shoulder2 + SHOULDER_RATE) % 360;
+}
+
+void
+shoulder2Subtract(void)
+{
+ shoulder2 = (shoulder2 - SHOULDER_RATE) % 360;
+}
+
+void
+shoulder3Add(void)
+{
+ shoulder3 = (shoulder3 + SHOULDER_RATE) % 360;
+}
+
+void
+shoulder3Subtract(void)
+{
+ shoulder3 = (shoulder3 - SHOULDER_RATE) % 360;
+}
+
+void
+shoulder4Add(void)
+{
+ shoulder4 = (shoulder4 + SHOULDER_RATE) % 360;
+}
+
+void
+shoulder4Subtract(void)
+{
+ shoulder4 = (shoulder4 - SHOULDER_RATE) % 360;
+}
+
+void
+lat1Raise(void)
+{
+ lat1 = (lat1 + LAT_RATE) % 360;
+}
+
+void
+lat1Lower(void)
+{
+ lat1 = (lat1 - LAT_RATE) % 360;
+}
+
+void
+lat2Raise(void)
+{
+ lat2 = (lat2 + LAT_RATE) % 360;
+}
+
+void
+lat2Lower(void)
+{
+ lat2 = (lat2 - LAT_RATE) % 360;
+}
+
+void
+FireCannon(void)
+{
+ fire = (fire + CANNON_RATE) % 360;
+}
+
+void
+RaiseLeg1Forward(void)
+{
+ hip11 = (hip11 + UPPER_LEG_RATE) % 360;
+}
+
+void
+LowerLeg1Backwards(void)
+{
+ hip11 = (hip11 - UPPER_LEG_RATE) % 360;
+}
+
+void
+RaiseLeg1Outwards(void)
+{
+ hip12 = (hip12 + UPPER_LEG_RATE_GROIN) % 360;
+}
+
+void
+LowerLeg1Inwards(void)
+{
+ hip12 = (hip12 - UPPER_LEG_RATE_GROIN) % 360;
+}
+
+void
+RaiseLeg2Forward(void)
+{
+ hip21 = (hip21 + UPPER_LEG_RATE) % 360;
+}
+
+void
+LowerLeg2Backwards(void)
+{
+ hip21 = (hip21 - UPPER_LEG_RATE) % 360;
+}
+
+void
+RaiseLeg2Outwards(void)
+{
+ hip22 = (hip22 + UPPER_LEG_RATE_GROIN) % 360;
+}
+
+void
+LowerLeg2Inwards(void)
+{
+ hip22 = (hip22 - UPPER_LEG_RATE_GROIN) % 360;
+}
+
+/* end of body motion functions */
+
+/* start of light source position functions */
+void
+TurnRight(void)
+{
+ turn = (turn - VIEW_TURN_RATE) % 360;
+}
+
+void
+TurnLeft(void)
+{
+ turn = (turn + VIEW_TURN_RATE) % 360;
+}
+
+void
+TurnForwards(void)
+{
+ turn1 = (turn1 - VIEW_TURN_RATE) % 360;
+}
+
+void
+TurnBackwards(void)
+{
+ turn1 = (turn1 + VIEW_TURN_RATE) % 360;
+}
+
+void
+LightTurnRight(void)
+{
+ lightturn = (lightturn + LIGHT_TURN_RATE) % 360;
+}
+
+void
+LightTurnLeft(void)
+{
+ lightturn = (lightturn - LIGHT_TURN_RATE) % 360;
+}
+
+void
+LightForwards(void)
+{
+ lightturn1 = (lightturn1 + LIGHT_TURN_RATE) % 360;
+}
+
+void
+LightBackwards(void)
+{
+ lightturn1 = (lightturn1 - LIGHT_TURN_RATE) % 360;
+}
+
+/* end of light source position functions */
+
+/* start of geometric shape functions */
+void
+Box(float width, float height, float depth, char solid)
+{
+ char i, j = 0;
+ float x = width / 2.0, y = height / 2.0, z = depth / 2.0;
+
+ for (i = 0; i < 4; i++) {
+ glRotatef(90.0, 0.0, 0.0, 1.0);
+ if (j) {
+ if (!solid)
+ glBegin(GL_LINE_LOOP);
+ else
+ glBegin(GL_QUADS);
+ glNormal3f(-1.0, 0.0, 0.0);
+ glVertex3f(-x, y, z);
+ glVertex3f(-x, -y, z);
+ glVertex3f(-x, -y, -z);
+ glVertex3f(-x, y, -z);
+ glEnd();
+ if (solid) {
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.0, 0.0, 1.0);
+ glVertex3f(0.0, 0.0, z);
+ glVertex3f(-x, y, z);
+ glVertex3f(-x, -y, z);
+ glNormal3f(0.0, 0.0, -1.0);
+ glVertex3f(0.0, 0.0, -z);
+ glVertex3f(-x, -y, -z);
+ glVertex3f(-x, y, -z);
+ glEnd();
+ }
+ j = 0;
+ } else {
+ if (!solid)
+ glBegin(GL_LINE_LOOP);
+ else
+ glBegin(GL_QUADS);
+ glNormal3f(-1.0, 0.0, 0.0);
+ glVertex3f(-y, x, z);
+ glVertex3f(-y, -x, z);
+ glVertex3f(-y, -x, -z);
+ glVertex3f(-y, x, -z);
+ glEnd();
+ if (solid) {
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.0, 0.0, 1.0);
+ glVertex3f(0.0, 0.0, z);
+ glVertex3f(-y, x, z);
+ glVertex3f(-y, -x, z);
+ glNormal3f(0.0, 0.0, -1.0);
+ glVertex3f(0.0, 0.0, -z);
+ glVertex3f(-y, -x, -z);
+ glVertex3f(-y, x, -z);
+ glEnd();
+ }
+ j = 1;
+ }
+ }
+}
+
+void
+Octagon(float side, float height, char solid)
+{
+ char j;
+ float x = sin(0.785398163) * side, y = side / 2.0, z = height / 2.0, c;
+
+ c = x + y;
+ for (j = 0; j < 8; j++) {
+ glTranslatef(-c, 0.0, 0.0);
+ if (!solid)
+ glBegin(GL_LINE_LOOP);
+ else
+ glBegin(GL_QUADS);
+ glNormal3f(-1.0, 0.0, 0.0);
+ glVertex3f(0.0, -y, z);
+ glVertex3f(0.0, y, z);
+ glVertex3f(0.0, y, -z);
+ glVertex3f(0.0, -y, -z);
+ glEnd();
+ glTranslatef(c, 0.0, 0.0);
+ if (solid) {
+ glBegin(GL_TRIANGLES);
+ glNormal3f(0.0, 0.0, 1.0);
+ glVertex3f(0.0, 0.0, z);
+ glVertex3f(-c, -y, z);
+ glVertex3f(-c, y, z);
+ glNormal3f(0.0, 0.0, -1.0);
+ glVertex3f(0.0, 0.0, -z);
+ glVertex3f(-c, y, -z);
+ glVertex3f(-c, -y, -z);
+ glEnd();
+ }
+ glRotatef(45.0, 0.0, 0.0, 1.0);
+ }
+}
+
+/* end of geometric shape functions */
+#ifdef NORM
+void
+Normalize(float v[3])
+{
+ GLfloat d = sqrt(v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
+
+ if (d == 0.0) {
+ printf("zero length vector");
+ return;
+ }
+ v[1] /= d;
+ v[2] /= d;
+ v[3] /= d;
+}
+
+void
+NormXprod(float v1[3], float v2[3], float v[3], float out[3])
+{
+ GLint i, j;
+ GLfloat length;
+
+ out[0] = v1[1] * v2[2] - v1[2] * v2[1];
+ out[1] = v1[2] * v2[0] - v1[0] * v2[2];
+ out[2] = v1[0] * v2[1] - v1[1] * v2[0];
+ Normalize(out);
+}
+
+#endif
+
+void
+SetMaterial(GLfloat spec[], GLfloat amb[], GLfloat diff[], GLfloat shin[])
+{
+
+ glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+ glMaterialfv(GL_FRONT, GL_SHININESS, shin);
+ glMaterialfv(GL_FRONT, GL_AMBIENT, amb);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, diff);
+}
+
+void
+MechTorso(char solid)
+{
+ glNewList(SOLID_MECH_TORSO, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Box(1.0, 1.0, 3.0, solid);
+ glTranslatef(0.75, 0.0, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+ Box(0.5, 0.6, 2.0, solid);
+ glTranslatef(-1.5, 0.0, 0.0);
+ Box(0.5, 0.6, 2.0, solid);
+ glTranslatef(0.75, 0.0, 0.0);
+ glEndList();
+}
+
+void
+MechHip(char solid)
+{
+ int i;
+ GLUquadricObj *hip[2];
+
+ glNewList(SOLID_MECH_HIP, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Octagon(0.7, 0.5, solid);
+#ifdef SPHERE
+ for (i = 0; i < 2; i++) {
+ if (i)
+ glScalef(-1.0, 1.0, 1.0);
+ glTranslatef(1.0, 0.0, 0.0);
+ hip[i] = gluNewQuadric();
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+ if (!solid)
+ gluQuadricDrawStyle(hip[i], GLU_LINE);
+ gluSphere(hip[0], 0.2, 16, 16);
+ glTranslatef(-1.0, 0.0, 0.0);
+ }
+ glScalef(-1.0, 1.0, 1.0);
+#endif
+ glEndList();
+}
+
+void
+Shoulder(char solid)
+{
+ GLUquadricObj *deltoid = gluNewQuadric();
+
+ glNewList(SOLID_MECH_SHOULDER, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Box(1.0, 0.5, 0.5, solid);
+ glTranslatef(0.9, 0.0, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+#ifdef SPHERE
+ if (!solid)
+ gluQuadricDrawStyle(deltoid, GLU_LINE);
+ gluSphere(deltoid, 0.6, 16, 16);
+#endif
+ glTranslatef(-0.9, 0.0, 0.0);
+ glEndList();
+}
+
+void
+UpperArm(char solid)
+{
+ GLUquadricObj *upper = gluNewQuadric();
+ GLUquadricObj *joint[2];
+ GLUquadricObj *joint1[2];
+ int i;
+
+ glNewList(SOLID_MECH_UPPER_ARM, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Box(1.0, 2.0, 1.0, solid);
+ glTranslatef(0.0, -0.95, 0.0);
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+ if (!solid)
+ gluQuadricDrawStyle(upper, GLU_LINE);
+ gluCylinder(upper, 0.4, 0.4, 1.5, 16, 10);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ glRotatef(-90.0, 1.0, 0.0, 0.0);
+ glTranslatef(-0.4, -1.85, 0.0);
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ for (i = 0; i < 2; i++) {
+ joint[i] = gluNewQuadric();
+ if (!solid)
+ gluQuadricDrawStyle(joint[i], GLU_LINE);
+ if (i)
+ gluCylinder(joint[i], 0.5, 0.5, 0.8, 16, 10);
+ else
+ gluCylinder(joint[i], 0.2, 0.2, 0.8, 16, 10);
+ }
+ for (i = 0; i < 2; i++) {
+ if (i)
+ glScalef(-1.0, 1.0, 1.0);
+ joint1[i] = gluNewQuadric();
+ if (!solid)
+ gluQuadricDrawStyle(joint1[i], GLU_LINE);
+ if (i)
+ glTranslatef(0.0, 0.0, 0.8);
+ gluDisk(joint1[i], 0.2, 0.5, 16, 10);
+ if (i)
+ glTranslatef(0.0, 0.0, -0.8);
+ }
+ glScalef(-1.0, 1.0, 1.0);
+ glRotatef(-90.0, 0.0, 1.0, 0.0);
+ glTranslatef(0.4, 2.9, 0.0);
+ glEndList();
+}
+
+void
+VulcanGun(char solid)
+{
+ int i;
+ GLUquadricObj *Barrel[5];
+ GLUquadricObj *BarrelFace[5];
+ GLUquadricObj *Barrel2[5];
+ GLUquadricObj *Barrel3[5];
+ GLUquadricObj *BarrelFace2[5];
+ GLUquadricObj *Mount = gluNewQuadric();
+ GLUquadricObj *Mount_face = gluNewQuadric();
+
+ glNewList(SOLID_MECH_VULCAN, GL_COMPILE);
+
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+
+ if (!solid) {
+ gluQuadricDrawStyle(Mount, GLU_LINE);
+ gluQuadricDrawStyle(Mount_face, GLU_LINE);
+ }
+ gluCylinder(Mount, 0.5, 0.5, 0.5, 16, 10);
+ glTranslatef(0.0, 0.0, 0.5);
+ gluDisk(Mount_face, 0.0, 0.5, 16, 10);
+
+ for (i = 0; i < 5; i++) {
+ Barrel[i] = gluNewQuadric();
+ BarrelFace[i] = gluNewQuadric();
+ BarrelFace2[i] = gluNewQuadric();
+ Barrel2[i] = gluNewQuadric();
+ Barrel3[i] = gluNewQuadric();
+ glRotatef(72.0, 0.0, 0.0, 1.0);
+ glTranslatef(0.0, 0.3, 0.0);
+ if (!solid) {
+ gluQuadricDrawStyle(Barrel[i], GLU_LINE);
+ gluQuadricDrawStyle(BarrelFace[i], GLU_LINE);
+ gluQuadricDrawStyle(BarrelFace2[i], GLU_LINE);
+ gluQuadricDrawStyle(Barrel2[i], GLU_LINE);
+ gluQuadricDrawStyle(Barrel3[i], GLU_LINE);
+ }
+ gluCylinder(Barrel[i], 0.15, 0.15, 2.0, 16, 10);
+ gluCylinder(Barrel3[i], 0.06, 0.06, 2.0, 16, 10);
+ glTranslatef(0.0, 0.0, 2.0);
+ gluDisk(BarrelFace[i], 0.1, 0.15, 16, 10);
+ gluCylinder(Barrel2[i], 0.1, 0.1, 0.1, 16, 5);
+ glTranslatef(0.0, 0.0, 0.1);
+ gluDisk(BarrelFace2[i], 0.06, 0.1, 16, 5);
+ glTranslatef(0.0, -0.3, -2.1);
+ }
+ glEndList();
+}
+
+void
+ForeArm(char solid)
+{
+ char i;
+
+ glNewList(SOLID_MECH_FOREARM, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ for (i = 0; i < 5; i++) {
+ glTranslatef(0.0, -0.1, -0.15);
+ Box(0.6, 0.8, 0.2, solid);
+ glTranslatef(0.0, 0.1, -0.15);
+ Box(0.4, 0.6, 0.1, solid);
+ }
+ glTranslatef(0.0, 0.0, 2.45);
+ Box(1.0, 1.0, 2.0, solid);
+ glTranslatef(0.0, 0.0, -1.0);
+ glEndList();
+}
+
+void
+UpperLeg(char solid)
+{
+ int i;
+ GLUquadricObj *Hamstring = gluNewQuadric();
+ GLUquadricObj *Knee = gluNewQuadric();
+ GLUquadricObj *joint[2];
+
+ glNewList(SOLID_MECH_UPPER_LEG, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ if (!solid) {
+ gluQuadricDrawStyle(Hamstring, GLU_LINE);
+ gluQuadricDrawStyle(Knee, GLU_LINE);
+ }
+ glTranslatef(0.0, -1.0, 0.0);
+ Box(0.4, 1.0, 0.7, solid);
+ glTranslatef(0.0, -0.65, 0.0);
+ for (i = 0; i < 5; i++) {
+ Box(1.2, 0.3, 1.2, solid);
+ glTranslatef(0.0, -0.2, 0.0);
+ Box(1.0, 0.1, 1.0, solid);
+ glTranslatef(0.0, -0.2, 0.0);
+ }
+ glTranslatef(0.0, -0.15, -0.4);
+ Box(2.0, 0.5, 2.0, solid);
+ glTranslatef(0.0, -0.3, -0.2);
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+ gluCylinder(Hamstring, 0.6, 0.6, 3.0, 16, 10);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ glRotatef(-90.0, 1.0, 0.0, 0.0);
+ glTranslatef(0.0, -1.5, 1.0);
+ Box(1.5, 3.0, 0.5, solid);
+ glTranslatef(0.0, -1.75, -0.8);
+ Box(2.0, 0.5, 2.0, solid);
+ glTranslatef(0.0, -0.9, -0.85);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+ gluCylinder(Knee, 0.8, 0.8, 1.8, 16, 10);
+ for (i = 0; i < 2; i++) {
+ if (i)
+ glScalef(-1.0, 1.0, 1.0);
+ joint[i] = gluNewQuadric();
+ if (!solid)
+ gluQuadricDrawStyle(joint[i], GLU_LINE);
+ if (i)
+ glTranslatef(0.0, 0.0, 1.8);
+ gluDisk(joint[i], 0.0, 0.8, 16, 10);
+ if (i)
+ glTranslatef(0.0, 0.0, -1.8);
+ }
+ glScalef(-1.0, 1.0, 1.0);
+ glEndList();
+}
+
+void
+Foot(char solid)
+{
+
+ glNewList(SOLID_MECH_FOOT, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+ Octagon(1.5, 0.6, solid);
+ glRotatef(-90.0, 1.0, 0.0, 0.0);
+ glEndList();
+}
+
+void
+LowerLeg(char solid)
+{
+ float k, l;
+ GLUquadricObj *ankle = gluNewQuadric();
+ GLUquadricObj *ankle_face[2],*joints;
+
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ for (k = 0.0; k < 2.0; k++) {
+ for (l = 0.0; l < 2.0; l++) {
+ glPushMatrix();
+ glTranslatef(k, 0.0, l);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Box(1.0, 0.5, 1.0, solid);
+ glTranslatef(0.0, -0.45, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+#ifdef SPHERE
+ joints = gluNewQuadric();
+ if(!solid)gluQuadricDrawStyle(joints, GLU_LINE);
+ gluSphere(joints,0.2, 16, 16);
+ free(joints);
+#endif
+ if (leg)
+ glRotatef((GLfloat) heel1, 1.0, 0.0, 0.0);
+ else
+ glRotatef((GLfloat) heel2, 1.0, 0.0, 0.0);
+ /* glTranslatef(0.0, -0.2, 0.0); */
+ glTranslatef(0.0, -1.7, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Box(0.25, 3.0, 0.25, solid);
+ glTranslatef(0.0, -1.7, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+#ifdef SPHERE
+ joints = gluNewQuadric();
+ if(!solid)gluQuadricDrawStyle(joints, GLU_LINE);
+ gluSphere(joints, 0.2, 16, 16);
+#endif
+ if (leg)
+ glRotatef((GLfloat) - heel1, 1.0, 0.0, 0.0);
+ else
+ glRotatef((GLfloat) - heel2, 1.0, 0.0, 0.0);
+ glTranslatef(0.0, -0.45, 0.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Box(1.0, 0.5, 1.0, solid);
+ if (!k && !l) {
+ int j;
+
+ glTranslatef(-0.4, -0.8, 0.5);
+ if (leg)
+ glRotatef((GLfloat) ankle1, 1.0, 0.0, 0.0);
+ else
+ glRotatef((GLfloat) ankle2, 1.0, 0.0, 0.0);
+ glRotatef(90.0, 0.0, 1.0, 0.0);
+ if (!solid)
+ gluQuadricDrawStyle(ankle, GLU_LINE);
+ gluCylinder(ankle, 0.8, 0.8, 1.8, 16, 10);
+ for (j = 0; j < 2; j++) {
+ ankle_face[j] = gluNewQuadric();
+ if (!solid)
+ gluQuadricDrawStyle(ankle_face[j], GLU_LINE);
+ if (j) {
+ glScalef(-1.0, 1.0, 1.0);
+ glTranslatef(0.0, 0.0, 1.8);
+ }
+ gluDisk(ankle_face[j], 0.0, 0.8, 16, 10);
+ if (j)
+ glTranslatef(0.0, 0.0, -1.8);
+ }
+ glScalef(-1.0, 1.0, 1.0);
+ glRotatef(-90.0, 0.0, 1.0, 0.0);
+ glTranslatef(0.95, -0.8, 0.0);
+ glCallList(SOLID_MECH_FOOT);
+ }
+ glPopMatrix();
+ }
+ }
+}
+
+void
+RocketPod(char solid)
+{
+
+ int i, j, k = 0;
+ GLUquadricObj *rocket[6];
+ GLUquadricObj *rocket1[6];
+
+ glNewList(SOLID_MECH_ROCKET, GL_COMPILE);
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glColor3f(0.5, 0.5, 0.5);
+ glScalef(0.4, 0.4, 0.4);
+ glRotatef(45.0, 0.0, 0.0, 1.0);
+ glTranslatef(1.0, 0.0, 0.0);
+ Box(2.0, 0.5, 3.0, solid);
+ glTranslatef(1.0, 0.0, 0.0);
+ glRotatef(45.0, 0.0, 0.0, 1.0);
+ glTranslatef(0.5, 0.0, 0.0);
+ Box(1.2, 0.5, 3.0, solid);
+ glTranslatef(2.1, 0.0, 0.0);
+ glRotatef(-90.0, 0.0, 0.0, 1.0);
+#ifdef LIGHT
+ SetMaterial(mat_specular, mat_ambient, mat_diffuse, mat_shininess);
+#endif
+ glColor3f(1.0, 1.0, 0.0);
+ Box(2.0, 3.0, 4.0, solid);
+ glTranslatef(-0.5, -1.0, 1.3);
+ for (i = 0; i < 2; i++) {
+ for (j = 0; j < 3; j++) {
+ rocket[k] = gluNewQuadric();
+ rocket1[k] = gluNewQuadric();
+ if (!solid) {
+ gluQuadricDrawStyle(rocket[k], GLU_LINE);
+ gluQuadricDrawStyle(rocket1[k], GLU_LINE);
+ }
+ glTranslatef(i, j, 0.6);
+#ifdef LIGHT
+ SetMaterial(mat_specular3, mat_ambient3, mat_diffuse3, mat_shininess3);
+#endif
+ glColor3f(1.0, 1.0, 1.0);
+ gluCylinder(rocket[k], 0.4, 0.4, 0.3, 16, 10);
+ glTranslatef(0.0, 0.0, 0.3);
+#ifdef LIGHT
+ SetMaterial(mat_specular4, mat_ambient4, mat_diffuse4, mat_shininess4);
+#endif
+ glColor3f(0.0, 1.0, 0.0);
+ gluCylinder(rocket1[k], 0.4, 0.0, 0.5, 16, 10);
+ k++;
+ glTranslatef(-i, -j, -0.9);
+ }
+ }
+ glEndList();
+}
+
+void
+Enviro(char solid)
+{
+
+ int i, j;
+
+ glNewList(SOLID_ENVIRO, GL_COMPILE);
+ SetMaterial(mat_specular4, mat_ambient4, mat_diffuse4, mat_shininess4);
+ glColor3f(0.0, 1.0, 0.0);
+ Box(20.0, 0.5, 30.0, solid);
+
+ SetMaterial(mat_specular4, mat_ambient3, mat_diffuse2, mat_shininess);
+ glColor3f(0.6, 0.6, 0.6);
+ glTranslatef(0.0, 0.0, -10.0);
+ for (j = 0; j < 6; j++) {
+ for (i = 0; i < 2; i++) {
+ if (i)
+ glScalef(-1.0, 1.0, 1.0);
+ glTranslatef(10.0, 4.0, 0.0);
+ Box(4.0, 8.0, 2.0, solid);
+ glTranslatef(0.0, -1.0, -3.0);
+ Box(4.0, 6.0, 2.0, solid);
+ glTranslatef(-10.0, -3.0, 3.0);
+ }
+ glScalef(-1.0, 1.0, 1.0);
+ glTranslatef(0.0, 0.0, 5.0);
+ }
+
+ glEndList();
+}
+
+void
+Toggle(void)
+{
+ if (solid_part)
+ solid_part = 0;
+ else
+ solid_part = 1;
+}
+
+void
+disable(void)
+{
+ glDisable(GL_LIGHTING);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_NORMALIZE);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+}
+
+void
+lighting(void)
+{
+
+ GLfloat position[] =
+ {0.0, 0.0, 2.0, 1.0};
+
+#ifdef MOVE_LIGHT
+ glRotatef((GLfloat) lightturn1, 1.0, 0.0, 0.0);
+ glRotatef((GLfloat) lightturn, 0.0, 1.0, 0.0);
+ glRotatef(0.0, 1.0, 0.0, 0.0);
+#endif
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_NORMALIZE);
+ /* glEnable(GL_FLAT); */
+ /* glDepthFunc(GL_LESS); */
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 80.0);
+
+ glTranslatef(0.0, 0.0, 2.0);
+ glDisable(GL_LIGHTING);
+ Box(0.1, 0.1, 0.1, 0);
+ glEnable(GL_LIGHTING);
+ /* glEnable(GL_CULL_FACE); */
+}
+
+void
+DrawMech(void)
+{
+ int i, j;
+
+ glScalef(0.5, 0.5, 0.5);
+ glPushMatrix();
+ glTranslatef(0.0, -0.75, 0.0);
+ glRotatef((GLfloat) tilt, 1.0, 0.0, 0.0);
+
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+#ifdef HIP
+ glCallList(SOLID_MECH_HIP);
+#endif
+ glRotatef(-90.0, 1.0, 0.0, 0.0);
+
+ glTranslatef(0.0, 0.75, 0.0);
+ glPushMatrix();
+ glRotatef((GLfloat) pivot, 0.0, 1.0, 0.0);
+ glPushMatrix();
+#ifdef TORSO
+ glCallList(SOLID_MECH_TORSO);
+#endif
+ glPopMatrix();
+ glPushMatrix();
+ glTranslatef(0.5, 0.5, 0.0);
+#ifdef ROCKET_POD
+ glCallList(SOLID_MECH_ROCKET);
+#endif
+ glPopMatrix();
+ for (i = 0; i < 2; i++) {
+ glPushMatrix();
+ if (i)
+ glScalef(-1.0, 1.0, 1.0);
+ glTranslatef(1.5, 0.0, 0.0);
+#ifdef SHOULDER
+ glCallList(SOLID_MECH_SHOULDER);
+#endif
+ glTranslatef(0.9, 0.0, 0.0);
+ if (i) {
+ glRotatef((GLfloat) lat1, 0.0, 0.0, 1.0);
+ glRotatef((GLfloat) shoulder1, 1.0, 0.0, 0.0);
+ glRotatef((GLfloat) shoulder3, 0.0, 1.0, 0.0);
+ } else {
+ glRotatef((GLfloat) lat2, 0.0, 0.0, 1.0);
+ glRotatef((GLfloat) shoulder2, 1.0, 0.0, 0.0);
+ glRotatef((GLfloat) shoulder4, 0.0, 1.0, 0.0);
+ }
+ glTranslatef(0.0, -1.4, 0.0);
+#ifdef UPPER_ARM
+ glCallList(SOLID_MECH_UPPER_ARM);
+#endif
+ glTranslatef(0.0, -2.9, 0.0);
+ if (i)
+ glRotatef((GLfloat) elbow1, 1.0, 0.0, 0.0);
+ else
+ glRotatef((GLfloat) elbow2, 1.0, 0.0, 0.0);
+ glTranslatef(0.0, -0.9, -0.2);
+#ifdef LOWER_ARM
+ glCallList(SOLID_MECH_FOREARM);
+ glPushMatrix();
+ glTranslatef(0.0, 0.0, 2.0);
+ glRotatef((GLfloat) fire, 0.0, 0.0, 1.0);
+ glCallList(SOLID_MECH_VULCAN);
+ glPopMatrix();
+#endif
+ glPopMatrix();
+ }
+ glPopMatrix();
+
+ glPopMatrix();
+
+ for (j = 0; j < 2; j++) {
+ glPushMatrix();
+ if (j) {
+ glScalef(-0.5, 0.5, 0.5);
+ leg = 1;
+ } else {
+ glScalef(0.5, 0.5, 0.5);
+ leg = 0;
+ }
+ glTranslatef(2.0, -1.5, 0.0);
+ if (j) {
+ glRotatef((GLfloat) hip11, 1.0, 0.0, 0.0);
+ glRotatef((GLfloat) hip12, 0.0, 0.0, 1.0);
+ } else {
+ glRotatef((GLfloat) hip21, 1.0, 0.0, 0.0);
+ glRotatef((GLfloat) hip22, 0.0, 0.0, 1.0);
+ }
+ glTranslatef(0.0, 0.3, 0.0);
+#ifdef UPPER_LEG
+ glPushMatrix();
+ glCallList(SOLID_MECH_UPPER_LEG);
+ glPopMatrix();
+#endif
+ glTranslatef(0.0, -8.3, -0.4);
+ if (j)
+ glRotatef((GLfloat) - hip12, 0.0, 0.0, 1.0);
+ else
+ glRotatef((GLfloat) - hip22, 0.0, 0.0, 1.0);
+ glTranslatef(-0.5, -0.85, -0.5);
+#ifdef LOWER_LEG
+ LowerLeg(1);
+#endif
+ glPopMatrix();
+ }
+}
+
+void
+display(void)
+{
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_DEPTH_TEST);
+
+ glPushMatrix();
+ glRotatef((GLfloat) turn, 0.0, 1.0, 0.0);
+ glRotatef((GLfloat) turn1, 1.0, 0.0, 0.0);
+#ifdef LIGHT
+ if (solid_part) {
+ glPushMatrix();
+ lighting();
+ glPopMatrix();
+ } else
+ disable();
+#endif
+#ifdef DRAW_MECH
+ glPushMatrix();
+ glTranslatef(0.0, elevation, 0.0);
+ DrawMech();
+ glPopMatrix();
+#endif
+#ifdef DRAW_ENVIRO
+ glPushMatrix();
+ if (distance >= 20.136)
+ distance = 0.0;
+ glTranslatef(0.0, -5.0, -distance);
+ glCallList(SOLID_ENVIRO);
+ glTranslatef(0.0, 0.0, 10.0);
+ glCallList(SOLID_ENVIRO);
+ glPopMatrix();
+#endif
+ glPopMatrix();
+ glFlush();
+ tkSwapBuffers();
+}
+
+void
+init(void)
+{
+ char i = 1;
+
+#ifdef LIGHT
+ SetMaterial(mat_specular2, mat_ambient2, mat_diffuse2, mat_shininess2);
+#endif
+ glEnable(GL_DEPTH_TEST);
+ MechTorso(i);
+ MechHip(i);
+ Shoulder(i);
+ RocketPod(i);
+ UpperArm(i);
+ ForeArm(i);
+ UpperLeg(i);
+ Foot(i);
+ VulcanGun(i);
+ Enviro(i);
+}
+
+void
+reshape(int w, int h)
+{
+ glViewport(0, 0, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 1.0, 20.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 1.2, -5.5); /* viewing transform */
+}
+
+#ifdef ANIMATION
+void
+animation_walk(void)
+{
+ float angle;
+ static int step;
+
+ if (step == 0 || step == 2) {
+ /* for(frame=3.0; frame<=21.0; frame=frame+3.0){ */
+ if (frame >= 0.0 && frame <= 21.0) {
+ if (frame == 0.0)
+ frame = 3.0;
+ angle = (180 / PI) * (acos(((cos((PI / 180) * frame) * 2.043) + 1.1625) / 3.2059));
+ if (frame > 0) {
+ elevation = -(3.2055 - (cos((PI / 180) * angle) * 3.2055));
+ } else
+ elevation = 0.0;
+ if (step == 0) {
+ hip11 = -(frame * 1.7);
+ if (1.7 * frame > 15)
+ heel1 = frame * 1.7;
+ heel2 = 0;
+ ankle1 = frame * 1.7;
+ if (frame > 0)
+ hip21 = angle;
+ else
+ hip21 = 0;
+ ankle2 = -hip21;
+ shoulder1 = frame * 1.5;
+ shoulder2 = -frame * 1.5;
+ elbow1 = frame;
+ elbow2 = -frame;
+ } else {
+ hip21 = -(frame * 1.7);
+ if (1.7 * frame > 15)
+ heel2 = frame * 1.7;
+ heel1 = 0;
+ ankle2 = frame * 1.7;
+ if (frame > 0)
+ hip11 = angle;
+ else
+ hip11 = 0;
+ ankle1 = -hip11;
+ shoulder1 = -frame * 1.5;
+ shoulder2 = frame * 1.5;
+ elbow1 = -frame;
+ elbow2 = frame;
+ }
+ if (frame == 21)
+ step++;
+ if (frame < 21)
+ frame = frame + 3.0;
+ }
+ }
+ if (step == 1 || step == 3) {
+ /* for(x=21.0; x>=0.0; x=x-3.0){ */
+ if (frame <= 21.0 && frame >= 0.0) {
+ angle = (180 / PI) * (acos(((cos((PI / 180) * frame) * 2.043) + 1.1625) / 3.2029));
+ if (frame > 0)
+ elevation = -(3.2055 - (cos((PI / 180) * angle) * 3.2055));
+ else
+ elevation = 0.0;
+ if (step == 1) {
+ elbow2 = hip11 = -frame;
+ elbow1 = heel1 = frame;
+ heel2 = 15;
+ ankle1 = frame;
+ if (frame > 0)
+ hip21 = angle;
+ else
+ hip21 = 0;
+ ankle2 = -hip21;
+ shoulder1 = 1.5 * frame;
+ shoulder2 = -frame * 1.5;
+ } else {
+ elbow1 = hip21 = -frame;
+ elbow2 = heel2 = frame;
+ heel1 = 15;
+ ankle2 = frame;
+ if (frame > 0)
+ hip11 = angle;
+ else
+ hip11 = 0;
+ ankle1 = -hip11;
+ shoulder1 = -frame * 1.5;
+ shoulder2 = frame * 1.5;
+ }
+ if (frame == 0.0)
+ step++;
+ if (frame > 0)
+ frame = frame - 3.0;
+ }
+ }
+ if (step == 4)
+ step = 0;
+ distance += 0.1678;
+}
+
+void
+animation(void)
+{
+ animation_walk();
+}
+
+#endif
+
+GLenum key(int key, GLenum mask)
+{
+
+ int i = 0;
+
+ switch (key) {
+ /* start arm control functions */
+ case 'q':{
+ shoulder2Subtract();
+ i++;
+ }
+ break;
+ case 'a':{
+ shoulder2Add();
+ i++;
+ }
+ break;
+ case 'w':{
+ shoulder1Subtract();
+ i++;
+ }
+ break;
+ case 's':{
+ shoulder1Add();
+ i++;
+ }
+ break;
+ case '2':{
+ shoulder3Add();
+ i++;
+ }
+ break;
+ case '1':{
+ shoulder4Add();
+ i++;
+ }
+ break;
+ case '4':{
+ shoulder3Subtract();
+ i++;
+ }
+ break;
+ case '3':{
+ shoulder4Subtract();
+ i++;
+ }
+ break;
+
+ case 'z':{
+ lat2Raise();
+ i++;
+ }
+ break;
+ case 'Z':{
+ lat2Lower();
+ i++;
+ }
+ break;
+ case 'x':{
+ lat1Raise();
+ i++;
+ }
+ break;
+ case 'X':{
+ lat1Lower();
+ i++;
+ }
+ break;
+
+ case 'A':{
+ elbow2Add();
+ i++;
+ }
+ break;
+ case 'Q':{
+ elbow2Subtract();
+ i++;
+ }
+ break;
+ case 'S':{
+ elbow1Add();
+ i++;
+ }
+ break;
+ case 'W':{
+ elbow1Subtract();
+ i++;
+ }
+ break;
+ /* end of arm control functions */
+
+ /* start of torso control functions */
+ case 'd':{
+ RotateAdd();
+ i++;
+ }
+ break;
+ case 'g':{
+ RotateSubtract();
+ i++;
+ }
+ break;
+ case 'r':{
+ MechTiltAdd();
+ i++;
+ }
+ break;
+ case 'f':{
+ MechTiltSubtract();
+ i++;
+ }
+ break;
+ /* end of torso control functions */
+
+ /* start of leg control functions */
+ case 'h':{
+ RaiseLeg2Forward();
+ i++;
+ }
+ break;
+ case 'y':{
+ LowerLeg2Backwards();
+ i++;
+ }
+ break;
+ case 'Y':{
+ RaiseLeg2Outwards();
+ i++;
+ }
+ break;
+ case 'H':{
+ LowerLeg2Inwards();
+ i++;
+ }
+ break;
+
+ case 'j':{
+ RaiseLeg1Forward();
+ i++;
+ }
+ break;
+ case 'u':{
+ LowerLeg1Backwards();
+ i++;
+ }
+ break;
+ case 'U':{
+ RaiseLeg1Outwards();
+ i++;
+ }
+ break;
+ case 'J':{
+ LowerLeg1Inwards();
+ i++;
+ }
+ break;
+
+ case 'N':{
+ Heel2Add();
+ i++;
+ }
+ break;
+ case 'n':{
+ Heel2Subtract();
+ i++;
+ }
+ break;
+ case 'M':{
+ Heel1Add();
+ i++;
+ }
+ break;
+ case 'm':{
+ Heel1Subtract();
+ i++;
+ }
+ break;
+
+ case 'k':{
+ Ankle2Add();
+ i++;
+ }
+ break;
+ case 'K':{
+ Ankle2Subtract();
+ i++;
+ }
+ break;
+ case 'l':{
+ Ankle1Add();
+ i++;
+ }
+ break;
+ case 'L':{
+ Ankle1Subtract();
+ i++;
+ }
+ break;
+ /* end of leg control functions */
+
+ /* start of light source position functions */
+ case 'p':{
+ LightTurnRight();
+ i++;
+ }
+ break;
+ case 'i':{
+ LightTurnLeft();
+ i++;
+ }
+ break;
+ case 'o':{
+ LightForwards();
+ i++;
+ }
+ break;
+ case '9':{
+ LightBackwards();
+ i++;
+ }
+ break;
+ /* end of light source position functions */
+
+ /* start of misc functions */
+ case 't':
+ Toggle();
+ break;
+
+ case KEY_LEFT:
+ TurnLeft();
+ break;
+ case KEY_RIGHT:
+ TurnRight();
+ break;
+ case KEY_UP:
+ TurnBackwards();
+ break;
+ case KEY_DOWN:
+ TurnForwards();
+ break;
+
+ case ' ':
+ FireCannon();
+ }
+ return 0;
+}
+
+void printHelp(void)
+{
+ printf("at the shoulders:");
+ printf("forward : q,w");
+ printf("backwards : a,s");
+ printf("outwards : z,x");
+ printf("inwards : Z,X");
+#if 0
+ glut_menu[6] = glutCreateMenu(null_select);
+ printf("upwards : Q,W\n");
+ printf("downwards : A,S\n");
+ printf("outwards : 1,2\n");
+ printf("inwards : 3,4\n");
+
+ glut_menu[1] = glutCreateMenu(null_select);
+ printf(" : Page_up\n");
+
+ glut_menu[8] = glutCreateMenu(null_select);
+ printf("forward : y,u\n");
+ printf("backwards : h.j\n");
+ printf("outwards : Y,U\n");
+ printf("inwards : H,J\n");
+
+ glut_menu[9] = glutCreateMenu(null_select);
+ printf("forward : n,m\n");
+ printf("backwards : N,M\n");
+
+ glut_menu[9] = glutCreateMenu(null_select);
+ printf("forward : n,m\n");
+ printf("backwards : N,M\n");
+
+ glut_menu[10] = glutCreateMenu(null_select);
+ printf("toes up : K,L\n");
+ printf("toes down : k,l\n");
+
+ glut_menu[11] = glutCreateMenu(null_select);
+ printf("right : right arrow\n");
+ printf("left : left arrow\n");
+ printf("down : up arrow\n");
+ printf("up : down arrow\n");
+
+ glut_menu[12] = glutCreateMenu(null_select);
+ printf("right : p\n");
+ printf("left : i\n");
+ printf("up : 9\n");
+ printf("down : o\n");
+
+ glut_menu[4] = glutCreateMenu(NULL);
+ glutAddSubMenu("at the elbows?", glut_menu[6]);
+
+ glut_menu[7] = glutCreateMenu(NULL);
+ glutAddSubMenu("at the hip? ", glut_menu[8]);
+ glutAddSubMenu("at the knees?", glut_menu[9]);
+ glutAddSubMenu("at the ankles? ", glut_menu[10]);
+
+ printf("turn left : d\n");
+ printf("turn right : g\n");
+
+ glut_menu[3] = glutCreateMenu(null_select);
+ printf("tilt backwards : f\n");
+ printf("tilt forwards : r\n");
+
+ glut_menu[0] = glutCreateMenu(NULL);
+ glutAddSubMenu("move the arms.. ", glut_menu[4]);
+ glutAddSubMenu("fire the vulcan guns?", glut_menu[1]);
+ glutAddSubMenu("move the legs.. ", glut_menu[7]);
+ glutAddSubMenu("move the torso?", glut_menu[2]);
+ glutAddSubMenu("move the hip?", glut_menu[3]);
+ glutAddSubMenu("rotate the scene..", glut_menu[11]);
+#ifdef MOVE_LIGHT
+ glutAddSubMenu("rotate the light source..", glut_menu[12]);
+#endif
+
+ glutCreateMenu(menu_select);
+#ifdef ANIMATION
+ printf("Start Walk", 1);
+ printf("Stop Walk", 2);
+#endif
+ printf("Toggle Wireframe", 3);
+ glutAddSubMenu("How do I ..", glut_menu[0]);
+ printfy("Quit", 4);
+ glutAttachMenu(GLUT_LEFT_BUTTON);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+#endif
+}
+
+void idle( void )
+{
+ /* animate the mech */
+
+ animation();
+
+ /* draw the Mech */
+
+ display();
+}
+
+/* #define PROFILE */
+
+#ifdef PROFILE
+extern int count_triangles;
+#endif
+
+// #define LINUX_TEST_FLOAT
+
+#ifdef LINUX_TEST_FLOAT
+#include <fpu_control.h>
+#endif
+
+int
+main(int argc, char **argv)
+{
+#ifdef LINUX_TEST_FLOAT
+ /* for debuging floating point errors under Linux */
+ __setfpucw ( 0x1372 );
+#endif
+
+ Toggle();
+
+ return ui_loop(argc, argv, "mech");
+}