X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=progs%2Fdemos%2Fshapes%2Fshapes.c;h=271ea04c0ee551751420a102323f73d4b0f8df63;hb=b38f7bf82ab934dce11fbfdd21ca32da72f73c6a;hp=66eb8d4b596411f5e4ee9ba4ebac66bc4b4adc63;hpb=2de8ecb067e6142a4f0d717c1e5bef62f3f53b81;p=freeglut diff --git a/progs/demos/shapes/shapes.c b/progs/demos/shapes/shapes.c index 66eb8d4..271ea04 100644 --- a/progs/demos/shapes/shapes.c +++ b/progs/demos/shapes/shapes.c @@ -13,6 +13,8 @@ - Esc   Quit - q Q   Quit - i I   Show info + - p P   Toggle perspective or orthographic projection + - r R   Toggle fixed or animated rotation around model X-axis - = +   Increase \a slices - - _   Decreate \a slices - , <   Decreate \a stacks @@ -60,40 +62,59 @@ 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; +static GLboolean animateXRot = GL_FALSE; /* * 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 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 @@ -174,7 +195,7 @@ 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. @@ -189,7 +210,11 @@ static void shapesPrintf (int row, int col, const char *fmt, ...) va_list args; va_start(args, fmt); +#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); @@ -206,7 +231,7 @@ 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, (unsigned char*)buf); @@ -220,22 +245,25 @@ 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) { const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0; const double a = t*90.0; + const double b = (animateXRot?t:1)*60.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); @@ -245,14 +273,14 @@ static void display(void) glPushMatrix(); glTranslated(0,1.2,-6); - glRotated(60,1,0,0); + glRotated(b,1,0,0); glRotated(a,0,0,1); table [function_index].solid (); glPopMatrix(); glPushMatrix(); glTranslated(0,-1.2,-6); - glRotated(60,1,0,0); + glRotated(b,1,0,0); glRotated(a,0,0,1); table [function_index].wire (); glPopMatrix(); @@ -261,12 +289,12 @@ static void display(void) glColor3d(0.1,0.1,0.4); if( show_info ) { - 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); + 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 ) ; } @@ -305,6 +333,12 @@ key(unsigned char key, int x, int y) case '0': case ')': ++depth; break; + case 'P': + case 'p': persProject=!persProject; break; + + case 'R': + case 'r': animateXRot=!animateXRot; break; + default: break; } @@ -360,9 +394,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);