1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
/* decal.c - by Tom McReynolds, SGI */
/* An Example of decaling, using stencil */
#include <GL/glut.h>
#include <stdlib.h>
/* ARGSUSED1 */
void
key(unsigned char key, int x, int y)
{
switch (key) {
case '\033':
exit(0);
}
}
/* decal shape polygon onto base */
void
decal_poly(void)
{
glBegin(GL_QUADS);
glNormal3f(0.f, 0.f, -1.f);
glVertex3i(-2, 2, 0);
glVertex3i(-2, 3, 0);
glVertex3i(2, 3, 0);
glVertex3i(2, 2, 0);
glVertex3f(-.5, -3.f, 0);
glVertex3f(-.5f, 2.f, 0);
glVertex3f(.5f, 2.f, 0);
glVertex3f(.5f, -3.f, 0);
glEnd();
}
int angle = 0;
void
redraw(void)
{
/* clear stencil each time */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 1, 1);
glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE);
glDepthFunc(GL_LESS);
glPushMatrix();
glColor3f(1.f, 0.f, 0.f);
glTranslatef(0.f, 0.f, -10.f);
glScalef(5.f, 5.f, 5.f);
glRotatef((GLfloat) angle, 0.f, 1.f, 0.f);
glEnable(GL_NORMALIZE);
glutSolidDodecahedron();
glDisable(GL_NORMALIZE);
glPopMatrix();
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glDepthFunc(GL_ALWAYS);
glPushMatrix();
glTranslatef(0.f, 0.f, -10.f);
glRotatef((GLfloat) angle, 0.f, 1.f, 0.f);
glRotatef(58.285f, 0.f, 1.f, 0.f);
glTranslatef(0.f, 0.f, -7.265f);
glColor3f(0.f, 1.f, 0.f);
decal_poly();
glPopMatrix();
glDisable(GL_STENCIL_TEST);
glutSwapBuffers();
}
void
anim(void)
{
angle = (angle + 1) % 360;
glutPostRedisplay();
}
void
visible(int vis)
{
if (vis == GLUT_VISIBLE)
glutIdleFunc(anim);
else
glutIdleFunc(NULL);
}
int
main(int argc, char *argv[])
{
static GLfloat lightpos[] =
{10.f, 5.f, 0.f, 1.f};
glutInit(&argc, argv);
glutInitWindowSize(512, 512);
glutInitDisplayMode(GLUT_STENCIL | GLUT_DEPTH | GLUT_DOUBLE);
(void) glutCreateWindow("decal");
glutDisplayFunc(redraw);
glutKeyboardFunc(key);
glutVisibilityFunc(visible);
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glOrtho(-10., 10., -10., 10., 0., 20.);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glutMainLoop();
return 0; /* ANSI C requires main to return int. */
}
|