123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- /**
- * Test glDrawPixels(GL_DEPTH_COMPONENT)
- *
- * We load a window-sized buffer of Z values so that Z=1 at the top and
- * Z=0 at the bottom (and interpolate between).
- * We draw that image into the Z buffer, then draw an ordinary cube.
- * The bottom part of the cube should be "clipped" where the cube fails
- * the Z test.
- *
- * Press 'd' to view the Z buffer as a grayscale image.
- */
-
- #define GL_GLEXT_PROTOTYPES
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <GL/glut.h>
- #include "../util/showbuffer.c"
-
-
- static int Win;
- static GLfloat Xrot = 50, Yrot = 40, Zpos = 6;
- static GLboolean Anim = GL_FALSE;
-
- static int Width = 200, Height = 200;
- static GLfloat *z;
- static GLboolean showZ = 0;
-
-
- static void
- Idle(void)
- {
- Xrot += 3.0;
- Yrot += 4.0;
- glutPostRedisplay();
- }
-
-
- static void
- Draw(void)
- {
- glClearColor(0, 0, 0.5, 0);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
- #if 1
- glColor3f(1, 0, 0);
- glWindowPos2i(0,0);
- glColorMask(0,0,0,0);
- glDrawPixels(Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, z);
- #elif 0
- glPushMatrix();
- glTranslatef(-0.75, 0, Zpos);
- glutSolidSphere(1.0, 20, 10);
- glPopMatrix();
- #endif
- glColorMask(1,1,1,1);
-
- /* draw cube */
- glPushMatrix();
- glTranslatef(0, 0, Zpos);
- glRotatef(Xrot, 1, 0, 0);
- glRotatef(Yrot, 0, 1, 0);
- glutSolidCube(2.0);
- glPopMatrix();
-
- #if 0
- /* drawpixels after cube */
- glColor3f(1, 0, 0);
- glWindowPos2i(0,0);
- //glColorMask(0,0,0,0);
- glDrawPixels(Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, z);
- #endif
-
- if (showZ) {
- ShowDepthBuffer(Width, Height, 0.0, 1.0);
- }
-
- glutSwapBuffers();
- }
-
-
- static void
- Reshape(int width, int height)
- {
- glViewport(0, 0, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 30.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glTranslatef(0.0, 0.0, -15.0);
-
- Width = width;
- Height = height;
-
- z = (float *) malloc(width * height * 4);
- {
- int i, j, k = 0;
- for (i = 0; i < height; i++) {
- float zval = (float) i / (height - 1);
- for (j = 0; j < width; j++) {
- z[k++] = zval;
- }
- }
- }
- }
-
-
- static void
- Key(unsigned char key, int x, int y)
- {
- const GLfloat step = 1.0;
- (void) x;
- (void) y;
- switch (key) {
- case 'a':
- Anim = !Anim;
- if (Anim)
- glutIdleFunc(Idle);
- else
- glutIdleFunc(NULL);
- break;
- case 'd':
- showZ = !showZ;
- break;
- case 'z':
- Zpos -= step;
- break;
- case 'Z':
- Zpos += step;
- break;
- case 27:
- glutDestroyWindow(Win);
- exit(0);
- break;
- }
- glutPostRedisplay();
- }
-
-
- static void
- SpecialKey(int key, int x, int y)
- {
- const GLfloat step = 3.0;
- (void) x;
- (void) y;
- switch (key) {
- case GLUT_KEY_UP:
- Xrot -= step;
- break;
- case GLUT_KEY_DOWN:
- Xrot += step;
- break;
- case GLUT_KEY_LEFT:
- Yrot -= step;
- break;
- case GLUT_KEY_RIGHT:
- Yrot += step;
- break;
- }
- glutPostRedisplay();
- }
-
-
- static void
- Init(void)
- {
- /* setup lighting, etc */
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- }
-
-
- int
- main(int argc, char *argv[])
- {
- glutInit(&argc, argv);
- glutInitWindowPosition(0, 0);
- glutInitWindowSize(400, 400);
- glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
- Win = glutCreateWindow(argv[0]);
- glutReshapeFunc(Reshape);
- glutKeyboardFunc(Key);
- glutSpecialFunc(SpecialKey);
- glutDisplayFunc(Draw);
- if (Anim)
- glutIdleFunc(Idle);
- Init();
- glutMainLoop();
- return 0;
- }
|