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 </tt> Quit
- <tt>q Q </tt> Quit
- <tt>i I </tt> Show info
- <tt>p P </tt> Toggle perspective or orthographic projection
- <tt>r R </tt> Toggle fixed or animated rotation around model X-axis
+ - <tt>s S </tt> Toggle toggle fixed function or shader render path
+ - <tt>n N </tt> Toggle visualization of object's normal vectors
- <tt>= + </tt> Increase \a slices
- <tt>- _ </tt> Decreate \a slices
- <tt>, < </tt> Decreate \a stacks
\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
*/
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stddef.h>
#include "glmatrix.h"
}
/*
- * 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
*/
#define APIENTRY
#endif
-#ifndef GL_VERSION_1_5
-typedef void (APIENTRY *PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
-typedef void (APIENTRY *PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
-typedef void (APIENTRY *PFNGLBUFFERDATAPROC) (GLenum target, ourGLsizeiptr size, const GLvoid *data, GLenum usage);
-#endif
#ifndef GL_VERSION_2_0
typedef GLuint (APIENTRY *PFNGLCREATESHADERPROC) (GLenum type);
typedef void (APIENTRY *PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const ourGLchar **string, const GLint *length);
gl_GetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) glutGetProcAddress ("glGetUniformLocation");
gl_UniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) glutGetProcAddress ("glUniformMatrix4fv");
gl_UniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) glutGetProcAddress ("glUniformMatrix3fv");
+ if (!gl_CreateShader || !gl_ShaderSource || !gl_CompileShader || !gl_CreateProgram || !gl_AttachShader || !gl_LinkProgram || !gl_UseProgram || !gl_GetShaderiv || !gl_GetShaderInfoLog || !gl_GetProgramiv || !gl_GetProgramInfoLog || !gl_GetAttribLocation || !gl_GetUniformLocation || !gl_UniformMatrix4fv || !gl_UniformMatrix3fv)
+ {
+ fprintf (stderr, "glCreateShader, glShaderSource, glCompileShader, glCreateProgram, glAttachShader, glLinkProgram, glUseProgram, glGetShaderiv, glGetShaderInfoLog, glGetProgramiv, glGetProgramInfoLog, glGetAttribLocation, glGetUniformLocation, glUniformMatrix4fv or gl_UniformMatrix3fv not found");
+ exit(1);
+ }
}
const ourGLchar *vertexShaderSource[] = {
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
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. */
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 */
+/* per Glut manpage, it should be noted that the teapot is rendered
+ * with clockwise winding for front facing polygons...
+ * Same for the teacup and teaspoon
+ */
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);
-}
+{ glFrontFace(GL_CW); glutSolidTeapot(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
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);
-}
+{ glFrontFace(GL_CW); glutWireTeapot(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
+static void drawSolidTeacup(void)
+{ glFrontFace(GL_CW); glutSolidTeacup(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
+static void drawWireTeacup(void)
+{ glFrontFace(GL_CW); glutWireTeacup(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
+static void drawSolidTeaspoon(void)
+{ glFrontFace(GL_CW); glutSolidTeaspoon(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
+static void drawWireTeaspoon(void)
+{ glFrontFace(GL_CW); glutWireTeaspoon(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
#define RADIUSFAC 0.70710678118654752440084436210485f
ENTRY (Icosahedron,GEO_NO_SIZE),
ENTRY (SierpinskiSponge,GEO_SCALE),
ENTRY (Teapot,GEO_SIZE),
+ ENTRY (Teacup,GEO_SIZE),
+ ENTRY (Teaspoon,GEO_SIZE),
ENTRY (Torus,GEO_INNER_OUTER_RAD),
ENTRY (Sphere,GEO_RAD),
ENTRY (Cone,GEO_BASE_HEIGHT),
gl_UseProgram (program);
glutSetVertexAttribCoord3(attribute_fg_coord);
glutSetVertexAttribNormal(attribute_fg_normal);
+ /* There is also a glutSetVertexAttribTexCoord2, which is used only when drawing the teapot, teacup or teaspoon */
gl_matrix_mode(GL_PROJECTION);
gl_load_identity();
case '.':
case '>': stacks++; break;
- case '9':
+ case '9':
case '(': if( depth > -1 ) depth--; break;
- case '0':
+ case '0':
case ')': ++depth; break;
case 'P':
/* 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;
+ }
}