windows-nt/Source/XPSP1/NT/multimedia/opengl/test/auxprogs/rgb/drawbuf.c
2020-09-26 16:20:57 +08:00

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".
*/