170 lines
3.5 KiB
C
170 lines
3.5 KiB
C
/*
|
|
* "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 <GL/glaux.h>
|
|
|
|
/*
|
|
* 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".
|
|
*/
|
|
|