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"); |
} |