/* * "drawmode.c" - A test program demonstrating the use of glDepthFunc() * and glDrawMode(). * * Press the 'd' key to toggle between GL_LESS and GL_GREATER depth * tests. Press the 'ESC' key to quit. */ #include /* * These #define constants are provided for compatibility between MS Windows * and the rest of the world. * * CALLBACK and APIENTRY are function modifiers under MS Windows. */ #ifndef WIN32 # define CALLBACK # define APIENTRY #endif /* !WIN32 */ GLenum depth_function = GL_LESS; /* Current depth function */ /* * 'reshape_scene()' - Change the size of the scene... */ void CALLBACK reshape_scene(GLsizei width, /* I - Width of the window in pixels */ GLsizei height) /* I - Height of the window in pixels */ { /* * Reset the current viewport and perspective transformation... */ glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(22.5, (float)width / (float)height, 0.1, 1000.0); glMatrixMode(GL_MODELVIEW); } /* * 'draw_scene()' - Draw a scene containing a cube with a sphere in front of * it. */ void CALLBACK draw_scene(void) { static float red_light[4] = { 1.0, 0.0, 0.0, 1.0 }; static float red_pos[4] = { 1.0, 1.0, 1.0, 0.0 }; static float blue_light[4] = { 0.0, 0.0, 1.0, 1.0 }; static float blue_pos[4] = { -1.0, -1.0, -1.0, 0.0 }; /* * Enable drawing features that we need... */ glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_LIGHT1); glDepthFunc(depth_function); /* * Clear the color and depth buffers... */ if (depth_function == GL_LESS) glClearDepth(1.0); else glClearDepth(0.0); glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* * Draw the cube and sphere in different colors... * * We have positioned two lights in this scene. The first is red and * located above, to the right, and behind the viewer. The second is blue * and located below, to the left, and in front of the viewer. */ glLightfv(GL_LIGHT0, GL_DIFFUSE, red_light); glLightfv(GL_LIGHT0, GL_POSITION, red_pos); glLightfv(GL_LIGHT1, GL_DIFFUSE, blue_light); glLightfv(GL_LIGHT1, GL_POSITION, blue_pos); glDrawBuffer(GL_NONE); /* Draw the cutting plane */ glShadeModel(GL_FLAT); glBegin(GL_LINES); glVertex3f(-10.0, -10.0, -20.0); glVertex3f(10.0, 10.0, -20.0); glEnd(); glShadeModel(GL_SMOOTH); glBegin(GL_POLYGON); glVertex3f(-10.0, -10.0, -20.0); glVertex3f(-10.0, 10.0, -20.0); glVertex3f(10.0, 10.0, -20.0); glVertex3f(10.0, -10.0, -20.0); glEnd(); glDrawBuffer(GL_FRONT); glPushMatrix(); glTranslatef(-1.0, 0.0, -20.0); auxSolidSphere(1.0); glPopMatrix(); glPushMatrix(); glTranslatef(1.0, 0.0, -20.0); glRotatef(15.0, 0.0, 1.0, 0.0); glRotatef(15.0, 0.0, 0.0, 1.0); auxSolidCube(2.0); glPopMatrix(); glFlush(); } /* * 'toggle_depth()' - Toggle the depth function between GL_LESS and GL_GREATER. */ void CALLBACK toggle_depth(void) { if (depth_function == GL_LESS) depth_function = GL_GREATER; else depth_function = GL_LESS; } /* * 'main()' - Initialize the window and display the scene until the user presses * the ESCape key. */ void main(void) { auxInitDisplayMode(AUX_RGB | AUX_SINGLE | AUX_DEPTH16); auxInitWindow("Depth Function"); auxKeyFunc(AUX_d, toggle_depth); auxReshapeFunc(reshape_scene); auxMainLoop(draw_scene); } /* * End of "depth.c". */