summaryrefslogtreecommitdiff
path: root/progs/demos/gloss.c
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2010-05-21 09:32:38 -0700
committerEric Anholt <eric@anholt.net>2010-05-21 12:20:39 -0700
commit68fc4b415e322f6744299e39864fbc377c6eff74 (patch)
tree4bafffd8b0105174f3c5c0ae327a005be9145990 /progs/demos/gloss.c
parente4f4489e3fc0b36d72821b55794fb843b2b7fa5f (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/gloss.c')
-rw-r--r--progs/demos/gloss.c475
1 files changed, 0 insertions, 475 deletions
diff --git a/progs/demos/gloss.c b/progs/demos/gloss.c
deleted file mode 100644
index ddfd548b8b..0000000000
--- a/progs/demos/gloss.c
+++ /dev/null
@@ -1,475 +0,0 @@
-
-/*
- * Specular reflection demo. The specular highlight is modulated by
- * a sphere-mapped texture. The result is a high-gloss surface.
- * NOTE: you really need hardware acceleration for this.
- * Also note, this technique can't be implemented with multi-texture
- * and separate specular color interpolation because there's no way
- * to indicate that the second texture unit (the reflection map)
- * should modulate the specular color and not the base color.
- * A future multi-texture extension could fix that.
- *
- * Command line options:
- * -info print GL implementation information
- *
- *
- * Brian Paul October 22, 1999 This program is in the public domain.
- */
-
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-#include <GL/glew.h>
-#include <GL/glut.h>
-
-#include "readtex.h"
-#include "trackball.h"
-
-
-#define SPECULAR_TEXTURE_FILE "../images/reflect.rgb"
-#define BASE_TEXTURE_FILE "../images/tile.rgb"
-
-/* Menu items */
-#define DO_SPEC_TEXTURE 1
-#define OBJECT 2
-#define ANIMATE 3
-#define QUIT 100
-
-/* for convolution */
-#define FILTER_SIZE 7
-
-static GLint Win;
-static GLint WinWidth = 500, WinHeight = 500;
-static GLuint CylinderObj = 0;
-static GLuint TeapotObj = 0;
-static GLuint Object = 0;
-static GLboolean Animate = GL_TRUE;
-
-static float CurQuat[4] = { 0, 0, 0, 1 };
-
-static GLfloat Black[4] = { 0, 0, 0, 0 };
-static GLfloat White[4] = { 1, 1, 1, 1 };
-static GLfloat Diffuse[4] = { .3, .3, 1.0, 1.0 }; /* blue */
-static GLfloat Shininess = 6;
-
-static GLuint BaseTexture, SpecularTexture;
-static GLboolean DoSpecTexture = GL_TRUE;
-
-static GLboolean ButtonDown = GL_FALSE;
-static GLint ButtonX, ButtonY;
-
-
-/* performance info */
-static GLint T0 = 0;
-static GLint Frames = 0;
-
-
-static void Idle( void )
-{
- static const float yAxis[3] = {0, 1, 0};
- static double t0 = -1.;
- float quat[4];
- double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
- if (t0 < 0.0)
- t0 = t;
- dt = t - t0;
- t0 = t;
-
- axis_to_quat(yAxis, 2.0 * dt, quat);
- add_quats(quat, CurQuat, CurQuat);
-
- glutPostRedisplay();
-}
-
-
-static void Display( void )
-{
- GLfloat rot[4][4];
-
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
-
- glPushMatrix();
- build_rotmatrix(rot, CurQuat);
- glMultMatrixf(&rot[0][0]);
-
- /* First pass: diffuse lighting with base texture */
- glMaterialfv(GL_FRONT, GL_DIFFUSE, Diffuse);
- glMaterialfv(GL_FRONT, GL_SPECULAR, Black);
- glEnable(GL_TEXTURE_2D);
- glBindTexture(GL_TEXTURE_2D, BaseTexture);
- glCallList(Object);
-
- /* Second pass: specular lighting with reflection texture */
- glEnable(GL_POLYGON_OFFSET_FILL);
- glBlendFunc(GL_ONE, GL_ONE); /* add */
- glEnable(GL_BLEND);
- glMaterialfv(GL_FRONT, GL_DIFFUSE, Black);
- glMaterialfv(GL_FRONT, GL_SPECULAR, White);
- if (DoSpecTexture) {
- glBindTexture(GL_TEXTURE_2D, SpecularTexture);
- glEnable(GL_TEXTURE_GEN_S);
- glEnable(GL_TEXTURE_GEN_T);
- }
- else {
- glDisable(GL_TEXTURE_2D);
- }
- glCallList(Object);
- glDisable(GL_TEXTURE_GEN_S);
- glDisable(GL_TEXTURE_GEN_T);
- glDisable(GL_BLEND);
- glDisable(GL_POLYGON_OFFSET_FILL);
-
- glPopMatrix();
-
- glutSwapBuffers();
-
- if (Animate) {
- GLint t = glutGet(GLUT_ELAPSED_TIME);
- Frames++;
- if (t - T0 >= 5000) {
- GLfloat seconds = (t - T0) / 1000.0;
- GLfloat fps = Frames / seconds;
- printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
- fflush(stdout);
- T0 = t;
- Frames = 0;
- }
- }
-}
-
-
-static void Reshape( int width, int height )
-{
- GLfloat h = 30.0;
- GLfloat w = h * width / height;
- WinWidth = width;
- WinHeight = height;
- glViewport( 0, 0, width, height );
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- glFrustum( -w, w, -h, h, 150.0, 500.0 );
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity();
- glTranslatef( 0.0, 0.0, -380.0 );
-}
-
-
-static void ToggleAnimate(void)
-{
- Animate = !Animate;
- if (Animate) {
- glutIdleFunc( Idle );
- T0 = glutGet(GLUT_ELAPSED_TIME);
- Frames = 0;
- }
- else {
- glutIdleFunc( NULL );
- }
-}
-
-
-static void ModeMenu(int entry)
-{
- if (entry==ANIMATE) {
- ToggleAnimate();
- }
- else if (entry==DO_SPEC_TEXTURE) {
- DoSpecTexture = !DoSpecTexture;
- }
- else if (entry==OBJECT) {
- if (Object == TeapotObj)
- Object = CylinderObj;
- else
- Object = TeapotObj;
- }
- else if (entry==QUIT) {
- exit(0);
- }
- glutPostRedisplay();
-}
-
-
-static void Key( unsigned char key, int x, int y )
-{
- (void) x;
- (void) y;
- switch (key) {
- case 's':
- Shininess--;
- if (Shininess < 0.0)
- Shininess = 0.0;
- glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
- printf("Shininess = %g\n", Shininess);
- break;
- case 'S':
- Shininess++;
- if (Shininess > 128.0)
- Shininess = 128.0;
- glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
- printf("Shininess = %g\n", Shininess);
- break;
- case 'a':
- case ' ':
- ToggleAnimate();
- break;
- case 'n':
- Idle();
- break;
- case 27:
- glutDestroyWindow(Win);
- exit(0);
- break;
- }
- glutPostRedisplay();
-}
-
-
-static void
-MouseMotion(int x, int y)
-{
- if (ButtonDown) {
- float x0 = (2.0 * ButtonX - WinWidth) / WinWidth;
- float y0 = (WinHeight - 2.0 * ButtonY) / WinHeight;
- float x1 = (2.0 * x - WinWidth) / WinWidth;
- float y1 = (WinHeight - 2.0 * y) / WinHeight;
- float q[4];
-
- trackball(q, x0, y0, x1, y1);
- ButtonX = x;
- ButtonY = y;
- add_quats(q, CurQuat, CurQuat);
-
- glutPostRedisplay();
- }
-}
-
-
-static void
-MouseButton(int button, int state, int x, int y)
-{
- if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
- ButtonDown = GL_TRUE;
- ButtonX = x;
- ButtonY = y;
- }
- else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
- ButtonDown = GL_FALSE;
- }
-}
-
-
-static void Init( int argc, char *argv[] )
-{
- GLboolean convolve = GL_FALSE;
- GLboolean fullscreen = GL_FALSE;
- int i;
-
- for (i = 1; i < argc; i++) {
- if (strcmp(argv[i], "-info")==0) {
- printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
- printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
- printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
- printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
- }
- else if (strcmp(argv[i], "-c")==0) {
- convolve = GL_TRUE;
- }
- else if (strcmp(argv[i], "-f")==0) {
- fullscreen = GL_TRUE;
- }
- }
-
- if (convolve && !glutExtensionSupported("GL_ARB_imaging")) {
- fprintf(stderr,
- "GL_ARB_imaging is not supported, disabling convolution.\n");
- exit(1);
- }
-
-
- if (fullscreen)
- glutFullScreen();
-
- /* Cylinder object */
- {
- static GLfloat height = 100.0;
- static GLfloat radius = 40.0;
- static GLint slices = 24; /* pie slices around Z axis */
- static GLint stacks = 10; /* subdivisions along length of cylinder */
- static GLint rings = 4; /* rings in the end disks */
- GLUquadricObj *q = gluNewQuadric();
- assert(q);
- gluQuadricTexture(q, GL_TRUE);
-
- CylinderObj = glGenLists(1);
- glNewList(CylinderObj, GL_COMPILE);
-
- glPushMatrix();
- glTranslatef(0.0, 0.0, -0.5 * height);
-
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- /*glScalef(8.0, 4.0, 2.0);*/
- glMatrixMode(GL_MODELVIEW);
-
- /* cylinder */
- gluQuadricNormals(q, GL_SMOOTH);
- gluQuadricTexture(q, GL_TRUE);
- gluCylinder(q, radius, radius, height, slices, stacks);
-
- /* end cap */
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glScalef(3.0, 3.0, 1.0);
- glMatrixMode(GL_MODELVIEW);
-
- glTranslatef(0.0, 0.0, height);
- gluDisk(q, 0.0, radius, slices, rings);
-
- /* other end cap */
- glTranslatef(0.0, 0.0, -height);
- gluQuadricOrientation(q, GLU_INSIDE);
- gluDisk(q, 0.0, radius, slices, rings);
-
- glPopMatrix();
-
- glMatrixMode(GL_TEXTURE);
- glLoadIdentity();
- glMatrixMode(GL_MODELVIEW);
-
- glEndList();
- gluDeleteQuadric(q);
- }
-
- /* Teapot */
- {
- TeapotObj = glGenLists(1);
- glNewList(TeapotObj, GL_COMPILE);
-
- glFrontFace(GL_CW);
- glutSolidTeapot(40.0);
- glFrontFace(GL_CCW);
-
- glEndList();
- }
-
- /* show cylinder by default */
- Object = CylinderObj;
-
-
- /* lighting */
- glEnable(GL_LIGHTING);
- {
- GLfloat pos[4] = { 3, 3, 3, 1 };
- glLightfv(GL_LIGHT0, GL_AMBIENT, Black);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, White);
- glLightfv(GL_LIGHT0, GL_SPECULAR, White);
- glLightfv(GL_LIGHT0, GL_POSITION, pos);
- glEnable(GL_LIGHT0);
- glMaterialfv(GL_FRONT, GL_AMBIENT, Black);
- glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
- glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
- }
-
- /* Base texture */
- glGenTextures(1, &BaseTexture);
- glBindTexture(GL_TEXTURE_2D, BaseTexture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- if (!LoadRGBMipmaps(BASE_TEXTURE_FILE, GL_RGB)) {
- printf("Error: couldn't load texture image file %s\n", BASE_TEXTURE_FILE);
- exit(1);
- }
-
- /* Specular texture */
- glGenTextures(1, &SpecularTexture);
- glBindTexture(GL_TEXTURE_2D, SpecularTexture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
- if (convolve) {
- /* use convolution to blur the texture to simulate a dull finish
- * on the object.
- */
- GLubyte *img;
- GLenum format;
- GLint w, h;
- GLfloat filter[FILTER_SIZE][FILTER_SIZE][4];
-
- for (h = 0; h < FILTER_SIZE; h++) {
- for (w = 0; w < FILTER_SIZE; w++) {
- const GLfloat k = 1.0 / (FILTER_SIZE * FILTER_SIZE);
- filter[h][w][0] = k;
- filter[h][w][1] = k;
- filter[h][w][2] = k;
- filter[h][w][3] = k;
- }
- }
-
- glEnable(GL_CONVOLUTION_2D);
- glConvolutionParameteri(GL_CONVOLUTION_2D,
- GL_CONVOLUTION_BORDER_MODE, GL_CONSTANT_BORDER);
- glConvolutionFilter2D(GL_CONVOLUTION_2D, GL_RGBA,
- FILTER_SIZE, FILTER_SIZE,
- GL_RGBA, GL_FLOAT, filter);
-
- img = LoadRGBImage(SPECULAR_TEXTURE_FILE, &w, &h, &format);
- if (!img) {
- printf("Error: couldn't load texture image file %s\n",
- SPECULAR_TEXTURE_FILE);
- exit(1);
- }
-
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0,
- format, GL_UNSIGNED_BYTE, img);
- free(img);
- }
- else {
- /* regular path */
- if (!LoadRGBMipmaps(SPECULAR_TEXTURE_FILE, GL_RGB)) {
- printf("Error: couldn't load texture image file %s\n",
- SPECULAR_TEXTURE_FILE);
- exit(1);
- }
- }
-
- /* misc */
- glEnable(GL_CULL_FACE);
- glEnable(GL_TEXTURE_2D);
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_NORMALIZE);
-
- glPolygonOffset( -1, -1 );
-}
-
-
-int main( int argc, char *argv[] )
-{
- glutInitWindowSize(WinWidth, WinHeight);
- glutInit( &argc, argv );
- glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
- Win = glutCreateWindow(argv[0] );
- glewInit();
- glutReshapeFunc( Reshape );
- glutKeyboardFunc( Key );
- glutDisplayFunc( Display );
- glutMotionFunc(MouseMotion);
- glutMouseFunc(MouseButton);
- if (Animate)
- glutIdleFunc( Idle );
-
- glutCreateMenu(ModeMenu);
- glutAddMenuEntry("Toggle Highlight", DO_SPEC_TEXTURE);
- glutAddMenuEntry("Toggle Object", OBJECT);
- glutAddMenuEntry("Toggle Animate", ANIMATE);
- glutAddMenuEntry("Quit", QUIT);
- glutAttachMenu(GLUT_RIGHT_BUTTON);
-
- Init(argc, argv);
-
- glutMainLoop();
- return 0;
-}