diff options
author | inmarket <andrewh@inmarket.com.au> | 2014-08-20 01:36:33 +1000 |
---|---|---|
committer | inmarket <andrewh@inmarket.com.au> | 2014-08-20 01:36:33 +1000 |
commit | 3b21507274aa4f98644382903ae529c1fc2c7bd4 (patch) | |
tree | bd977e47129c44adb20f0f72c891fa960c827d73 /3rdparty/tinygl-0.4-ugfx/examples | |
parent | 301f134b9034170e6e26aa307e5ede741db1cf70 (diff) | |
download | uGFX-3b21507274aa4f98644382903ae529c1fc2c7bd4.tar.gz uGFX-3b21507274aa4f98644382903ae529c1fc2c7bd4.tar.bz2 uGFX-3b21507274aa4f98644382903ae529c1fc2c7bd4.zip |
GL3D GWIN window + demo
Diffstat (limited to '3rdparty/tinygl-0.4-ugfx/examples')
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/Makefile | 29 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/gears.c | 300 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/glu.c | 261 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/glu.h | 23 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/mech.c | 1753 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/nanox.c | 113 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/spin.c | 160 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/texobj.c | 193 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/ui.h | 17 | ||||
-rw-r--r-- | 3rdparty/tinygl-0.4-ugfx/examples/x11.c | 139 |
10 files changed, 2988 insertions, 0 deletions
diff --git a/3rdparty/tinygl-0.4-ugfx/examples/Makefile b/3rdparty/tinygl-0.4-ugfx/examples/Makefile new file mode 100644 index 00000000..912243bb --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/Makefile @@ -0,0 +1,29 @@ +include ../config.mk + +PROGS = mech texobj gears spin + +all: $(PROGS) + +clean: + rm -f core *.o *~ $(PROGS) + +mech: mech.o glu.o $(UI_OBJS) $(GL_DEPS) + $(CC) $(LFLAGS) $^ -o $@ $(GL_LIBS) $(UI_LIBS) -lm + +texobj: texobj.o $(UI_OBJS) $(GL_DEPS) + $(CC) $(LFLAGS) $^ -o $@ $(GL_LIBS) $(UI_LIBS) -lm + +gears: gears.o $(UI_OBJS) $(GL_DEPS) + $(CC) $(LFLAGS) $^ -o $@ $(GL_LIBS) $(UI_LIBS) -lm + +spin: spin.o $(UI_OBJS) $(GL_DEPS) + $(CC) $(LFLAGS) $^ -o $@ $(GL_LIBS) $(UI_LIBS) -lm + +.c.o: + $(CC) $(CFLAGS) $(GL_INCLUDES) $(UI_INCLUDES) -c $*.c + +mech.o: glu.h + +glu.o: glu.h + +ui.o: ui.h diff --git a/3rdparty/tinygl-0.4-ugfx/examples/gears.c b/3rdparty/tinygl-0.4-ugfx/examples/gears.c new file mode 100644 index 00000000..7ccf5bf2 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/gears.c @@ -0,0 +1,300 @@ +/* gears.c */ + +/* + * 3-D gear wheels. This program is in the public domain. + * + * Brian Paul + */ + + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <GL/glx.h> +#include <GL/gl.h> +#include "ui.h" + +#ifndef M_PI +# define M_PI 3.14159265 +#endif + + +/* + * Draw a gear wheel. You'll probably want to call this function when + * building a display list since we do a lot of trig here. + * + * Input: inner_radius - radius of hole at center + * outer_radius - radius at center of teeth + * width - width of gear + * teeth - number of teeth + * tooth_depth - depth of tooth + */ +static void gear( GLfloat inner_radius, GLfloat outer_radius, GLfloat width, + GLint teeth, GLfloat tooth_depth ) +{ + GLint i; + GLfloat r0, r1, r2; + GLfloat angle, da; + GLfloat u, v, len; + + r0 = inner_radius; + r1 = outer_radius - tooth_depth/2.0; + r2 = outer_radius + tooth_depth/2.0; + + da = 2.0*M_PI / teeth / 4.0; + + glShadeModel( GL_FLAT ); + + glNormal3f( 0.0, 0.0, 1.0 ); + + /* draw front face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*M_PI / teeth; + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + /* draw front sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*M_PI / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*M_PI / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + } + glEnd(); + + + glNormal3f( 0.0, 0.0, -1.0 ); + + /* draw back face */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*M_PI / teeth; + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + } + glEnd(); + + /* draw back sides of teeth */ + glBegin( GL_QUADS ); + da = 2.0*M_PI / teeth / 4.0; + for (i=0;i<teeth;i++) { + angle = i * 2.0*M_PI / teeth; + + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + } + glEnd(); + + + /* draw outward faces of teeth */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<teeth;i++) { + angle = i * 2.0*M_PI / teeth; + + glVertex3f( r1*cos(angle), r1*sin(angle), width*0.5 ); + glVertex3f( r1*cos(angle), r1*sin(angle), -width*0.5 ); + u = r2*cos(angle+da) - r1*cos(angle); + v = r2*sin(angle+da) - r1*sin(angle); + len = sqrt( u*u + v*v ); + u /= len; + v /= len; + glNormal3f( v, -u, 0.0 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), width*0.5 ); + glVertex3f( r2*cos(angle+da), r2*sin(angle+da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), width*0.5 ); + glVertex3f( r2*cos(angle+2*da), r2*sin(angle+2*da), -width*0.5 ); + u = r1*cos(angle+3*da) - r2*cos(angle+2*da); + v = r1*sin(angle+3*da) - r2*sin(angle+2*da); + glNormal3f( v, -u, 0.0 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), width*0.5 ); + glVertex3f( r1*cos(angle+3*da), r1*sin(angle+3*da), -width*0.5 ); + glNormal3f( cos(angle), sin(angle), 0.0 ); + } + + glVertex3f( r1*cos(0), r1*sin(0), width*0.5 ); + glVertex3f( r1*cos(0), r1*sin(0), -width*0.5 ); + + glEnd(); + + + glShadeModel( GL_SMOOTH ); + + /* draw inside radius cylinder */ + glBegin( GL_QUAD_STRIP ); + for (i=0;i<=teeth;i++) { + angle = i * 2.0*M_PI / teeth; + glNormal3f( -cos(angle), -sin(angle), 0.0 ); + glVertex3f( r0*cos(angle), r0*sin(angle), -width*0.5 ); + glVertex3f( r0*cos(angle), r0*sin(angle), width*0.5 ); + } + glEnd(); + +} + + +static GLfloat view_rotx=20.0, view_roty=30.0, view_rotz=0.0; +static GLint gear1, gear2, gear3; +static GLfloat angle = 0.0; + +static GLuint limit; +static GLuint count = 1; + + +void draw( void ) +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glPushMatrix(); + glRotatef( view_rotx, 1.0, 0.0, 0.0 ); + glRotatef( view_roty, 0.0, 1.0, 0.0 ); + glRotatef( view_rotz, 0.0, 0.0, 1.0 ); + + glPushMatrix(); + glTranslatef( -3.0, -2.0, 0.0 ); + glRotatef( angle, 0.0, 0.0, 1.0 ); + glCallList(gear1); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( 3.1, -2.0, 0.0 ); + glRotatef( -2.0*angle-9.0, 0.0, 0.0, 1.0 ); + glCallList(gear2); + glPopMatrix(); + + glPushMatrix(); + glTranslatef( -3.1, 4.2, 0.0 ); + glRotatef( -2.0*angle-25.0, 0.0, 0.0, 1.0 ); + glCallList(gear3); + glPopMatrix(); + + glPopMatrix(); + + tkSwapBuffers(); + + count++; + if (count==limit) { + exit(0); + } +} + + + +void idle( void ) +{ + angle += 2.0; + draw(); +} + + + +/* change view angle, exit upon ESC */ +GLenum key(int k, GLenum mask) +{ + switch (k) { + case KEY_UP: + view_rotx += 5.0; + return GL_TRUE; + case KEY_DOWN: + view_rotx -= 5.0; + return GL_TRUE; + case KEY_LEFT: + view_roty += 5.0; + return GL_TRUE; + case KEY_RIGHT: + view_roty -= 5.0; + return GL_TRUE; + case 'z': + view_rotz += 5.0; + return GL_TRUE; + case 'Z': + view_rotz -= 5.0; + return GL_TRUE; + case KEY_ESCAPE: + exit(0); + } + return GL_FALSE; +} + + + +/* new window size or exposure */ +void reshape( int width, int height ) +{ + GLfloat h = (GLfloat) height / (GLfloat) width; + + glViewport(0, 0, (GLint)width, (GLint)height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum( -1.0, 1.0, -h, h, 5.0, 60.0 ); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef( 0.0, 0.0, -40.0 ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); +} + + +void init( void ) +{ + static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0 }; + static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0 }; + static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0 }; + static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0 }; + + glLightfv( GL_LIGHT0, GL_POSITION, pos ); + glEnable( GL_CULL_FACE ); + glEnable( GL_LIGHTING ); + glEnable( GL_LIGHT0 ); + glEnable( GL_DEPTH_TEST ); + + /* make the gears */ + gear1 = glGenLists(1); + glNewList(gear1, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red ); + gear( 1.0, 4.0, 1.0, 20, 0.7 ); + glEndList(); + + gear2 = glGenLists(1); + glNewList(gear2, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green ); + gear( 0.5, 2.0, 2.0, 10, 0.7 ); + glEndList(); + + gear3 = glGenLists(1); + glNewList(gear3, GL_COMPILE); + glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue ); + gear( 1.3, 2.0, 0.5, 10, 0.7 ); + glEndList(); + + glEnable( GL_NORMALIZE ); +} + +int main(int argc, char **argv) +{ + if (argc>1) { + /* do 'n' frames then exit */ + limit = atoi( argv[1] ) + 1; + } + else { + limit = 0; + } + + return ui_loop(argc, argv, "gears"); +} + + diff --git a/3rdparty/tinygl-0.4-ugfx/examples/glu.c b/3rdparty/tinygl-0.4-ugfx/examples/glu.c new file mode 100644 index 00000000..38561e71 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/glu.c @@ -0,0 +1,261 @@ +#include <stdlib.h> +#include <math.h> +#include <GL/gl.h> +#include "glu.h" + + +void drawTorus(float rc, int numc, float rt, int numt) +{ + int i, j, k; + double s, t; + double x, y, z; + double pi, twopi; + + pi = 3.14159265358979323846; + twopi = 2 * pi; + + for (i = 0; i < numc; i++) { + glBegin(GL_QUAD_STRIP); + for (j = 0; j <= numt; j++) { + for (k = 1; k >= 0; k--) { + s = (i + k) % numc + 0.5; + t = j % numt; + + x = cos(t*twopi/numt) * cos(s*twopi/numc); + y = sin(t*twopi/numt) * cos(s*twopi/numc); + z = sin(s*twopi/numc); + glNormal3f(x, y, z); + + x = (rt + rc * cos(s*twopi/numc)) * cos(t*twopi/numt); + y = (rt + rc * cos(s*twopi/numc)) * sin(t*twopi/numt); + z = rc * sin(s*twopi/numc); + glVertex3f(x, y, z); + } + } + glEnd(); + } +} + +static void normal3f( GLfloat x, GLfloat y, GLfloat z ) +{ + GLdouble mag; + + mag = sqrt( x*x + y*y + z*z ); + if (mag>0.00001F) { + x /= mag; + y /= mag; + z /= mag; + } + glNormal3f( x, y, z ); +} + +void gluPerspective( GLdouble fovy, GLdouble aspect, + GLdouble zNear, GLdouble zFar ) +{ + GLdouble xmin, xmax, ymin, ymax; + + ymax = zNear * tan( fovy * M_PI / 360.0 ); + ymin = -ymax; + + xmin = ymin * aspect; + xmax = ymax * aspect; + + glFrustum( xmin, xmax, ymin, ymax, zNear, zFar ); +} + +GLUquadricObj *gluNewQuadric(void) +{ + return NULL; +} + +void gluQuadricDrawStyle(GLUquadricObj *obj, int style) +{ +} + +void gluCylinder( GLUquadricObj *qobj, + GLdouble baseRadius, GLdouble topRadius, GLdouble height, + GLint slices, GLint stacks ) +{ + GLdouble da, r, dr, dz; + GLfloat z, nz, nsign; + GLint i, j; + GLfloat du = 1.0 / slices; + GLfloat dv = 1.0 / stacks; + GLfloat tcx = 0.0, tcy = 0.0; + + nsign = 1.0; + + da = 2.0*M_PI / slices; + dr = (topRadius-baseRadius) / stacks; + dz = height / stacks; + nz = (baseRadius-topRadius) / height; /* Z component of normal vectors */ + + for (i=0;i<slices;i++) { + GLfloat x1 = -sin(i*da); + GLfloat y1 = cos(i*da); + GLfloat x2 = -sin((i+1)*da); + GLfloat y2 = cos((i+1)*da); + z = 0.0; + r = baseRadius; + tcy = 0.0; + glBegin( GL_QUAD_STRIP ); + for (j=0;j<=stacks;j++) { + if (nsign==1.0) { + normal3f( x1*nsign, y1*nsign, nz*nsign ); + glTexCoord2f(tcx, tcy); + glVertex3f( x1*r, y1*r, z ); + normal3f( x2*nsign, y2*nsign, nz*nsign ); + glTexCoord2f(tcx+du, tcy); + glVertex3f( x2*r, y2*r, z ); + } + else { + normal3f( x2*nsign, y2*nsign, nz*nsign ); + glTexCoord2f(tcx, tcy); + glVertex3f( x2*r, y2*r, z ); + normal3f( x1*nsign, y1*nsign, nz*nsign ); + glTexCoord2f(tcx+du, tcy); + glVertex3f( x1*r, y1*r, z ); + } + z += dz; + r += dr; + tcy += dv; + } + glEnd(); + tcx += du; + } +} + +/* Disk (adapted from Mesa) */ + +void gluDisk( GLUquadricObj *qobj, + GLdouble innerRadius, GLdouble outerRadius, + GLint slices, GLint loops ) +{ + GLdouble a, da; + GLfloat dr; + GLfloat r1, r2, dtc; + GLint s, l; + GLfloat sa,ca; + + /* Normal vectors */ + glNormal3f( 0.0, 0.0, +1.0 ); + + da = 2.0*M_PI / slices; + dr = (outerRadius-innerRadius) / (GLfloat) loops; + + /* texture of a gluDisk is a cut out of the texture unit square */ + /* x, y in [-outerRadius, +outerRadius]; s, t in [0, 1] (linear mapping) */ + dtc = 2.0f * outerRadius; + + r1 = innerRadius; + for (l=0;l<loops;l++) { + r2 = r1 + dr; + glBegin( GL_QUAD_STRIP ); + for (s=0;s<=slices;s++) { + if (s==slices) a = 0.0; + else a = s * da; + sa = sin(a); ca = cos(a); + glTexCoord2f(0.5+sa*r2/dtc,0.5+ca*r2/dtc); + glVertex2f( r2*sa, r2*ca ); + glTexCoord2f(0.5+sa*r1/dtc,0.5+ca*r1/dtc); + glVertex2f( r1*sa, r1*ca ); + } + glEnd(); + r1 = r2; + } + +} + +/* + * Sphère (adapted from Mesa) + */ + +void gluSphere(GLUquadricObj *qobj, + float radius,int slices,int stacks) +{ + float rho, drho, theta, dtheta; + float x, y, z; + float s, t, ds, dt; + int i, j, imin, imax; + int normals; + float nsign; + + normals=1; + nsign=1; + + drho = M_PI / (float) stacks; + dtheta = 2.0 * M_PI / (float) slices; + + /* draw +Z end as a triangle fan */ + glBegin( GL_TRIANGLE_FAN ); + glNormal3f( 0.0, 0.0, 1.0 ); + glTexCoord2f(0.5,0.0); + glVertex3f( 0.0, 0.0, nsign * radius ); + for (j=0;j<=slices;j++) { + theta = (j==slices) ? 0.0 : j * dtheta; + x = -sin(theta) * sin(drho); + y = cos(theta) * sin(drho); + z = nsign * cos(drho); + if (normals) glNormal3f( x*nsign, y*nsign, z*nsign ); + glVertex3f( x*radius, y*radius, z*radius ); + } + glEnd(); + + + ds = 1.0 / slices; + dt = 1.0 / stacks; + t = 1.0; /* because loop now runs from 0 */ + if (1) { + imin = 0; + imax = stacks; + } + else { + imin = 1; + imax = stacks-1; + } + + /* draw intermediate stacks as quad strips */ + for (i=imin;i<imax;i++) { + rho = i * drho; + glBegin( GL_QUAD_STRIP ); + s = 0.0; + for (j=0;j<=slices;j++) { + theta = (j==slices) ? 0.0 : j * dtheta; + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if (normals) glNormal3f( x*nsign, y*nsign, z*nsign ); + glTexCoord2f(s,1-t); + glVertex3f( x*radius, y*radius, z*radius ); + x = -sin(theta) * sin(rho+drho); + y = cos(theta) * sin(rho+drho); + z = nsign * cos(rho+drho); + if (normals) glNormal3f( x*nsign, y*nsign, z*nsign ); + glTexCoord2f(s,1-(t-dt)); + s += ds; + glVertex3f( x*radius, y*radius, z*radius ); + } + glEnd(); + t -= dt; + } + +/* draw -Z end as a triangle fan */ + glBegin( GL_TRIANGLE_FAN ); + glNormal3f( 0.0, 0.0, -1.0 ); + glTexCoord2f(0.5,1.0); + glVertex3f( 0.0, 0.0, -radius*nsign ); + rho = M_PI - drho; + s = 1.0; + t = dt; + for (j=slices;j>=0;j--) { + theta = (j==slices) ? 0.0 : j * dtheta; + x = -sin(theta) * sin(rho); + y = cos(theta) * sin(rho); + z = nsign * cos(rho); + if (normals) glNormal3f( x*nsign, y*nsign, z*nsign ); + glTexCoord2f(s,1-t); + s -= ds; + glVertex3f( x*radius, y*radius, z*radius ); + } + glEnd(); +} diff --git a/3rdparty/tinygl-0.4-ugfx/examples/glu.h b/3rdparty/tinygl-0.4-ugfx/examples/glu.h new file mode 100644 index 00000000..8e4bbdf6 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/glu.h @@ -0,0 +1,23 @@ + +void gluPerspective( GLdouble fovy, GLdouble aspect, + GLdouble zNear, GLdouble zFar ); + +typedef struct { + int draw_style; +} GLUquadricObj; + +#define GLU_LINE 0 + +GLUquadricObj *gluNewQuadric(void); +void gluQuadricDrawStyle(GLUquadricObj *obj, int style); + +void gluSphere(GLUquadricObj *qobj, + float radius,int slices,int stacks); +void gluCylinder( GLUquadricObj *qobj, + GLdouble baseRadius, GLdouble topRadius, GLdouble height, + GLint slices, GLint stacks ); +void gluDisk( GLUquadricObj *qobj, + GLdouble innerRadius, GLdouble outerRadius, + GLint slices, GLint loops ); + +void drawTorus(float rc, int numc, float rt, int numt); 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"); +} diff --git a/3rdparty/tinygl-0.4-ugfx/examples/nanox.c b/3rdparty/tinygl-0.4-ugfx/examples/nanox.c new file mode 100644 index 00000000..14e5d4f1 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/nanox.c @@ -0,0 +1,113 @@ +/* + * Demonstration program for Nano-X graphics. + */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#define MWINCLUDECOLORS +#include <microwin/nano-X.h> +#include <GL/gl.h> +#include <GL/nglx.h> +#include "ui.h" + +static GR_WINDOW_ID w1; /* id for large window */ +static GR_GC_ID gc1; /* graphics context for text */ + +void errorcatcher(); /* routine to handle errors */ + +void tkSwapBuffers(void) +{ + nglXSwapBuffers(w1); +} + +int +ui_loop(int argc,char **argv, const char *name) +{ + GR_EVENT event; /* current event */ + GR_IMAGE_ID id = 0; + NGLXContext cx; + int width, height, k; + + if (GrOpen() < 0) { + fprintf(stderr, "cannot open graphics\n"); + exit(1); + } + + width = 400; + height = 300; + + GrSetErrorHandler(errorcatcher); + + w1 = GrNewWindow(GR_ROOT_WINDOW_ID, 10, 10, width, height, 4, BLACK, WHITE); + + GrSelectEvents(w1, GR_EVENT_MASK_CLOSE_REQ|GR_EVENT_MASK_EXPOSURE|GR_EVENT_MASK_KEY_DOWN); + + GrMapWindow(w1); + + gc1 = GrNewGC(); + + GrSetGCForeground(gc1, WHITE); + + cx = nglXCreateContext(NULL, 0); + nglXMakeCurrent(w1, cx); + + init(); + reshape(width, height); + + while (1) { + GrCheckNextEvent(&event); + switch(event.type) { + case GR_EVENT_TYPE_CLOSE_REQ: + GrFreeImage(id); + GrClose(); + exit(0); + case GR_EVENT_TYPE_EXPOSURE: + break; + case GR_EVENT_TYPE_KEY_DOWN: + { + GR_EVENT_KEYSTROKE *kp = &event.keystroke; + /* XXX: nanoX special keys are totally bugged ! */ + switch(kp->ch) { + case 81: + k = KEY_LEFT; + break; + case 83: + k = KEY_RIGHT; + break; + case 82: + k = KEY_UP; + break; + case 84: + k = KEY_DOWN; + break; + default: + k = kp->ch; + break; + } + key(k, 0); + } + break; + default: + idle(); + break; + } + } + + return 0; +} + + +/* + * Here on an unrecoverable error. + */ +void +errorcatcher(code, name, id) + GR_ERROR code; /* error code */ + GR_FUNC_NAME name; /* function name which failed */ + GR_ID id; /* resource id */ +{ + GrClose(); + fprintf(stderr, "DEMO ERROR: code %d, function %s, resource id %d\n", + code, name, id); + exit(1); +} diff --git a/3rdparty/tinygl-0.4-ugfx/examples/spin.c b/3rdparty/tinygl-0.4-ugfx/examples/spin.c new file mode 100644 index 00000000..339bf003 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/spin.c @@ -0,0 +1,160 @@ +/* spin.c */ + + +/* + * Spinning box. This program is in the public domain. + * + * Brian Paul + */ + + +#include <math.h> +#include <stdio.h> + +#include <GL/glx.h> +#include <GL/gl.h> +#include "ui.h" + + + + +static GLfloat Xrot, Xstep; +static GLfloat Yrot, Ystep; +static GLfloat Zrot, Zstep; +static GLfloat Step = 5.0; +static GLfloat Scale = 1.0; +static GLuint Object; + + + + +static GLuint make_object( void ) +{ + GLuint list; + + list = glGenLists( 1 ); + + glNewList( list, GL_COMPILE ); + + glBegin( GL_LINE_LOOP ); + glColor3f( 1.0, 1.0, 1.0 ); + glVertex3f( 1.0, 0.5, -0.4 ); + glColor3f( 1.0, 0.0, 0.0 ); + glVertex3f( 1.0, -0.5, -0.4 ); + glColor3f( 0.0, 1.0, 0.0 ); + glVertex3f( -1.0, -0.5, -0.4 ); + glColor3f( 0.0, 0.0, 1.0 ); + glVertex3f( -1.0, 0.5, -0.4 ); + glEnd(); + + glColor3f( 1.0, 1.0, 1.0 ); + + glBegin( GL_LINE_LOOP ); + glVertex3f( 1.0, 0.5, 0.4 ); + glVertex3f( 1.0, -0.5, 0.4 ); + glVertex3f( -1.0, -0.5, 0.4 ); + glVertex3f( -1.0, 0.5, 0.4 ); + glEnd(); + + glBegin( GL_LINES ); + glVertex3f( 1.0, 0.5, -0.4 ); glVertex3f( 1.0, 0.5, 0.4 ); + glVertex3f( 1.0, -0.5, -0.4 ); glVertex3f( 1.0, -0.5, 0.4 ); + glVertex3f( -1.0, -0.5, -0.4 ); glVertex3f( -1.0, -0.5, 0.4 ); + glVertex3f( -1.0, 0.5, -0.4 ); glVertex3f( -1.0, 0.5, 0.4 ); + glEnd(); + + + glEndList(); + + return list; +} + + + +void reshape( int width, int height ) +{ + glViewport(0, 0, (GLint)width, (GLint)height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 ); + glMatrixMode(GL_MODELVIEW); +} + + +GLenum key(int k, GLenum mask) +{ + switch (k) { + case KEY_ESCAPE: + exit(0); + } + return GL_FALSE; +} + + +void draw( void ) +{ + glClear( GL_COLOR_BUFFER_BIT ); + + glPushMatrix(); + + glTranslatef( 0.0, 0.0, -10.0 ); + glScalef( Scale, Scale, Scale ); + if (Xstep) { + glRotatef( Xrot, 1.0, 0.0, 0.0 ); + } + else if (Ystep) { + glRotatef( Yrot, 0.0, 1.0, 0.0 ); + } + else { + glRotatef( Zrot, 0.0, 0.0, 1.0 ); + } + + glCallList( Object ); + + glPopMatrix(); + + glFlush(); + tkSwapBuffers(); +} + + +void idle( void ) +{ + Xrot += Xstep; + Yrot += Ystep; + Zrot += Zstep; + + if (Xrot>=360.0) { + Xrot = Xstep = 0.0; + Ystep = Step; + } + else if (Yrot>=360.0) { + Yrot = Ystep = 0.0; + Zstep = Step; + } + else if (Zrot>=360.0) { + Zrot = Zstep = 0.0; + Xstep = Step; + } + draw(); +} + +void init(void) +{ + Object = make_object(); + glCullFace( GL_BACK ); +/* glEnable( GL_CULL_FACE );*/ + glDisable( GL_DITHER ); + glShadeModel( GL_FLAT ); +/* glEnable( GL_DEPTH_TEST ); */ + + Xrot = Yrot = Zrot = 0.0; + Xstep = Step; + Ystep = Zstep = 0.0; +} + + +int main( int argc, char *argv[] ) +{ + return ui_loop(argc, argv, "spin"); +} diff --git a/3rdparty/tinygl-0.4-ugfx/examples/texobj.c b/3rdparty/tinygl-0.4-ugfx/examples/texobj.c new file mode 100644 index 00000000..913d35aa --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/texobj.c @@ -0,0 +1,193 @@ +/* + * Example of using the 1.1 texture object functions. + * Also, this demo utilizes Mesa's fast texture map path. + * + * Brian Paul June 1996 + */ + +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <GL/glx.h> +#include <GL/gl.h> +#include "ui.h" + +static GLuint TexObj[2]; +static GLfloat Angle = 0.0f; + +static int cnt=0,v=0; + +void +draw(void) +{ + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glColor3f(1.0, 1.0, 1.0); + + /* draw first polygon */ + glPushMatrix(); + glTranslatef(-1.0, 0.0, 0.0); + glRotatef(Angle, 0.0, 0.0, 1.0); + glBindTexture(GL_TEXTURE_2D, TexObj[v]); + + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + glTexCoord2f(0.0, 0.0); + glVertex2f(-1.0, -1.0); + glTexCoord2f(1.0, 0.0); + glVertex2f(1.0, -1.0); + glTexCoord2f(1.0, 1.0); + glVertex2f(1.0, 1.0); + glTexCoord2f(0.0, 1.0); + glVertex2f(-1.0, 1.0); + glEnd(); + glDisable(GL_TEXTURE_2D); + glPopMatrix(); + + /* draw second polygon */ + glPushMatrix(); + glTranslatef(1.0, 0.0, 0.0); + glRotatef(Angle - 90.0, 0.0, 1.0, 0.0); + + glBindTexture(GL_TEXTURE_2D, TexObj[1-v]); + + glEnable(GL_TEXTURE_2D); + glBegin(GL_QUADS); + glTexCoord2f(0.0, 0.0); + glVertex2f(-1.0, -1.0); + glTexCoord2f(1.0, 0.0); + glVertex2f(1.0, -1.0); + glTexCoord2f(1.0, 1.0); + glVertex2f(1.0, 1.0); + glTexCoord2f(0.0, 1.0); + glVertex2f(-1.0, 1.0); + glEnd(); + glDisable(GL_TEXTURE_2D); + + glPopMatrix(); + + tkSwapBuffers(); +} + + +/* new window size or exposure */ +void +reshape(int width, int height) +{ + glViewport(0, 0, (GLint) width, (GLint) height); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 ); */ + glFrustum(-2.0, 2.0, -2.0, 2.0, 6.0, 20.0); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0.0, 0.0, -8.0); +} + + +void bind_texture(int texobj,int image) +{ + static int width = 8, height = 8; + static int color[2][3]={ + {255,0,0}, + {0,255,0}, + }; + GLubyte tex[64][3]; + static GLubyte texchar[2][8*8] = { + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}, + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 2, 0, 0, 0, + 0, 0, 2, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}}; + + int i,j; + + glBindTexture(GL_TEXTURE_2D, texobj); + + /* red on white */ + for (i = 0; i < height; i++) { + for (j = 0; j < width; j++) { + int p = i * width + j; + if (texchar[image][(height - i - 1) * width + j]) { + tex[p][0] = color[image][0]; + tex[p][1] = color[image][1]; + tex[p][2] = color[image][2]; + } else { + tex[p][0] = 255; + tex[p][1] = 255; + tex[p][2] = 255; + } + } + } + glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, + GL_RGB, GL_UNSIGNED_BYTE, tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + /* end of texture object */ +} + + + +void +init(void) +{ + glEnable(GL_DEPTH_TEST); + + /* Setup texturing */ + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); + + /* generate texture object IDs */ + glGenTextures(2, TexObj); + bind_texture(TexObj[0],0); + bind_texture(TexObj[1],1); + +} + +void +idle(void) +{ + + Angle += 2.0; + + if (++cnt==5) { + cnt=0; + v=!v; + } + draw(); +} + +/* change view angle, exit upon ESC */ +GLenum key(int k, GLenum mask) +{ + switch (k) { + case 'q': + case KEY_ESCAPE: + exit(0); + } + return GL_FALSE; +} + +int main(int argc, char **argv) +{ + return ui_loop(argc, argv, "texobj"); +} + + diff --git a/3rdparty/tinygl-0.4-ugfx/examples/ui.h b/3rdparty/tinygl-0.4-ugfx/examples/ui.h new file mode 100644 index 00000000..8814566e --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/ui.h @@ -0,0 +1,17 @@ +/* + * tk like ui + */ +void draw( void ); +void idle( void ); +GLenum key(int k, GLenum mask); +void reshape( int width, int height ); +void init( void ); +int ui_loop(int argc, char **argv, const char *name); +void tkSwapBuffers(void); + +#define KEY_UP 0xe000 +#define KEY_DOWN 0xe001 +#define KEY_LEFT 0xe002 +#define KEY_RIGHT 0xe003 +#define KEY_ESCAPE 0xe004 + diff --git a/3rdparty/tinygl-0.4-ugfx/examples/x11.c b/3rdparty/tinygl-0.4-ugfx/examples/x11.c new file mode 100644 index 00000000..13913f51 --- /dev/null +++ b/3rdparty/tinygl-0.4-ugfx/examples/x11.c @@ -0,0 +1,139 @@ +#include <math.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/keysym.h> + +#include <GL/glx.h> +#include <GL/gl.h> +#include "ui.h" + + +#ifndef M_PI +# define M_PI 3.14159265 +#endif + +static int attributeList[] = { GLX_RGBA, GLX_DOUBLEBUFFER, None }; + +static Bool WaitForNotify(Display *d, XEvent *e, char *arg) +{ + return (e->type == MapNotify) && (e->xmap.window == (Window)arg); +} + +Display *dpy; +Window win; + +void tkSwapBuffers(void) +{ + glXSwapBuffers(dpy,win); +} + +int ui_loop(int argc, char **argv, const char *name) +{ + XVisualInfo *vi; + Colormap cmap; + XSetWindowAttributes swa; + XSizeHints hint; + GLXContext cx; + XEvent event; + int k, width, height; + char buf[80]; + XEvent xev; + KeySym keysym; + XComposeStatus status; + + /* get a connection */ + dpy = XOpenDisplay(NULL); + if (dpy == NULL) { + fprintf(stderr,"Could not open X display\n"); + exit(1); + } + + /* get an appropriate visual */ + vi = glXChooseVisual(dpy, DefaultScreen(dpy), attributeList); + if (vi == NULL) { + fprintf(stderr, "No suitable visual for glx\n"); + exit(1); + } + + /* create a GLX context */ + cx = glXCreateContext(dpy, vi, 0, GL_TRUE); + + /* create a color map */ + cmap = XCreateColormap(dpy, RootWindow(dpy, vi->screen), + vi->visual, AllocNone); + + /* create a window */ + width = 400; + height = 300; + hint.x = 0; + hint.y = 0; + hint.width = width; + hint.height = height; + hint.flags = PPosition | PSize; + swa.colormap = cmap; + swa.border_pixel = 0; + swa.event_mask = StructureNotifyMask; + win = XCreateWindow(dpy, RootWindow(dpy, vi->screen), 0, 0, width, height, + 0, vi->depth, InputOutput, vi->visual, + CWBorderPixel|CWColormap|CWEventMask, &swa); + XSetStandardProperties (dpy, win, name, name, None, NULL, 0, &hint); + + XMapWindow(dpy, win); + XIfEvent(dpy, &event, WaitForNotify, (char*)win); + XSelectInput(dpy, win, KeyPressMask | StructureNotifyMask | ExposureMask); + + /* connect the context to the window */ + glXMakeCurrent(dpy, win, cx); + + init(); + reshape(width, height); + + while (1) { + if (XPending(dpy) > 0) { + XNextEvent(dpy,&xev); + switch(xev.type) { + case KeyPress: + XLookupString((XKeyEvent *)&xev,buf,80,&keysym,&status); + switch(keysym) { + case XK_Up: + k = KEY_UP; + break; + case XK_Down: + k = KEY_DOWN; + break; + case XK_Left: + k = KEY_LEFT; + break; + case XK_Right: + k = KEY_RIGHT; + break; + case XK_Escape: + k = KEY_ESCAPE; + break; + default: + k = keysym; + } + key(k, 0); + break; + case ConfigureNotify: + { + int width,height; + width = xev.xconfigure.width; + height = xev.xconfigure.height; + glXWaitX(); + reshape(width, height); + } + break; + } + } else { + idle(); + } + } + return 0; +} + + |