X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=progs%2Fdemos%2Fshapes%2Fshapes.c;h=ef329881a3f6acba314f4ed60696cb7b3226d017;hb=3a5df7e8d5491543374a287064a8b0430f8b715e;hp=4f0e904c2b51a1584e98c5ec43783cd10c166fdd;hpb=6111e1e5e9dd85f0883db8949b1f4bef69968687;p=freeglut diff --git a/progs/demos/shapes/shapes.c b/progs/demos/shapes/shapes.c index 4f0e904..ef32988 100644 --- a/progs/demos/shapes/shapes.c +++ b/progs/demos/shapes/shapes.c @@ -91,9 +91,12 @@ 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); typedef void (APIENTRY *PFNGLCOMPILESHADERPROC) (GLuint shader); @@ -109,6 +112,7 @@ typedef GLint (APIENTRY *PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const ourG typedef GLint (APIENTRY *PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const ourGLchar *name); typedef void (APIENTRY *PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); typedef void (APIENTRY *PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +#endif PFNGLCREATESHADERPROC gl_CreateShader; PFNGLSHADERSOURCEPROC gl_ShaderSource; @@ -153,9 +157,9 @@ const ourGLchar *vertexShaderSource[] = { " */", "attribute vec3 fg_coord;", "attribute vec3 fg_normal;", - "varying vec4 position; // position of the vertex (and fragment) in world space", - "varying vec3 varyingNormalDirection; // surface normal vector in world space", - "uniform mat4 m, p; // don't need v, as always identity in our demo", + "varying vec4 position; /* position of the vertex (and fragment) in world space */", + "varying vec3 varyingNormalDirection; /* surface normal vector in world space */", + "uniform mat4 m, p; /* don't need v, as always identity in our demo */", "uniform mat3 m_3x3_inv_transp;", " ", "void main()", @@ -164,7 +168,7 @@ const ourGLchar *vertexShaderSource[] = { " position = m * fg_coord4;", " varyingNormalDirection = normalize(m_3x3_inv_transp * fg_normal);", " ", - " mat4 mvp = p*m; // normally p*v*m", + " mat4 mvp = p*m; /* normally p*v*m */", " gl_Position = mvp * fg_coord4;", "}" }; @@ -175,9 +179,9 @@ const ourGLchar *fragmentShaderSource[] = { " * This file is in the public domain.", " * Contributors: Martin Kraus, Sylvain Beucler", " */", - "varying vec4 position; // position of the vertex (and fragment) in world space", - "varying vec3 varyingNormalDirection; // surface normal vector in world space", - "//uniform mat4 v_inv; // in this demo, the view matrix is always an identity matrix", + "varying vec4 position; /* position of the vertex (and fragment) in world space */", + "varying vec3 varyingNormalDirection; /* surface normal vector in world space */", + "/* uniform mat4 v_inv; // in this demo, the view matrix is always an identity matrix */", " ", "struct lightSource", "{", @@ -190,13 +194,13 @@ const ourGLchar *fragmentShaderSource[] = { "};", "lightSource light0 = lightSource(", " vec4(2.0, 5.0, 5.0, 0.0),", - " vec4(1.0, 1.0, 1.0, 1.0),", - " vec4(1.0, 1.0, 1.0, 1.0),", - " 0.0, 1.0, 0.0,", + " vec4(1.0, 1.0, 1.0, 1.0),", + " vec4(1.0, 1.0, 1.0, 1.0),", + " 0.0, 1.0, 0.0,", " 180.0, 0.0,", " vec3(0.0, 0.0, 0.0)", ");", - "vec4 scene_ambient = vec4(1.0, 0.0, 0.0, 1.0);", + "vec4 scene_ambient = vec4(0.2, 0.2, 0.2, 1.0);", " ", "struct material", "{", @@ -206,8 +210,8 @@ const ourGLchar *fragmentShaderSource[] = { " float shininess;", "};", "material frontMaterial = material(", - " vec4(0.7, 0.7, 0.7, 1.0),", - " vec4(0.8, 0.8, 0.8, 1.0),", + " vec4(1.0, 0.0, 0.0, 1.0),", + " vec4(1.0, 0.0, 0.0, 1.0),", " vec4(1.0, 1.0, 1.0, 1.0),", " 100.0", ");", @@ -215,17 +219,17 @@ const ourGLchar *fragmentShaderSource[] = { "void main()", "{", " vec3 normalDirection = normalize(varyingNormalDirection);", - " //vec3 viewDirection = normalize(vec3(v_inv * vec4(0.0, 0.0, 0.0, 1.0) - position));", - " vec3 viewDirection = normalize(vec3(vec4(0.0, 0.0, 0.0, 1.0) - position)); // in this demo, the view matrix is always an identity matrix", + " /* vec3 viewDirection = normalize(vec3(v_inv * vec4(0.0, 0.0, 0.0, 1.0) - position)); */", + " vec3 viewDirection = normalize(vec3(vec4(0.0, 0.0, 0.0, 1.0) - position)); /* in this demo, the view matrix is always an identity matrix */", " vec3 lightDirection;", " float attenuation;", " ", - " if (0.0 == light0.position.w) // directional light?", + " if (0.0 == light0.position.w) /* directional light? */", " {", - " attenuation = 1.0; // no attenuation", + " attenuation = 1.0; /* no attenuation */", " lightDirection = normalize(vec3(light0.position));", " } ", - " else // point light or spotlight (or other kind of light) ", + " else /* point light or spotlight (or other kind of light) */", " {", " vec3 positionToLightSource = vec3(light0.position - position);", " float distance = length(positionToLightSource);", @@ -234,10 +238,10 @@ const ourGLchar *fragmentShaderSource[] = { " + light0.linearAttenuation * distance", " + light0.quadraticAttenuation * distance * distance);", " ", - " if (light0.spotCutoff <= 90.0) // spotlight?", + " if (light0.spotCutoff <= 90.0) /* spotlight? */", " {", " float clampedCosine = max(0.0, dot(-lightDirection, light0.spotDirection));", - " if (clampedCosine < cos(radians(light0.spotCutoff))) // outside of spotlight cone?", + " if (clampedCosine < cos(radians(light0.spotCutoff))) /* outside of spotlight cone? */", " {", " attenuation = 0.0;", " }", @@ -255,11 +259,11 @@ const ourGLchar *fragmentShaderSource[] = { " * max(0.0, dot(normalDirection, lightDirection));", " ", " vec3 specularReflection;", - " if (dot(normalDirection, lightDirection) < 0.0) // light source on the wrong side?", + " if (dot(normalDirection, lightDirection) < 0.0) /* light source on the wrong side? */", " {", - " specularReflection = vec3(0.0, 0.0, 0.0); // no specular reflection", + " specularReflection = vec3(0.0, 0.0, 0.0); /* no specular reflection */", " }", - " else // light source on the right side", + " else /* light source on the right side */", " {", " specularReflection = attenuation * vec3(light0.specular) * vec3(frontMaterial.specular) ", " * pow(max(0.0, dot(reflect(-lightDirection, normalDirection), viewDirection)), frontMaterial.shininess);", @@ -297,7 +301,7 @@ GLint getAttribOrUniformLocation(const char* name, GLuint program, GLboolean isA GLuint program; 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 somehow unusable. +GLint shaderReady = 0; /* Set to 1 when all initialization went well, to -1 when shader somehow unusable. */ @@ -416,6 +420,7 @@ static float ar; static GLboolean persProject = GL_TRUE; static GLboolean animateXRot = GL_FALSE; static GLboolean useShader = GL_FALSE; +static GLboolean visNormals = GL_FALSE; /* * These one-liners draw particular objects, fetching appropriate @@ -463,54 +468,56 @@ static void drawWireTeapot(void) glFrontFace(GL_CCW); } -#define RADIUS 1.0f +#define RADIUSFAC 0.70710678118654752440084436210485f static void drawSolidCuboctahedron(void) { + GLfloat radius = RADIUSFAC*(GLfloat)orad; /* orad doubles as size */ glBegin( GL_TRIANGLES ); - glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS, RADIUS ); glVertex3d( RADIUS, 0.0, RADIUS ); - glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS,-RADIUS ); - glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, RADIUS ); - glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS,-RADIUS ); glVertex3d( RADIUS, 0.0,-RADIUS ); - glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, RADIUS ); - glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS,-RADIUS ); glVertex3d(-RADIUS, 0.0,-RADIUS ); - glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS, RADIUS ); glVertex3d(-RADIUS, 0.0, RADIUS ); - glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS,-RADIUS ); + glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius ); glVertex3d( radius, 0.0, radius ); + glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius ); + glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius ); + glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius ); glVertex3d( radius, 0.0,-radius ); + glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0, radius, radius ); + glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, 0.0,-radius ); + glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius, 0.0, radius ); + glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius ); glEnd(); glBegin( GL_QUADS ); - glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); - glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0, RADIUS ); - glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS,-RADIUS ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS, RADIUS ); - glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS, RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS,-RADIUS ); - glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, RADIUS ); glVertex3d(-RADIUS, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, RADIUS ); - glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS,-RADIUS ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS,-RADIUS ); + glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0,-radius ); + glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0, radius ); + glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius ); + glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius ); + glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0, radius, radius ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius ); + glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius ); glEnd(); } static void drawWireCuboctahedron(void) { + GLfloat radius = RADIUSFAC*(GLfloat)orad; /* orad doubles as size */ glBegin( GL_LINE_LOOP ); - glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); + glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0,-radius ); glEnd(); glBegin( GL_LINE_LOOP ); - glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d(-RADIUS, 0.0, RADIUS ); + glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0, radius ); glEnd(); glBegin( GL_LINE_LOOP ); - glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS,-RADIUS ); glVertex3d(-RADIUS, RADIUS, 0.0 ); glVertex3d( 0.0, RADIUS, RADIUS ); + glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius ); glEnd(); glBegin( GL_LINE_LOOP ); - glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS, RADIUS ); glVertex3d(-RADIUS,-RADIUS, 0.0 ); glVertex3d( 0.0,-RADIUS,-RADIUS ); + glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius ); glEnd(); glBegin( GL_LINE_LOOP ); - glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( RADIUS, 0.0, RADIUS ); glVertex3d( 0.0, RADIUS, RADIUS ); glVertex3d(-RADIUS, 0.0, RADIUS ); glVertex3d( 0.0,-RADIUS, RADIUS ); + glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0, radius, radius ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius ); glEnd(); glBegin( GL_LINE_LOOP ); - glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0,-RADIUS,-RADIUS ); glVertex3d(-RADIUS, 0.0,-RADIUS ); glVertex3d( 0.0, RADIUS,-RADIUS ); + glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius ); glEnd(); } -#undef RADIUS +#undef RADIUSFAC /* * This structure defines an entry in our function-table. @@ -537,7 +544,7 @@ static const entry table [] = ENTRY (Sphere), ENTRY (Cone), ENTRY (Cylinder), - ENTRY (Cuboctahedron) + ENTRY (Cuboctahedron) /* This one doesn't work when in shader mode and is then skipped */ }; #undef ENTRY @@ -600,8 +607,8 @@ resize(int width, int height) 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; + const double a = t*89.0; + const double b = (animateXRot?t:1)*67.0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -610,7 +617,7 @@ static void display(void) if (useShader && shaderReady) { - // setup use of shader (and vertex buffer by FreeGLUT) + /* setup use of shader (and vertex buffer by FreeGLUT) */ gl_UseProgram (program); glutSetVertexAttribCoord3(attribute_fg_coord); glutSetVertexAttribNormal(attribute_fg_normal); @@ -655,6 +662,7 @@ static void display(void) else { /* fixed function pipeline */ + glutSetOption(GLUT_OBJECTS_VISUALIZE_NORMALS,visNormals); /* Normals visualized or not? */ glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (persProject) @@ -694,14 +702,21 @@ static void display(void) shapesPrintf (5, 1, "Outer radius Up Down : %f", orad); shapesPrintf (6, 1, "Inner radius Left Right: %f", irad); if (persProject) - shapesPrintf (7, 1, "Perspective projection"); + shapesPrintf (7, 1, "Perspective projection (p)"); else - shapesPrintf (7, 1, "Orthographic projection"); + shapesPrintf (7, 1, "Orthographic projection (p)"); if (useShader) - shapesPrintf (8, 1, "Using shader"); + shapesPrintf (8, 1, "Using shader (s)"); + else + shapesPrintf (8, 1, "Using fixed function pipeline (s)"); + if (animateXRot) + shapesPrintf (9, 1, "2D rotation (r)"); else - shapesPrintf (8, 1, "Using fixed function pipeline"); + shapesPrintf (9, 1, "1D rotation (r)"); + if (!useShader) + shapesPrintf (10, 1, "visualizing normals: %i (n)",visNormals); } else { + /* print to command line instead */ printf ( "Shape %d slides %d stacks %d\n", function_index, slices, stacks ) ; } @@ -746,7 +761,15 @@ key(unsigned char key, int x, int y) case 'r': animateXRot=!animateXRot; break; case 'S': - case 's': useShader=!useShader; break; + case 's': + useShader=!useShader; + /* Cuboctahedron can't be shown when in shader mode, move to next */ + if (useShader && NUMBEROF (table)-1 == ( unsigned )function_index) + function_index = 0; + break; + + case 'N': + case 'n': visNormals=!visNormals; break; default: break; @@ -776,6 +799,13 @@ static void special (int key, int x, int y) if (NUMBEROF (table) <= ( unsigned )function_index) function_index = 0; + + /* 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; } @@ -800,7 +830,7 @@ const GLfloat high_shininess[] = { 100.0f }; int main(int argc, char *argv[]) { - glutInitWindowSize(640,480); + glutInitWindowSize(800,600); glutInitWindowPosition(40,40); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);