/* Example: zbuffer2.c */ /* This program illustrates z buffering. It draws three parallel pipeds rotating through each other.
This program requires a 24-bit adapter and the z buffer option. */
#include <gl/gl.h> #include <gl/device.h>
float v0[3] = {-1.0, -1.0, -1.0} ; float v1[3] = { -1.0, -1.0, 1.0}; float v2[3] = { -1.0, 1.0, 1.0}; float v3[3] = { -1.0, 1.0, -1.0}; float v4[3] = { 1.0, -1.0, -1.0}; float v5[3] = { 1.0, -1.0, 1.0}; float v6[3] = { 1.0, 1.0, 1.0}; float v7[3] = { 1.0, 1.0, -1.0};
Int32 delaycount;
main(argc, argv) int argc; char *argv[]; { Int32 xrot, yrot, zrot; xrot = yrot = zrot = 0; if (argc == 1) delaycount = 0; else delaycount = 1; keepaspect(1, 1); prefposition (0,800,0,800); winopen("zbuffer"); RGBmode(); if (delaycount == 0) doublebuffer(); gconfig(); ortho(-4.0, 4.0, -4.0, 4.0, -4.0, 4.0); while (1) { pushmatrix(); rotate(xrot, 'x'); rotate(yrot, 'y'); rotate(zrot, 'z'); xrot += 11; yrot += 15; if (xrot + yrot > 3500) zrot += 23; if (xrot > 3600) xrot -= 3600; if (yrot > 3600) yrot -= 3600; if (zrot > 3600) zrot -= 3600; cpack(0); clear(); if (getbutton(LEFTMOUSE)) { zbuffer(TRUE); zclear(); } else zbuffer(FALSE); pushmatrix(); scale(1.2, 1.2, 1.2); translate(.3, .2, .2); if (getbutton(MIDDLEMOUSE)) { reshapeviewport(); } drawcube(); popmatrix(); pushmatrix(); rotate(450+zrot, 'x'); rotate(300-xrot, 'y'); scale(1.8, .8, .8); drawcube(); popmatrix(); pushmatrix(); rotate(500+yrot, 'z'); rotate(-zrot, 'x'); translate(-.3, -.2, .6); scale(1.4, 1.2, .7); drawcube(); popmatrix(); if (delaycount == 0) swapbuffers(); popmatrix(); }
}
delay() { sleep(delaycount); }
drawcube() { cpack(0xff); bgnpolygon(); v3f(v0); v3f(v1); v3f(v2); v3f(v3); endpolygon(); delay(); cpack(0xff00); bgnpolygon(); v3f(v0); v3f(v4); v3f(v5); v3f(v1); endpolygon(); delay(); cpack(0xff0000); bgnpolygon(); v3f(v4); v3f(v7); v3f(v6); v3f(v5); endpolygon(); delay(); cpack(0xffff); bgnpolygon(); v3f(v3); v3f(v7); v3f(v6); v3f(v2); endpolygon(); delay(); cpack(0xff00ff); bgnpolygon(); v3f(v5); v3f(v1); v3f(v2); v3f(v6); endpolygon(); delay(); cpack(0xffff00); bgnpolygon(); v3f(v0); v3f(v4); v3f(v7); v3f(v3); endpolygon(); }
/* Changes: - Adding reshapeviewport when middlemouse - Added a prefposition(0,800,0,800); */
The zbuffer subroutine, zclear subroutine.
Zbuffering in GL3.2 Version 4 for AIX: Programming Concepts introduces basic concepts about displaying objects closest to the viewer.