diff options
author | Eric Anholt <eric@anholt.net> | 2010-05-21 09:32:38 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2010-05-21 12:20:39 -0700 |
commit | 68fc4b415e322f6744299e39864fbc377c6eff74 (patch) | |
tree | 4bafffd8b0105174f3c5c0ae327a005be9145990 /progs/demos/fslight.c | |
parent | e4f4489e3fc0b36d72821b55794fb843b2b7fa5f (diff) |
Remove demos that have moved to git+ssh://git.freedesktop.org/git/mesa/demos.
The remaining programs are ones I've had difficulty finding a build
environment for to make the build system or are unit tests that should
probably live next to their code instead. Hopefully people can bring
over the build for remaining pieces they care about.
Diffstat (limited to 'progs/demos/fslight.c')
-rw-r--r-- | progs/demos/fslight.c | 619 |
1 files changed, 0 insertions, 619 deletions
diff --git a/progs/demos/fslight.c b/progs/demos/fslight.c deleted file mode 100644 index 91a5a80132..0000000000 --- a/progs/demos/fslight.c +++ /dev/null @@ -1,619 +0,0 @@ -/** - * Test OpenGL 2.0 vertex/fragment shaders. - * Brian Paul - * 1 November 2006 - * - * Based on ARB version by: - * Michal Krol - * 20 February 2006 - * - * Based on the original demo by: - * Brian Paul - * 17 April 2003 - */ - -#include <assert.h> -#include <string.h> -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <GL/gl.h> -#include <GL/glut.h> -#include <GL/glext.h> -#include "extfuncs.h" - - -#define TEXTURE 0 - -static GLint CoordAttrib = 0; - -static char *FragProgFile = NULL; -static char *VertProgFile = NULL; - -static GLfloat diffuse[4] = { 0.5f, 0.5f, 1.0f, 1.0f }; -static GLfloat specular[4] = { 0.8f, 0.8f, 0.8f, 1.0f }; -static GLfloat lightPos[4] = { 0.0f, 10.0f, 20.0f, 0.0f }; -static GLfloat delta = 1.0f; - -static GLuint fragShader; -static GLuint vertShader; -static GLuint program; - -static GLint uDiffuse; -static GLint uSpecular; -static GLint uTexture; - -static GLuint SphereList, RectList, CurList; -static GLint win = 0; -static GLboolean anim = GL_TRUE; -static GLboolean wire = GL_FALSE; -static GLboolean pixelLight = GL_TRUE; - -static GLint t0 = 0; -static GLint frames = 0; - -static GLfloat xRot = 90.0f, yRot = 0.0f; - - -static void -normalize(GLfloat *dst, const GLfloat *src) -{ - GLfloat len = sqrt(src[0] * src[0] + src[1] * src[1] + src[2] * src[2]); - dst[0] = src[0] / len; - dst[1] = src[1] / len; - dst[2] = src[2] / len; - dst[3] = src[3]; -} - - -static void -Redisplay(void) -{ - GLfloat vec[4]; - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - /* update light position */ - normalize(vec, lightPos); - glLightfv(GL_LIGHT0, GL_POSITION, vec); - - if (pixelLight) { - glUseProgram_func(program); - glDisable(GL_LIGHTING); - } - else { - glUseProgram_func(0); - glEnable(GL_LIGHTING); - } - - glPushMatrix(); - glRotatef(xRot, 1.0f, 0.0f, 0.0f); - glRotatef(yRot, 0.0f, 1.0f, 0.0f); - /* - glutSolidSphere(2.0, 10, 5); - */ - glCallList(CurList); - glPopMatrix(); - - glutSwapBuffers(); - frames++; - - if (anim) { - GLint t = glutGet(GLUT_ELAPSED_TIME); - if (t - t0 >= 5000) { - GLfloat seconds =(GLfloat)(t - t0) / 1000.0f; - GLfloat fps = frames / seconds; - printf("%d frames in %6.3f seconds = %6.3f FPS\n", - frames, seconds, fps); - fflush(stdout); - t0 = t; - frames = 0; - } - } -} - - -static void -Idle(void) -{ - lightPos[0] += delta; - if (lightPos[0] > 25.0f || lightPos[0] < -25.0f) - delta = -delta; - glutPostRedisplay(); -} - - -static void -Reshape(int width, int height) -{ - glViewport(0, 0, width, height); - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glTranslatef(0.0f, 0.0f, -15.0f); -} - - -static void -CleanUp(void) -{ - glDeleteShader_func(fragShader); - glDeleteShader_func(vertShader); - glDeleteProgram_func(program); - glutDestroyWindow(win); -} - - -static void -Key(unsigned char key, int x, int y) -{ - (void) x; - (void) y; - - switch(key) { - case ' ': - case 'a': - anim = !anim; - if (anim) - glutIdleFunc(Idle); - else - glutIdleFunc(NULL); - break; - case 'x': - lightPos[0] -= 1.0f; - break; - case 'X': - lightPos[0] += 1.0f; - break; - case 'w': - wire = !wire; - if (wire) - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - else - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - break; - case 'o': - if (CurList == SphereList) - CurList = RectList; - else - CurList = SphereList; - break; - case 'p': - pixelLight = !pixelLight; - if (pixelLight) - printf("Per-pixel lighting\n"); - else - printf("Conventional lighting\n"); - break; - case 27: - CleanUp(); - exit(0); - break; - } - glutPostRedisplay(); -} - - -static void -SpecialKey(int key, int x, int y) -{ - const GLfloat step = 3.0f; - - (void) x; - (void) y; - - switch(key) { - case GLUT_KEY_UP: - xRot -= step; - break; - case GLUT_KEY_DOWN: - xRot += step; - break; - case GLUT_KEY_LEFT: - yRot -= step; - break; - case GLUT_KEY_RIGHT: - yRot += step; - break; - } - glutPostRedisplay(); -} - - -static void -TestFunctions(void) -{ - printf("Error 0x%x at line %d\n", glGetError(), __LINE__); - - assert(glIsProgram_func(program)); - assert(glIsShader_func(fragShader)); - assert(glIsShader_func(vertShader)); - - /* attached shaders */ - { - GLuint shaders[20]; - GLsizei count; - int i; - glGetAttachedShaders_func(program, 20, &count, shaders); - for (i = 0; i < count; i++) { - printf("Attached: %u\n", shaders[i]); - assert(shaders[i] == fragShader || - shaders[i] == vertShader); - } - } - - { - GLchar log[1000]; - GLsizei len; - glGetShaderInfoLog_func(vertShader, 1000, &len, log); - printf("Vert Shader Info Log: %s\n", log); - glGetShaderInfoLog_func(fragShader, 1000, &len, log); - printf("Frag Shader Info Log: %s\n", log); - glGetProgramInfoLog_func(program, 1000, &len, log); - printf("Program Info Log: %s\n", log); - } - - /* active uniforms */ - { - GLint n, max, i; - glGetProgramiv_func(program, GL_ACTIVE_UNIFORMS, &n); - glGetProgramiv_func(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &max); - printf("Num uniforms: %d Max name length: %d\n", n, max); - for (i = 0; i < n; i++) { - GLint size, len; - GLenum type; - char name[100]; - glGetActiveUniform_func(program, i, 100, &len, &size, &type, name); - printf(" %d: %s nameLen=%d size=%d type=0x%x\n", - i, name, len, size, type); - } - } -} - - -#if TEXTURE -static void -MakeTexture(void) -{ -#define SZ0 64 -#define SZ1 32 - GLubyte image0[SZ0][SZ0][SZ0][4]; - GLubyte image1[SZ1][SZ1][SZ1][4]; - GLuint i, j, k; - - /* level 0: two-tone gray checkboard */ - for (i = 0; i < SZ0; i++) { - for (j = 0; j < SZ0; j++) { - for (k = 0; k < SZ0; k++) { - if ((i/8 + j/8 + k/8) & 1) { - image0[i][j][k][0] = - image0[i][j][k][1] = - image0[i][j][k][2] = 200; - } - else { - image0[i][j][k][0] = - image0[i][j][k][1] = - image0[i][j][k][2] = 100; - } - image0[i][j][k][3] = 255; - } - } - } - - /* level 1: two-tone green checkboard */ - for (i = 0; i < SZ1; i++) { - for (j = 0; j < SZ1; j++) { - for (k = 0; k < SZ1; k++) { - if ((i/8 + j/8 + k/8) & 1) { - image1[i][j][k][0] = 0; - image1[i][j][k][1] = 250; - image1[i][j][k][2] = 0; - } - else { - image1[i][j][k][0] = 0; - image1[i][j][k][1] = 200; - image1[i][j][k][2] = 0; - } - image1[i][j][k][3] = 255; - } - } - } - - glActiveTexture(GL_TEXTURE2); /* unit 2 */ - glBindTexture(GL_TEXTURE_2D, 42); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, SZ0, SZ0, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image0); - glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, SZ1, SZ1, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image1); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - glActiveTexture(GL_TEXTURE4); /* unit 4 */ - glBindTexture(GL_TEXTURE_3D, 43); - glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, SZ0, SZ0, SZ0, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image0); - glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA, SZ1, SZ1, SZ1, 0, - GL_RGBA, GL_UNSIGNED_BYTE, image1); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -} -#endif - - -static void -MakeSphere(void) -{ - GLUquadricObj *obj = gluNewQuadric(); - SphereList = glGenLists(1); - gluQuadricTexture(obj, GL_TRUE); - glNewList(SphereList, GL_COMPILE); - gluSphere(obj, 2.0f, 10, 5); - glEndList(); - gluDeleteQuadric(obj); -} - -static void -VertAttrib(GLint index, float x, float y) -{ -#if 1 - glVertexAttrib2f_func(index, x, y); -#else - glTexCoord2f(x, y); -#endif -} - -static void -MakeRect(void) -{ - RectList = glGenLists(1); - glNewList(RectList, GL_COMPILE); - glNormal3f(0, 0, 1); - glBegin(GL_POLYGON); - VertAttrib(CoordAttrib, 0, 0); glVertex2f(-2, -2); - VertAttrib(CoordAttrib, 1, 0); glVertex2f( 2, -2); - VertAttrib(CoordAttrib, 1, 1); glVertex2f( 2, 2); - VertAttrib(CoordAttrib, 0, 1); glVertex2f(-2, 2); - glEnd(); /* XXX omit this and crash! */ - glEndList(); -} - - - -static void -LoadAndCompileShader(GLuint shader, const char *text) -{ - GLint stat; - - glShaderSource_func(shader, 1, (const GLchar **) &text, NULL); - - glCompileShader_func(shader); - - glGetShaderiv_func(shader, GL_COMPILE_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetShaderInfoLog_func(shader, 1000, &len, log); - fprintf(stderr, "fslight: problem compiling shader:\n%s\n", log); - exit(1); - } -} - - -/** - * Read a shader from a file. - */ -static void -ReadShader(GLuint shader, const char *filename) -{ - const int max = 100*1000; - int n; - char *buffer = (char*) malloc(max); - FILE *f = fopen(filename, "r"); - if (!f) { - fprintf(stderr, "fslight: Unable to open shader file %s\n", filename); - exit(1); - } - - n = fread(buffer, 1, max, f); - printf("fslight: read %d bytes from shader file %s\n", n, filename); - if (n > 0) { - buffer[n] = 0; - LoadAndCompileShader(shader, buffer); - } - - fclose(f); - free(buffer); -} - - -static void -CheckLink(GLuint prog) -{ - GLint stat; - glGetProgramiv_func(prog, GL_LINK_STATUS, &stat); - if (!stat) { - GLchar log[1000]; - GLsizei len; - glGetProgramInfoLog_func(prog, 1000, &len, log); - fprintf(stderr, "Linker error:\n%s\n", log); - } -} - - -static void -Init(void) -{ - static const char *fragShaderText = - "uniform vec4 diffuse;\n" - "uniform vec4 specular;\n" - "varying vec3 normal;\n" - "void main() {\n" - " // Compute dot product of light direction and normal vector\n" - " float dotProd = max(dot(gl_LightSource[0].position.xyz, \n" - " normalize(normal)), 0.0);\n" - " // Compute diffuse and specular contributions\n" - " gl_FragColor = diffuse * dotProd + specular * pow(dotProd, 20.0);\n" - "}\n"; - static const char *vertShaderText = - "varying vec3 normal;\n" - "void main() {\n" - " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" - " normal = gl_NormalMatrix * gl_Normal;\n" - "}\n"; - const char *version; - - version = (const char *) glGetString(GL_VERSION); - if (version[0] == '1') { - printf("This program requires OpenGL 2.x or higher, found %s\n", version); - exit(1); - } - - GetExtensionFuncs(); - - fragShader = glCreateShader_func(GL_FRAGMENT_SHADER); - if (FragProgFile) - ReadShader(fragShader, FragProgFile); - else - LoadAndCompileShader(fragShader, fragShaderText); - - - vertShader = glCreateShader_func(GL_VERTEX_SHADER); - if (VertProgFile) - ReadShader(vertShader, VertProgFile); - else - LoadAndCompileShader(vertShader, vertShaderText); - - program = glCreateProgram_func(); - glAttachShader_func(program, fragShader); - glAttachShader_func(program, vertShader); - glLinkProgram_func(program); - CheckLink(program); - glUseProgram_func(program); - - uDiffuse = glGetUniformLocation_func(program, "diffuse"); - uSpecular = glGetUniformLocation_func(program, "specular"); - uTexture = glGetUniformLocation_func(program, "texture"); - printf("DiffusePos %d SpecularPos %d TexturePos %d\n", - uDiffuse, uSpecular, uTexture); - - glUniform4fv_func(uDiffuse, 1, diffuse); - glUniform4fv_func(uSpecular, 1, specular); - /* assert(glGetError() == 0);*/ -#if TEXTURE - glUniform1i_func(uTexture, 2); /* use texture unit 2 */ -#endif - /*assert(glGetError() == 0);*/ - - if (CoordAttrib) { - int i; - glBindAttribLocation_func(program, CoordAttrib, "coord"); - i = glGetAttribLocation_func(program, "coord"); - assert(i >= 0); - if (i != CoordAttrib) { - printf("Hmmm, NVIDIA bug?\n"); - CoordAttrib = i; - } - else { - printf("Mesa bind attrib: coord = %d\n", i); - } - } - - /*assert(glGetError() == 0);*/ - - glClearColor(0.3f, 0.3f, 0.3f, 0.0f); - glEnable(GL_DEPTH_TEST); - glEnable(GL_LIGHT0); - glEnable(GL_LIGHTING); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse); - glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); - glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20.0f); - - MakeSphere(); - MakeRect(); - - CurList = SphereList; - -#if TEXTURE - MakeTexture(); -#endif - - printf("GL_RENDERER = %s\n",(const char *) glGetString(GL_RENDERER)); - printf("Press p to toggle between per-pixel and per-vertex lighting\n"); - - /* test glGetShaderSource() */ - if (0) { - GLsizei len = strlen(fragShaderText) + 1; - GLsizei lenOut; - GLchar *src =(GLchar *) malloc(len * sizeof(GLchar)); - glGetShaderSource_func(fragShader, 0, NULL, src); - glGetShaderSource_func(fragShader, len, &lenOut, src); - assert(len == lenOut + 1); - assert(strcmp(src, fragShaderText) == 0); - free(src); - } - - assert(glIsProgram_func(program)); - assert(glIsShader_func(fragShader)); - assert(glIsShader_func(vertShader)); - - glColor3f(1, 0, 0); - - /* for testing state vars */ - { - static GLfloat fc[4] = { 1, 1, 0, 0 }; - static GLfloat amb[4] = { 1, 0, 1, 0 }; - glFogfv(GL_FOG_COLOR, fc); - glLightfv(GL_LIGHT1, GL_AMBIENT, amb); - } - -#if 0 - TestFunctions(); -#else - (void) TestFunctions; -#endif -} - - -static void -ParseOptions(int argc, char *argv[]) -{ - int i; - for (i = 1; i < argc; i++) { - if (strcmp(argv[i], "-fs") == 0) { - FragProgFile = argv[++i]; - } - else if (strcmp(argv[i], "-vs") == 0) { - VertProgFile = argv[++i]; - } - else { - fprintf(stderr, "unknown option %s\n", argv[i]); - break; - } - } -} - - -int -main(int argc, char *argv[]) -{ - glutInitWindowSize(200, 200); - glutInit(&argc, argv); - glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); - win = glutCreateWindow(argv[0]); - glutReshapeFunc(Reshape); - glutKeyboardFunc(Key); - glutSpecialFunc(SpecialKey); - glutDisplayFunc(Redisplay); - if (anim) - glutIdleFunc(Idle); - ParseOptions(argc, argv); - Init(); - glutMainLoop(); - return 0; -} - - |