X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=progs%2Fdemos%2Fshapes%2Fshapes.c;h=69c0a1a94da8ee20a70dedfefc7adb3b9b7f1281;hb=b1ed93dd348f7b8f3bd2c75474f5d4151d502f1f;hp=e07312dfae225ddf52cf4520f301f1c0b26194b8;hpb=d3dc239e57c2ea812b0c9be8983a2506b10a585e;p=freeglut diff --git a/progs/demos/shapes/shapes.c b/progs/demos/shapes/shapes.c index e07312d..69c0a1a 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 */ @@ -44,6 +44,7 @@ #include #include #include +#include #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 */ @@ -93,11 +94,6 @@ typedef char ourGLchar; #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); @@ -149,6 +145,11 @@ void initExtensionEntries(void) 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[] = { @@ -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. */ @@ -462,24 +464,22 @@ static void drawSolidCone(void) { glutSolidCone(irad,orad,slices, 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 @@ -554,6 +554,8 @@ static const entry table [] = 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), @@ -690,6 +692,7 @@ static void display(void) 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(); @@ -797,10 +800,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': @@ -851,10 +854,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; + } }