glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT ); MAGIC LENS: /* create the stencil box: */ glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glDepthMask( GL_FALSE ); glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE ); glStencilFunc( GL_ALWAYS, 1, 1 ); glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE ); glBegin( GL_POLYGON ); glVertex2f( Xlens-BOX/2., Ylens-BOX/2. ); glVertex2f( Xlens+BOX/2., Ylens-BOX/2. ); glVertex2f( Xlens+BOX/2., Ylens+BOX/2. ); glVertex2f( Xlens-BOX/2., Ylens+BOX/2. ); glEnd(); glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ); glDepthMask( GL_TRUE ); /* draw the objects: */ glStencilFunc( GL_EQUAL, 0, 1 ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); for( i = 0; i < 8; i++ ) { glCallList( SolidLists[ i ] ); } glDisable( GL_LIGHTING ); glDisable( GL_LIGHT0 ); glStencilFunc( GL_EQUAL, 1, 1 ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); glShadeModel( GL_FLAT ); for( i = 0; i < 8; i++ ) { glCallList( WireLists[ i ] ); } glDisable( GL_STENCIL_TEST ); POLYGON CAPPING: /* draw the objects: */ glStencilFunc( GL_ALWAYS, 0, 1 ); glStencilOp( GL_INVERT, GL_INVERT, GL_INVERT ); for( i = 0; i < 8; i++ ) { glCallList( SolidLists[ i ] ); } glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); glDisable( GL_LIGHTING ); glDisable( GL_LIGHT0 ); glStencilFunc( GL_NOTEQUAL, 0, 1 ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); glShadeModel( GL_FLAT ); glColor3f( .5, .5, .5 ); glBegin( GL_POLYGON ); glVertex3f( -BIGX, -BIGY, CLOSEZ ); glVertex3f( BIGX, -BIGY, CLOSEZ ); glVertex3f( BIGX, BIGY, CLOSEZ ); glVertex3f( -BIGX, BIGY, CLOSEZ ); glEnd(); glDisable( GL_STENCIL_TEST ); OUTLINING POLYGONS: glEnable( GL_STENCIL_TEST ); glStencilFunc( GL_ALWAYS, 0, 1 ); glStencilOp( GL_INVERT, GL_INVERT, GL_INVERT ); for( All Polygons ) { glMaterialfv( GL_FRONT, GL_AMBIENT, MulArray3( 1., White ) ); glMaterialfv( GL_FRONT, GL_DIFFUSE, MulArray3( 1., White ) ); glBegin( GL_LINE_LOOP ); for( vp = fp->vp; vp != NULL; vp = vp->next ) { glVertex3fv( &Points [ vp->p ].x ); } glEnd(); glMaterialfv( GL_FRONT, GL_AMBIENT, MulArray3( 1., rgb ) ); glMaterialfv( GL_FRONT, GL_DIFFUSE, MulArray3( 1., rgb ) ); glStencilFunc( GL_EQUAL, 0, 1 ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); glBegin( GL_POLYGON ); for( vp = fp->vp; vp != NULL; vp = vp->next ) { glNormal3fv( &Normals[ vp->n ].nx ); glVertex3fv( &Points [ vp->p ].x ); } glEnd(); glMaterialfv( GL_FRONT, GL_AMBIENT, MulArray3( 1., White ) ); glMaterialfv( GL_FRONT, GL_DIFFUSE, MulArray3( 1., White ) ); glStencilFunc( GL_ALWAYS, 0, 1 ); glStencilOp( GL_INVERT, GL_INVERT, GL_INVERT ); glBegin( GL_LINE_LOOP ); for( vp = fp->vp; vp != NULL; vp = vp->next ) { glNormal3fv( &Normals[ vp->n ].nx ); glVertex3fv( &Points [ vp->p ].x ); } glEnd(); } glDisable( GL_STENCIL_TEST ); HIDDEN LINE REMOVAL: glEnable( GL_STENCIL_TEST ); glStencilFunc( GL_ALWAYS, 0, 1 ); glStencilOp( GL_INVERT, GL_INVERT, GL_INVERT ); for( All Polygons ) { glColor3f( 1., 0., 0. ); glBegin( GL_LINE_LOOP ); for( vp = fp->vp; vp != NULL; vp = vp->next ) { glVertex3fv( &Points [ vp->p ].x ); } glEnd(); glColor3f( 0., 0., 0. ); glStencilFunc( GL_EQUAL, 0, 1 ); glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); glBegin( GL_POLYGON ); for( vp = fp->vp; vp != NULL; vp = vp->next ) { glVertex3fv( &Points [ vp->p ].x ); } glEnd(); glColor3f( 1., 0., 0. ); glStencilFunc( GL_ALWAYS, 0, 1 ); glStencilOp( GL_INVERT, GL_INVERT, GL_INVERT ); glBegin( GL_LINE_LOOP ); for( vp = fp->vp; vp != NULL; vp = vp->next ) { glVertex3fv( &Points [ vp->p ].x ); } glEnd(); } glDisable( GL_STENCIL_TEST );