X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=progs%2Fdemos%2Fshapes%2Fshapes.c;h=3b1e98e58f9da52e2f6da740002e4b3d81b54d72;hb=b744f1401b990f642e96d4c65cc86eca5224efd1;hp=4928260e884cc6ce5d469f6e452ada3d23f1a0de;hpb=32ee0c1e2137eee3f3879c7a246efd0558be71ee;p=freeglut
diff --git a/progs/demos/shapes/shapes.c b/progs/demos/shapes/shapes.c
index 4928260..3b1e98e 100644
--- a/progs/demos/shapes/shapes.c
+++ b/progs/demos/shapes/shapes.c
@@ -12,6 +12,8 @@
Keys:
- Esc Quit
- q Q Quit
+ - i I Show info
+ - p P Toggle perspective or orthographic projection
- = + Increase \a slices
- - _ Decreate \a slices
- , < Decreate \a stacks
@@ -40,8 +42,9 @@
#include
#include
-#ifdef WIN32
-#include // DUMP MEMORY LEAKS
+#ifdef _MSC_VER
+/* DUMP MEMORY LEAKS */
+#include
#endif
/*
@@ -58,43 +61,63 @@ static int function_index;
static int slices = 16;
static int stacks = 16;
static double irad = .25;
-static double orad = 1.0;
+static double orad = 1.0; /* doubles as size for objects other than Torus */
static int depth = 4;
static double offset[ 3 ] = { 0, 0, 0 };
-
+static GLboolean show_info = GL_TRUE;
+static float ar;
+static GLboolean persProject = GL_TRUE;
/*
* These one-liners draw particular objects, fetching appropriate
* information from the above globals. They are just thin wrappers
- * for the OpenGLUT objects.
+ * for the FreeGLUT objects.
*/
-static void drawSolidTetrahedron(void) { glutSolidTetrahedron (); }
-static void drawWireTetrahedron(void) { glutWireTetrahedron (); }
-static void drawSolidCube(void) { glutSolidCube(1); }
-static void drawWireCube(void) { glutWireCube(1); }
-static void drawSolidOctahedron(void) { glutSolidOctahedron (); }
-static void drawWireOctahedron(void) { glutWireOctahedron (); }
-static void drawSolidDodecahedron(void) { glutSolidDodecahedron (); }
-static void drawWireDodecahedron(void) { glutWireDodecahedron (); }
-static void drawSolidRhombicDodecahedron(void) { glutSolidRhombicDodecahedron (); }
-static void drawWireRhombicDodecahedron(void) { glutWireRhombicDodecahedron (); }
-static void drawSolidIcosahedron(void) { glutSolidIcosahedron (); }
-static void drawWireIcosahedron(void) { glutWireIcosahedron (); }
-static void drawSolidSierpinskiSponge(void) { glutSolidSierpinskiSponge (depth, offset, 1); }
-static void drawWireSierpinskiSponge(void) { glutWireSierpinskiSponge (depth, offset, 1); }
-static void drawSolidTeapot(void) { glutSolidTeapot(1); }
-static void drawWireTeapot(void) { glutWireTeapot(1); }
-static void drawSolidTorus(void) { glutSolidTorus(irad,orad,slices,stacks); }
-static void drawWireTorus(void) { glutWireTorus (irad,orad,slices,stacks); }
-static void drawSolidSphere(void) { glutSolidSphere(1,slices,stacks); }
-static void drawWireSphere(void) { glutWireSphere(1,slices,stacks); }
-static void drawSolidCone(void) { glutSolidCone(1,1,slices,stacks); }
-static void drawWireCone(void) { glutWireCone(1,1,slices,stacks); }
-static void drawSolidCylinder(void) { glutSolidCylinder(1,1,slices,stacks); }
-static void drawWireCylinder(void) { glutWireCylinder(1,1,slices,stacks); }
-static void drawSolidCuboctahedron(void)
+static void drawSolidTetrahedron(void) { glutSolidTetrahedron (); }
+static void drawWireTetrahedron(void) { glutWireTetrahedron (); }
+static void drawSolidCube(void) { glutSolidCube(orad); } /* orad doubles as size input */
+static void drawWireCube(void) { glutWireCube(orad); } /* orad doubles as size input */
+static void drawSolidOctahedron(void) { glutSolidOctahedron (); }
+static void drawWireOctahedron(void) { glutWireOctahedron (); }
+static void drawSolidDodecahedron(void) { glutSolidDodecahedron (); }
+static void drawWireDodecahedron(void) { glutWireDodecahedron (); }
+static void drawSolidRhombicDodecahedron(void) { glutSolidRhombicDodecahedron (); }
+static void drawWireRhombicDodecahedron(void) { glutWireRhombicDodecahedron (); }
+static void drawSolidIcosahedron(void) { glutSolidIcosahedron (); }
+static void drawWireIcosahedron(void) { glutWireIcosahedron (); }
+static void drawSolidSierpinskiSponge(void) { glutSolidSierpinskiSponge (depth, offset, orad);} /* orad doubles as size input */
+static void drawWireSierpinskiSponge(void) { glutWireSierpinskiSponge (depth, offset, orad); } /* orad doubles as size input */
+static void drawSolidTorus(void) { glutSolidTorus(irad,orad,slices,stacks); }
+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 drawSolidTeapot(void)
+{
+ /* per Glut manpage, it should be noted that the teapot is rendered
+ * with clockwise winding for front facing polygons...
+ */
+ glFrontFace(GL_CW);
+ glutSolidTeapot(orad); /* orad doubles as size input */
+ glFrontFace(GL_CCW);
+}
+static void drawWireTeapot(void)
{
+ /* per Glut manpage, it should be noted that the teapot is rendered
+ * with clockwise winding for front facing polygons...
+ */
+ glFrontFace(GL_CW);
+ glutWireTeapot(orad); /* orad doubles as size input */
+ glFrontFace(GL_CCW);
+}
+
#define RADIUS 1.0f
+
+static void drawSolidCuboctahedron(void)
+{
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 );
@@ -110,16 +133,36 @@ static void drawSolidCuboctahedron(void)
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,-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();
-#undef RADIUS
}
+
static void drawWireCuboctahedron(void)
{
+ 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 );
+ 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 );
+ 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 );
+ 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 );
+ 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 );
+ 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 );
+ glEnd();
}
+#undef RADIUS
+
/*
* This structure defines an entry in our function-table.
*/
@@ -150,21 +193,12 @@ static const entry table [] =
#undef ENTRY
/*!
- Does printf()-like work using freeglut/OpenGLUT
+ Does printf()-like work using freeglut
glutBitmapString(). Uses a fixed font. Prints
at the indicated row/column position.
Limitation: Cannot address pixels.
Limitation: Renders in screen coords, not model coords.
-
- \note Uses a fixed, 256-byte array for holding strings.
- The best way around this would be to use vasprintf(),
- but that is not available on WIN32, I believe.
- Another alternative would be to write our own formatter
- from scratch and emit the characters one at a time to
- the GLUT bitmap single-character drawing routine.
- We could also use vsnprintf(), but I'm not sure if
- that is standard...
*/
static void shapesPrintf (int row, int col, const char *fmt, ...)
{
@@ -174,7 +208,11 @@ static void shapesPrintf (int row, int col, const char *fmt, ...)
va_list args;
va_start(args, fmt);
- (void) vsprintf (buf, fmt, args);
+#if defined(WIN32) && !defined(__CYGWIN__)
+ (void) _vsnprintf (buf, sizeof(buf), fmt, args);
+#else
+ (void) vsnprintf (buf, sizeof(buf), fmt, args);
+#endif
va_end(args);
glGetIntegerv(GL_VIEWPORT,viewport);
@@ -191,9 +229,9 @@ static void shapesPrintf (int row, int col, const char *fmt, ...)
glRasterPos2i
(
glutBitmapWidth(font, ' ') * col,
- - glutBitmapHeight(font) * (row+2) + viewport[3]
+ - glutBitmapHeight(font) * row + viewport[3]
);
- glutBitmapString (font, buf);
+ glutBitmapString (font, (unsigned char*)buf);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
@@ -205,16 +243,9 @@ static void shapesPrintf (int row, int col, const char *fmt, ...)
static void
resize(int width, int height)
{
- const float ar = (float) width / (float) height;
+ ar = (float) width / (float) height;
glViewport(0, 0, width, height);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity() ;
}
static void display(void)
@@ -222,12 +253,19 @@ static void display(void)
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ if (persProject)
+ glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
+ else
+ glOrtho(-ar*3, ar*3, -3.0, 3.0, 2.0, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_LIGHTING);
- printf ( "Shape %d slides %d stacks %d\n", function_index, slices, stacks ) ;
-
glColor3d(1,0,0);
glPushMatrix();
@@ -247,13 +285,17 @@ static void display(void)
glDisable(GL_LIGHTING);
glColor3d(0.1,0.1,0.4);
-/* shapesPrintf (1, 3, "Shape PgUp PgDn: %s", table [function_index].name);
- shapesPrintf (2, 3, " Slices +-: %d Stacks <>: %d", slices, stacks);
- shapesPrintf (3, 3, " nSides +-: %d nRings <>: %d", slices, stacks);
- shapesPrintf (4, 3, " Depth (): %d", depth);
- shapesPrintf (5, 3, " Outer radius Up Down : %f", orad);
- shapesPrintf (6, 3, " Inner radius Left Right: %f", irad);
-*/
+ 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);
+ } else {
+ printf ( "Shape %d slides %d stacks %d\n", function_index, slices, stacks ) ;
+ }
+
glutSwapBuffers();
}
@@ -267,6 +309,9 @@ key(unsigned char key, int x, int y)
case 'Q':
case 'q': glutLeaveMainLoop () ; break;
+ case 'I':
+ case 'i': show_info = ( show_info == GL_TRUE ) ? GL_FALSE : GL_TRUE; break;
+
case '=':
case '+': slices++; break;
@@ -285,6 +330,9 @@ key(unsigned char key, int x, int y)
case '0':
case ')': ++depth; break;
+ case 'P':
+ case 'p': persProject=!persProject; break;
+
default:
break;
}
@@ -340,9 +388,9 @@ main(int argc, char *argv[])
glutInitWindowSize(640,480);
glutInitWindowPosition(40,40);
glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
- glutCreateWindow("OpenGLUT Shapes");
+ glutCreateWindow("FreeGLUT Shapes");
glutReshapeFunc(resize);
glutDisplayFunc(display);
@@ -375,8 +423,9 @@ main(int argc, char *argv[])
glutMainLoop();
-#ifdef WIN32
- _CrtDumpMemoryLeaks () ; // DUMP MEMORY LEAK INFORMATION
+#ifdef _MSC_VER
+ /* DUMP MEMORY LEAK INFORMATION */
+ _CrtDumpMemoryLeaks () ;
#endif
return EXIT_SUCCESS;