X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;ds=sidebyside;f=progs%2Fdemos%2Fshapes%2Fshapes.c;h=e07312dfae225ddf52cf4520f301f1c0b26194b8;hb=996f866b6b2758286997a04879151eeae0305f9e;hp=b2da232a74b94ee4ad714ca177d48348a74d0786;hpb=ea5dc8a10beb55cd972c34d6b531158101b6773f;p=freeglut
diff --git a/progs/demos/shapes/shapes.c b/progs/demos/shapes/shapes.c
index b2da232..e07312d 100644
--- a/progs/demos/shapes/shapes.c
+++ b/progs/demos/shapes/shapes.c
@@ -15,6 +15,8 @@
- i I Show info
- p P Toggle perspective or orthographic projection
- r R Toggle fixed or animated rotation around model X-axis
+ - s S Toggle toggle fixed function or shader render path
+ - n N Toggle visualization of object's normal vectors
- = + Increase \a slices
- - _ Decreate \a slices
- , < Decreate \a stacks
@@ -423,6 +425,17 @@ static GLboolean useShader = GL_FALSE;
static GLboolean visNormals = GL_FALSE;
/*
+ * Enum to tell drawSizeInfo what to draw for each object
+ */
+#define GEO_NO_SIZE 0
+#define GEO_SIZE 1
+#define GEO_SCALE 2
+#define GEO_INNER_OUTER_RAD 4
+#define GEO_RAD 8
+#define GEO_BASE_HEIGHT 16
+#define GEO_RAD_HEIGHT 32
+
+/*
* These one-liners draw particular objects, fetching appropriate
* information from the above globals. They are just thin wrappers
* for the FreeGLUT objects.
@@ -445,10 +458,10 @@ static void drawSolidTorus(void) { glutSolidTorus(irad,orad,slices
static void drawWireTorus(void) { glutWireTorus (irad,orad,slices,stacks); }
static void drawSolidSphere(void) { glutSolidSphere(orad,slices,stacks); } /* orad doubles as size input */
static void drawWireSphere(void) { glutWireSphere(orad,slices,stacks); } /* orad doubles as size input */
-static void drawSolidCone(void) { glutSolidCone(orad,orad,slices,stacks); } /* orad doubles as size input */
-static void drawWireCone(void) { glutWireCone(orad,orad,slices,stacks); } /* orad doubles as size input */
-static void drawSolidCylinder(void) { glutSolidCylinder(orad,orad,slices,stacks); } /* orad doubles as size input */
-static void drawWireCylinder(void) { glutWireCylinder(orad,orad,slices,stacks); } /* orad doubles as size input */
+static void drawSolidCone(void) { glutSolidCone(irad,orad,slices,stacks); } /* irad doubles as base input, and orad as height input */
+static void drawWireCone(void) { glutWireCone(irad,orad,slices,stacks); } /* irad doubles as base input, and orad as height input */
+static void drawSolidCylinder(void) { glutSolidCylinder(irad,orad,slices,stacks); } /* irad doubles as radius input, and orad as height input */
+static void drawWireCylinder(void) { glutWireCylinder(irad,orad,slices,stacks); } /* irad doubles as radius input, and orad as height input */
static void drawSolidTeapot(void)
{
/* per Glut manpage, it should be noted that the teapot is rendered
@@ -468,54 +481,56 @@ static void drawWireTeapot(void)
glFrontFace(GL_CCW);
}
-#define RADIUS 1.0f
+#define RADIUSFAC 0.70710678118654752440084436210485f
static void drawSolidCuboctahedron(void)
{
+ GLfloat radius = RADIUSFAC*(GLfloat)orad; /* orad doubles as size */
glBegin( GL_TRIANGLES );
- glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS, RADIUS ); glVertex3d( RADIUS, 0.0, RADIUS );
- glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS,-RADIUS );
- glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, RADIUS );
- glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS,-RADIUS ); glVertex3d( RADIUS, 0.0,-RADIUS );
- glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, RADIUS );
- glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS,-RADIUS ); glVertex3d(-RADIUS, 0.0,-RADIUS );
- glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS, RADIUS ); glVertex3d(-RADIUS, 0.0, RADIUS );
- glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS,-RADIUS );
+ glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius ); glVertex3d( radius, 0.0, radius );
+ glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius );
+ glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius );
+ glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius ); glVertex3d( radius, 0.0,-radius );
+ glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0, radius, radius );
+ glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, 0.0,-radius );
+ glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius, 0.0, radius );
+ glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius );
glEnd();
glBegin( GL_QUADS );
- glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0,-RADIUS );
- glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0, RADIUS );
- glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS,-RADIUS ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS, RADIUS );
- glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS, RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS,-RADIUS );
- glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, RADIUS ); glVertex3d(-RADIUS, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, RADIUS );
- glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS,-RADIUS ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS,-RADIUS );
+ glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0,-radius );
+ glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0, radius );
+ glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius );
+ glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius );
+ glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0, radius, radius ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius );
+ glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius );
glEnd();
}
static void drawWireCuboctahedron(void)
{
+ GLfloat radius = RADIUSFAC*(GLfloat)orad; /* orad doubles as size */
glBegin( GL_LINE_LOOP );
- glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0,-RADIUS );
+ glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0,-radius );
glEnd();
glBegin( GL_LINE_LOOP );
- glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0, RADIUS );
+ glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0, radius );
glEnd();
glBegin( GL_LINE_LOOP );
- glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS,-RADIUS ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS, RADIUS );
+ glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius );
glEnd();
glBegin( GL_LINE_LOOP );
- glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS, RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS,-RADIUS );
+ glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius );
glEnd();
glBegin( GL_LINE_LOOP );
- glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, RADIUS ); glVertex3d(-RADIUS, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, RADIUS );
+ glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0, radius, radius ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius );
glEnd();
glBegin( GL_LINE_LOOP );
- glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS,-RADIUS ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS,-RADIUS );
+ glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius );
glEnd();
}
-#undef RADIUS
+#undef RADIUSFAC
/*
* This structure defines an entry in our function-table.
@@ -525,24 +540,25 @@ typedef struct
const char * const name;
void (*solid) (void);
void (*wire) (void);
+ int drawSizeInfoFlag;
} entry;
-#define ENTRY(e) {#e, drawSolid##e, drawWire##e}
+#define ENTRY(e,f) {#e, drawSolid##e, drawWire##e,f}
static const entry table [] =
{
- ENTRY (Tetrahedron),
- ENTRY (Cube),
- ENTRY (Octahedron),
- ENTRY (Dodecahedron),
- ENTRY (RhombicDodecahedron),
- ENTRY (Icosahedron),
- ENTRY (SierpinskiSponge),
- ENTRY (Teapot),
- ENTRY (Torus),
- ENTRY (Sphere),
- ENTRY (Cone),
- ENTRY (Cylinder),
- ENTRY (Cuboctahedron) /* This one doesn't work when in shader mode and is then skipped */
+ ENTRY (Tetrahedron,GEO_NO_SIZE),
+ ENTRY (Cube,GEO_SIZE),
+ ENTRY (Octahedron,GEO_NO_SIZE),
+ ENTRY (Dodecahedron,GEO_NO_SIZE),
+ ENTRY (RhombicDodecahedron,GEO_NO_SIZE),
+ ENTRY (Icosahedron,GEO_NO_SIZE),
+ ENTRY (SierpinskiSponge,GEO_SCALE),
+ ENTRY (Teapot,GEO_SIZE),
+ ENTRY (Torus,GEO_INNER_OUTER_RAD),
+ ENTRY (Sphere,GEO_RAD),
+ ENTRY (Cone,GEO_BASE_HEIGHT),
+ ENTRY (Cylinder,GEO_RAD_HEIGHT),
+ ENTRY (Cuboctahedron,GEO_SIZE) /* This one doesn't work when in shader mode and is then skipped */
};
#undef ENTRY
@@ -592,8 +608,61 @@ static void shapesPrintf (int row, int col, const char *fmt, ...)
glPopMatrix();
}
-/* GLUT callback Handlers */
+/* Print info about the about the current shape and render state on the screen */
+static void DrawSizeInfo(int *row)
+{
+ switch (table [function_index].drawSizeInfoFlag)
+ {
+ case GEO_NO_SIZE:
+ break;
+ case GEO_SIZE:
+ shapesPrintf ((*row)++, 1, "Size Up Down : %f", orad);
+ break;
+ case GEO_SCALE:
+ shapesPrintf ((*row)++, 1, "Scale Up Down : %f", orad);
+ break;
+ case GEO_INNER_OUTER_RAD:
+ shapesPrintf ((*row)++, 1, "Inner radius Left Right: %f", irad);
+ shapesPrintf ((*row)++, 1, "Outer radius Up Down : %f", orad);
+ break;
+ case GEO_RAD:
+ shapesPrintf ((*row)++, 1, "Radius Up Down : %f", orad);
+ break;
+ case GEO_BASE_HEIGHT:
+ shapesPrintf ((*row)++, 1, "Base Left Right: %f", irad);
+ shapesPrintf ((*row)++, 1, "Height Up Down : %f", orad);
+ break;
+ case GEO_RAD_HEIGHT:
+ shapesPrintf ((*row)++, 1, "Radius Left Right: %f", irad);
+ shapesPrintf ((*row)++, 1, "Height Up Down : %f", orad);
+ break;
+ }
+}
+
+static void drawInfo()
+{
+ int row = 1;
+ shapesPrintf (row++, 1, "Shape PgUp PgDn: %s", table [function_index].name);
+ shapesPrintf (row++, 1, "Slices +-: %d Stacks <>: %d", slices, stacks);
+ shapesPrintf (row++, 1, "nSides +-: %d nRings <>: %d", slices, stacks);
+ shapesPrintf (row++, 1, "Depth (): %d", depth);
+ DrawSizeInfo(&row);
+ if (persProject)
+ shapesPrintf (row++, 1, "Perspective projection (p)");
+ else
+ shapesPrintf (row++, 1, "Orthographic projection (p)");
+ if (useShader)
+ shapesPrintf (row++, 1, "Using shader (s)");
+ else
+ shapesPrintf (row++, 1, "Using fixed function pipeline (s)");
+ if (animateXRot)
+ shapesPrintf (row++, 1, "2D rotation (r)");
+ else
+ shapesPrintf (row++, 1, "1D rotation (r)");
+ shapesPrintf (row++, 1, "visualizing normals: %i (n)",visNormals);
+}
+/* GLUT callback Handlers */
static void
resize(int width, int height)
{
@@ -610,6 +679,8 @@ static void display(void)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glutSetOption(GLUT_GEOMETRY_VISUALIZE_NORMALS,visNormals); /* Normals visualized or not? */
+
if (useShader && !shaderReady)
initShader();
@@ -660,7 +731,6 @@ static void display(void)
else
{
/* fixed function pipeline */
- glutSetOption(GLUT_OBJECTS_VISUALIZE_NORMALS,visNormals); /* Normals visualized or not? */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (persProject)
@@ -692,31 +762,12 @@ static void display(void)
glColor3d(0.1,0.1,0.4);
}
- if( show_info ) {
- shapesPrintf (1, 1, "Shape PgUp PgDn: %s", table [function_index].name);
- shapesPrintf (2, 1, "Slices +-: %d Stacks <>: %d", slices, stacks);
- shapesPrintf (3, 1, "nSides +-: %d nRings <>: %d", slices, stacks);
- shapesPrintf (4, 1, "Depth (): %d", depth);
- shapesPrintf (5, 1, "Outer radius Up Down : %f", orad);
- shapesPrintf (6, 1, "Inner radius Left Right: %f", irad);
- if (persProject)
- shapesPrintf (7, 1, "Perspective projection (p)");
- else
- shapesPrintf (7, 1, "Orthographic projection (p)");
- if (useShader)
- shapesPrintf (8, 1, "Using shader (s)");
- else
- shapesPrintf (8, 1, "Using fixed function pipeline (s)");
- if (animateXRot)
- shapesPrintf (9, 1, "2D rotation (r)");
- else
- shapesPrintf (9, 1, "1D rotation (r)");
- if (!useShader)
- shapesPrintf (10, 1, "visualizing normals: %i (n)",visNormals);
- } else {
+ if( show_info )
+ /* print info to screen */
+ drawInfo();
+ else
/* print to command line instead */
printf ( "Shape %d slides %d stacks %d\n", function_index, slices, stacks ) ;
- }
glutSwapBuffers();
}
@@ -759,7 +810,12 @@ key(unsigned char key, int x, int y)
case 'r': animateXRot=!animateXRot; break;
case 'S':
- case 's': useShader=!useShader; break;
+ case 's':
+ useShader=!useShader;
+ /* Cuboctahedron can't be shown when in shader mode, move to next */
+ if (useShader && NUMBEROF (table)-1 == ( unsigned )function_index)
+ function_index = 0;
+ break;
case 'N':
case 'n': visNormals=!visNormals; break;
@@ -792,6 +848,13 @@ static void special (int key, int x, int y)
if (NUMBEROF (table) <= ( unsigned )function_index)
function_index = 0;
+
+ /* Cuboctahedron can't be shown when in shader mode, skip it */
+ if (useShader && NUMBEROF (table)-1 == ( unsigned )function_index)
+ if (key==GLUT_KEY_PAGE_UP)
+ function_index = 0;
+ else
+ function_index -= 1;
}