X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=progs%2Fdemos%2Fshapes%2Fshapes.c;h=09fb5efa2dafe45eb203e05bd56166478d710648;hb=HEAD;hp=d132777ae0220bb406b1ad87c7bd3fb96f7bca42;hpb=a91c4e11d70265093dc3a7c15ed3f1b07883e9df;p=freeglut diff --git a/progs/demos/shapes/shapes.c b/progs/demos/shapes/shapes.c index d132777..09fb5ef 100644 --- a/progs/demos/shapes/shapes.c +++ b/progs/demos/shapes/shapes.c @@ -5,10 +5,10 @@ in OpenGLUT. It may also be useful to see which parameters control what behavior in the OpenGLUT objects. - + Spinning wireframe and solid-shaded shapes are displayed. Some parameters can be adjusted. - + Keys: - Esc   Quit - q Q   Quit @@ -34,7 +34,7 @@ \author Portions Copyright (C) 2004, the OpenGLUT project contributors.
OpenGLUT branched from freeglut in February, 2004. - + \image html openglut_shapes.png OpenGLUT Geometric Shapes Demonstration \include demos/shapes/shapes.c */ @@ -63,7 +63,7 @@ void checkError(const char *functionName) } /* - * OpenGL 2+ shader mode needs some function and macro definitions, + * OpenGL 2+ shader mode needs some function and macro definitions, * avoiding a dependency on additional libraries like GLEW or the * GL/glext.h header */ @@ -283,9 +283,10 @@ GLint getAttribOrUniformLocation(const char* name, GLuint program, GLboolean isA GLint attrib = gl_GetAttribLocation(program, name); if (attrib == -1) { - fprintf(stderr, "Warning: Could not bind attrib %s\n", name); + fprintf(stderr, "Warning: Could not bind attrib %s\n", name); } + checkError ("getAttribOrUniformLocation"); return attrib; } else @@ -293,16 +294,16 @@ GLint getAttribOrUniformLocation(const char* name, GLuint program, GLboolean isA GLint uniform = gl_GetUniformLocation(program, name); if (uniform == -1) { - fprintf(stderr, "Warning: Could not bind uniform %s\n", name); + fprintf(stderr, "Warning: Could not bind uniform %s\n", name); } + checkError ("getAttribOrUniformLocation"); return uniform; } - checkError ("getAttribOrUniformLocation"); } GLuint program; -GLint attribute_fg_coord = -1, attribute_fg_normal = -1; +GLint attribute_fg_coord = -1, attribute_fg_normal = -1; GLint uniform_m = -1, uniform_p = -1, uniform_m_3x3_inv_transp = -1; GLint shaderReady = 0; /* Set to 1 when all initialization went well, to -1 when shader somehow unusable. */ @@ -424,6 +425,7 @@ static GLboolean persProject = GL_TRUE; static GLboolean animateXRot = GL_FALSE; static GLboolean useShader = GL_FALSE; static GLboolean visNormals = GL_FALSE; +static GLboolean flat; /* * Enum to tell drawSizeInfo what to draw for each object @@ -652,10 +654,15 @@ static void drawInfo() shapesPrintf (row++, 1, "Perspective projection (p)"); else shapesPrintf (row++, 1, "Orthographic projection (p)"); - if (useShader) + if (useShader) { shapesPrintf (row++, 1, "Using shader (s)"); - else + } else { shapesPrintf (row++, 1, "Using fixed function pipeline (s)"); + if (flat) + shapesPrintf (row++, 1, "Flat shading (f)"); + else + shapesPrintf (row++, 1, "Smooth shading (f)"); + } if (animateXRot) shapesPrintf (row++, 1, "2D rotation (r)"); else @@ -682,6 +689,8 @@ static void display(void) glutSetOption(GLUT_GEOMETRY_VISUALIZE_NORMALS,visNormals); /* Normals visualized or not? */ + glShadeModel(flat ? GL_FLAT : GL_SMOOTH); /* flat or gouraud shading */ + if (useShader && !shaderReady) initShader(); @@ -799,10 +808,10 @@ key(unsigned char key, int x, int y) case '.': case '>': stacks++; break; - case '9': + case '9': case '(': if( depth > -1 ) depth--; break; - case '0': + case '0': case ')': ++depth; break; case 'P': @@ -819,6 +828,11 @@ key(unsigned char key, int x, int y) function_index = 0; break; + case 'F': + case 'f': + flat ^= 1; + break; + case 'N': case 'n': visNormals=!visNormals; break;