1754 lines
36 KiB
C
1754 lines
36 KiB
C
/**
|
|
* 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");
|
|
}
|