diff options
Diffstat (limited to 'progs')
-rw-r--r-- | progs/tests/Makefile | 1 | ||||
-rw-r--r-- | progs/tests/fog.c | 199 |
2 files changed, 200 insertions, 0 deletions
diff --git a/progs/tests/Makefile b/progs/tests/Makefile index fc8476a27a..03bb6c2ad5 100644 --- a/progs/tests/Makefile +++ b/progs/tests/Makefile @@ -30,6 +30,7 @@ SOURCES = antialias.c \ floattex.c \ fbotest1.c \ fbotexture.c \ + fog.c \ fogcoord.c \ fptest1.c \ fptexture.c \ diff --git a/progs/tests/fog.c b/progs/tests/fog.c new file mode 100644 index 0000000000..ecd9f533f9 --- /dev/null +++ b/progs/tests/fog.c @@ -0,0 +1,199 @@ +/* + * Copyright 2005 Eric Anholt + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Authors: + * Eric Anholt <anholt@FreeBSD.org> + * Brian Paul (fogcoord.c used as a skeleton) + */ + +/* + * Test to exercise fog modes and for comparison with GL_EXT_fog_coord. + */ + +#define GL_GLEXT_PROTOTYPES +#include <stdio.h> +#include <stdlib.h> +#include <math.h> +#include <GL/glut.h> + +static int Width = 600; +static int Height = 600; +static GLfloat Near = 0.0, Far = 1.0; +GLboolean has_fogcoord; + +static void drawString( const char *string ) +{ + glRasterPos2f(0, .5); + while ( *string ) { + glutBitmapCharacter( GLUT_BITMAP_TIMES_ROMAN_10, *string ); + string++; + } +} + +static void Display( void ) +{ + GLint i, depthi; + GLfloat fogcolor[4] = {1, 1, 1, 1}; + + glEnable(GL_FOG); + glFogfv(GL_FOG_COLOR, fogcolor); + + glClearColor(0.2, 0.2, 0.8, 0); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + + glPushMatrix(); + for (i = 0; i < 6; i++) { + if (i >= 3 && !has_fogcoord) + break; + + glPushMatrix(); + for (depthi = 0; depthi < 5; depthi++) { + GLfloat depth = Near + (Far - Near) * depthi / 4; + + switch (i % 3) { + case 0: + glFogi(GL_FOG_MODE, GL_LINEAR); + glFogf(GL_FOG_START, Near); + glFogf(GL_FOG_END, Far); + break; + case 1: + glFogi(GL_FOG_MODE, GL_EXP); + glFogf(GL_FOG_DENSITY, 2); + break; + case 2: + glFogi(GL_FOG_MODE, GL_EXP2); + glFogf(GL_FOG_DENSITY, 2); + break; + } + + glColor4f(0, 0, 0, 0); + if (i < 3) { + if (has_fogcoord) + glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT); + + glBegin(GL_POLYGON); + glVertex3f(0, 0, depth); + glVertex3f(1, 0, depth); + glVertex3f(1, 1, depth); + glVertex3f(0, 1, depth); + glEnd(); + } else { + glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT); + glFogCoordfEXT(depth); + + glBegin(GL_POLYGON); + glVertex3f(0, 0, (Near + Far) / 2); + glVertex3f(1, 0, (Near + Far) / 2); + glVertex3f(1, 1, (Near + Far) / 2); + glVertex3f(0, 1, (Near + Far) / 2); + glEnd(); + } + glTranslatef(1.5, 0, 0); + } + + glTranslatef(.1, 0, 0); + switch (i) { + case 0: + drawString("GL_LINEAR"); + break; + case 1: + drawString("GL_EXP"); + break; + case 2: + drawString("GL_EXP2"); + break; + case 3: + drawString("GL_FOGCOORD GL_LINEAR"); + break; + case 4: + drawString("GL_FOGCOORD GL_EXP"); + break; + case 5: + drawString("GL_FOGCOORD GL_EXP2"); + break; + } + + glPopMatrix(); + glTranslatef(0, 1.5, 0); + } + glPopMatrix(); + + glutSwapBuffers(); +} + + +static void Reshape( int width, int height ) +{ + Width = width; + Height = height; + glViewport( 0, 0, width, height ); + + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glOrtho( 0, 11, 9, 0, -Near, -Far ); + + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glTranslatef(.25, .25, 0); +} + + +static void Key( unsigned char key, int x, int y ) +{ + (void) x; + (void) y; + switch (key) { + case 27: + exit(0); + break; + } + glutPostRedisplay(); +} + + +static void Init( void ) +{ + printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER)); + printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION)); + /* setup lighting, etc */ + has_fogcoord = glutExtensionSupported("GL_EXT_fog_coord"); + if (!has_fogcoord) { + printf("Some output of this program requires GL_EXT_fog_coord\n"); + } +} + + +int main( int argc, char *argv[] ) +{ + glutInit( &argc, argv ); + glutInitWindowPosition( 0, 0 ); + glutInitWindowSize( Width, Height ); + glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH ); + glutCreateWindow(argv[0]); + glutReshapeFunc( Reshape ); + glutKeyboardFunc( Key ); + glutDisplayFunc( Display ); + Init(); + glutMainLoop(); + return 0; +} |