shapes demo: added flat shading option (fixed-function only)
[freeglut] / progs / demos / shapes / shapes.c
index 2fe6bb4..09fb5ef 100644 (file)
@@ -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:
       -    <tt>Esc &nbsp;</tt> Quit
       -    <tt>q Q &nbsp;</tt> Quit
@@ -34,7 +34,7 @@
 
     \author  Portions Copyright (C) 2004, the OpenGLUT project contributors. <br>
              OpenGLUT branched from freeglut in February, 2004.
+
     \image   html openglut_shapes.png OpenGLUT Geometric Shapes Demonstration
     \include demos/shapes/shapes.c
 */
@@ -44,6 +44,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <stddef.h>
 
 #include "glmatrix.h"
 
@@ -62,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
  */
@@ -282,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
@@ -292,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. */
 
@@ -423,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
@@ -651,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
@@ -681,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();
 
@@ -798,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':
@@ -818,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;
 
@@ -852,10 +867,12 @@ static void special (int key, int x, int y)
 
     /* 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;
+    }
 }