decal.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

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