/* backface.c:
Draw a cube that can run with backface() turned on or off. Turn backface() on with the F key. Turn backface() off with the B key. Cube is moved when LEFTMOUSE is pressed and mouse itself is moved. */
#include <gl/gl.h> #include <gl/device.h>
#define CUBE_SIZE 200 #define CUBE_OBJ 1
main ()
{
Device dev; int moveit; short val, x = 30,y = 30;
initialize();
  while (TRUE) {
    while (qtest()) {
dev = qread(&val);
      if (dev == ESCKEY) {
        backface(FALSE);
        gexit();
        exit();
      }
      else if (dev == REDRAW) {
        reshapeviewport();
        drawcube(x,y);
      }
      else if (dev == LEFTMOUSE)
        moveit = val;
        /* left mouse is down */
      else if (dev == BKEY) {
        backface(TRUE);
        /* turn back facing off */
        drawcube(x,y);
      }
      else if (dev == FKEY) {
        backface(FALSE);
        /* turn back facing on */
        drawcube(x,y);
      }
}
    if (moveit) {
      x = getvaluator(MOUSEX);
      y = getvaluator(MOUSEY);
      drawcube(x,y);
    }
}
}
initialize()
{
int gid;
  prefposition(XMAXSCREEN/4, XMAXSCREEN*3/4, 
      YMAXSCREEN/4, YMAXSCREEN*3/4);
  gid = winopen("backface");
doublebuffer(); gconfig(); shademodel(FLAT);
  ortho((float)-XMAXSCREEN, (float)XMAXSCREEN,
      (float)-YMAXSCREEN, (float)YMAXSCREEN,
      (float)-YMAXSCREEN, (float)YMAXSCREEN);
qdevice(ESCKEY); qdevice(REDRAW); qdevice(LEFTMOUSE); qdevice(BKEY); qdevice(FKEY); qenter(REDRAW,gid);
backface(TRUE); /* turn on back facing polygon removal */
}
/* define a cube */
cube()
{ 
/* front face */ pushmatrix(); translate(0.0,0.0,CUBE_SIZE); color(RED); rectfi(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE); popmatrix(); /* right face */ pushmatrix();
translate(CUBE_SIZE, 0.0, 0.0); rotate(900, 'y'); color(GREEN); rectfi(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE); popmatrix(); /* back face */ pushmatrix();
translate(0.0, 0.0, -CUBE_SIZE); rotate(1800, 'y'); color(BLUE); rectfi(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE); popmatrix(); /* left face */ pushmatrix();
translate(-CUBE_SIZE, 0.0, 0.0); rotate(-900, 'y'); color(CYAN); rectfi(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE); popmatrix(); /* top face */ pushmatrix();
translate(0.0, CUBE_SIZE, 0.0); rotate(-900, 'x'); color(MAGENTA); rectfi(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE); popmatrix(); /* bottom face */ pushmatrix();
translate(0.0, -CUBE_SIZE, 0.0); rotate(900, 'x'); color(YELLOW); rectfi(-CUBE_SIZE,-CUBE_SIZE,CUBE_SIZE,CUBE_SIZE); popmatrix();
}
drawcube(x,y)
short x,y;
{
pushmatrix(); rotate(2*x, 'x'); rotate(2*y, 'y'); color(BLACK); clear(); cube(); popmatrix(); swapbuffers();
} /*Changes -The constant CUBE_SIZE had a .0 append to the end of it */
The backface subroutine, ortho or ortho2 subroutine, popmatrix subroutine, pushmatrix subroutine, rotate subroutine, shademodel subroutine, swapbuffers subroutine, translate subroutine.
Removing Hidden Surfaces in GL3.2 Version 4 for AIX: Programming Concepts.