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

GIS编程

开发平台:

Visual C++

  1. /* haloed.c - by Tom McReynolds, SGI */
  2. /* Draw haloed lines. */
  3. #include <GL/glut.h>
  4. #include <math.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. enum {CONE = 1};
  8. /* Draw a cone */
  9. void
  10. cone(void)
  11. {
  12.   glPushMatrix();
  13.   glTranslatef(0.f, 0.f, -30.f);
  14.   glCallList(CONE);
  15.   glPopMatrix();
  16. }
  17. /* Draw a torus */
  18. void
  19. torus(void)
  20. {
  21.   glutSolidTorus(10., 20., 16, 16);
  22. }
  23. enum {FILL, WIRE, HALO, OFFSET_HALO, BACKFACE_HALO, TOGGLE};
  24. int rendermode = FILL;
  25. void (*curobj)(void) = cone;
  26. void
  27. menu(int mode)
  28. {
  29.   if(mode == TOGGLE)
  30.     if(curobj == cone)
  31.       curobj = torus;
  32.     else
  33.       curobj = cone;
  34.   else
  35.     rendermode = mode;
  36.   glutPostRedisplay();
  37. }
  38. int winWidth = 512;
  39. int winHeight = 512;
  40. /* used to get current width and height of viewport */
  41. void
  42. reshape(int wid, int ht)
  43. {
  44.   glViewport(0, 0, wid, ht);
  45.   winWidth = wid;
  46.   winHeight = ht;
  47. }
  48. GLfloat viewangle;
  49. void
  50. redraw(void)
  51. {
  52.     /* clear stencil each time */
  53.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
  54.     glPushMatrix();
  55.     glRotatef(viewangle, 0.f, 1.f, 0.f);
  56.     switch(rendermode) {
  57.     case FILL:
  58.       curobj();
  59.       break;
  60.     case WIRE:
  61.       glDisable(GL_DEPTH_TEST);
  62.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  63.       glLineWidth(3.f);
  64.       curobj();
  65.       glLineWidth(1.f);
  66.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  67.       glEnable(GL_DEPTH_TEST);
  68.       break;
  69.     case HALO:
  70.       /* draw wide lines into depth buffer */
  71.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  72.       glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
  73.       glLineWidth(9.f);
  74.       curobj();
  75.       /* draw narrow lines into color with depth test on */
  76.       glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  77.       glLineWidth(3.f);
  78.       glDepthFunc(GL_LEQUAL);
  79.       curobj();
  80.       glDepthFunc(GL_LESS);
  81.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  82.       glLineWidth(1.f);
  83.       break;
  84.     case OFFSET_HALO:
  85.       /* draw wide lines into depth buffer */
  86.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  87.       glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); 
  88.       glLineWidth(9.f);
  89.       curobj();
  90.       /* draw narrow lines into color with depth test on */
  91.       glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
  92.       glLineWidth(3.f);
  93. #if GL_EXT_polygon_offset
  94.       glEnable(GL_POLYGON_OFFSET_EXT);
  95.       glPolygonOffsetEXT(-.5f, -.02f);
  96. #endif
  97.       glDepthFunc(GL_LEQUAL);
  98.       curobj();
  99.       glDepthFunc(GL_LESS);
  100. #if GL_EXT_polygon_offset
  101.       glDisable(GL_POLYGON_OFFSET_EXT);
  102. #endif
  103.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  104.       glLineWidth(1.f);
  105.       break;
  106.     case BACKFACE_HALO: /* cheat: only works on single non-intersecting obj */
  107.       /* draw wide lines into depth buffer */
  108.       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  109.       glEnable(GL_CULL_FACE);
  110.       glCullFace(GL_FRONT);
  111.       glLineWidth(3.f);
  112.       curobj();
  113.       /* mask out borders of objects with wide gray lines */
  114.       glCullFace(GL_BACK);
  115.       glLineWidth(9.f);
  116.       glDisable(GL_LIGHTING);
  117.       glColor3f(.7f, .7f, .7f);
  118.       curobj();
  119.       /* draw front face narrow lines without depth test */
  120.       glEnable(GL_LIGHTING);
  121.       glLineWidth(3.f);
  122.       glDisable(GL_DEPTH_TEST);
  123.       curobj();
  124.       /* clean up */
  125.       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  126.       glEnable(GL_DEPTH_TEST);
  127.       glDisable(GL_CULL_FACE);
  128.       glLineWidth(1.f);
  129.       break;
  130.     }
  131.     glPopMatrix();
  132.     glutSwapBuffers();
  133.     if(glGetError())
  134.       printf("oops! Bad gl command!n");
  135. }
  136. /* animate scene by rotating */
  137. enum {ANIM_LEFT, ANIM_RIGHT};
  138. int animDirection = ANIM_LEFT;
  139. void anim(void)
  140. {
  141.   if(animDirection == ANIM_LEFT)
  142.     viewangle -= 1.f;
  143.   else
  144.     viewangle += 1.f;
  145.   glutPostRedisplay();
  146. }
  147. /* ARGSUSED1 */
  148. /* special keys, like array and F keys */
  149. void special(int key, int x, int y)
  150. {
  151.   switch(key) {
  152.   case GLUT_KEY_LEFT:
  153.     glutIdleFunc(anim);
  154.     animDirection = ANIM_LEFT;
  155.     break;
  156.   case GLUT_KEY_RIGHT:
  157.     glutIdleFunc(anim);
  158.     animDirection = ANIM_RIGHT;
  159.     break;
  160.   case GLUT_KEY_UP:
  161.   case GLUT_KEY_DOWN:
  162.     glutIdleFunc(0);
  163.     break;
  164.   }
  165. }
  166. /* ARGSUSED1 */
  167. void
  168. key(unsigned char key, int x, int y)
  169. {
  170.   switch(key) {
  171.   case 'a':
  172.     viewangle -= 10.f;
  173.     glutPostRedisplay();
  174.     break;
  175.   case 's':
  176.     viewangle += 10.f;
  177.     glutPostRedisplay();
  178.     break;
  179.   case '33':
  180.     exit(0);
  181.   }
  182. }
  183. int picked_object;
  184. int xpos = 0, ypos = 0;
  185. int newxpos, newypos;
  186. int startx, starty;
  187. int
  188. main(int argc, char **argv)
  189. {
  190.     static GLfloat lightpos[] = {25.f, 50.f, -50.f, 1.f};
  191.     static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
  192.     GLUquadricObj *cone, *base;
  193.     glutInit(&argc, argv);
  194.     glutInitWindowSize(512, 512);
  195.     glutInitDisplayMode(GLUT_STENCIL|GLUT_DEPTH|GLUT_DOUBLE);
  196.     (void)glutCreateWindow("haloed lines");
  197.     glutDisplayFunc(redraw);
  198.     glutKeyboardFunc(key);
  199.     glutSpecialFunc(special);
  200.     glutCreateMenu(menu);
  201.     glutAddMenuEntry("Filled Object", FILL);
  202.     glutAddMenuEntry("Wireframe", WIRE);
  203.     glutAddMenuEntry("Haloed Wireframe", HALO);
  204.     glutAddMenuEntry("Pgon Offset Haloed Wireframe", OFFSET_HALO);
  205.     glutAddMenuEntry("Backface Haloed Wireframe", BACKFACE_HALO);
  206.     glutAddMenuEntry("Toggle Object", TOGGLE);
  207.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  208.     glEnable(GL_DEPTH_TEST);
  209.     glEnable(GL_LIGHTING);
  210.     glEnable(GL_LIGHT0);
  211.     glClearColor(.7f, .7f, .7f, .7f);
  212.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  213.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
  214.   
  215.     /* make display list for cone; for efficiency */
  216.     glNewList(CONE, GL_COMPILE);
  217.     cone = gluNewQuadric();
  218.     base = gluNewQuadric();
  219.     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  220.     gluQuadricOrientation(base, GLU_INSIDE);
  221.     gluDisk(base, 0., 25., 8, 1);
  222.     gluCylinder(cone, 25., 0., 60., 8, 8);
  223.     gluDeleteQuadric(cone);
  224.     gluDeleteQuadric(base);
  225.     glEndList();
  226.     glMatrixMode(GL_PROJECTION);
  227.     glOrtho(-50., 50., -50., 50., -50., 50.);
  228.     glMatrixMode(GL_MODELVIEW);
  229.     glutMainLoop();
  230.     return 0;             /* ANSI C requires main to return int. */
  231. }