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

GIS编程

开发平台:

Visual C++

  1. /* tvertex.c - by David Blythe (with help from Mark Kilgard), SGI */
  2. /* T-vertex artifacts example.  The moral: Avoid vertex edge junctions that
  3.    make a T-shape. */
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <GL/glut.h>
  7. #include <math.h>
  8. static float scale = 1.;
  9. static float transx = 0, transy = 0;
  10. static float rotx = 29, roty = -21;  /* Initially askew. */
  11. static int ox = -1, oy = -1;
  12. static int show_t = 1;
  13. static int mot;
  14. #define PAN 1
  15. #define ROT 2
  16. void
  17. pan(int x, int y)
  18. {
  19.   transx += (x - ox) / 500.;
  20.   transy -= (y - oy) / 500.;
  21.   ox = x;
  22.   oy = y;
  23.   glutPostRedisplay();
  24. }
  25. void
  26. rotate(int x, int y)
  27. {
  28.   rotx += x - ox;
  29.   if (rotx > 360.)
  30.     rotx -= 360.;
  31.   else if (rotx < -360.)
  32.     rotx += 360.;
  33.   roty += y - oy;
  34.   if (roty > 360.)
  35.     roty -= 360.;
  36.   else if (roty < -360.)
  37.     roty += 360.;
  38.   ox = x;
  39.   oy = y;
  40.   glutPostRedisplay();
  41. }
  42. void
  43. motion(int x, int y)
  44. {
  45.   if (mot == PAN)
  46.     pan(x, y);
  47.   else if (mot == ROT)
  48.     rotate(x, y);
  49. }
  50. void
  51. mouse(int button, int state, int x, int y)
  52. {
  53.   if (state == GLUT_DOWN) {
  54.     switch (button) {
  55.     case GLUT_LEFT_BUTTON:
  56.       mot = PAN;
  57.       motion(ox = x, oy = y);
  58.       break;
  59.     case GLUT_MIDDLE_BUTTON:
  60.       mot = ROT;
  61.       motion(ox = x, oy = y);
  62.       break;
  63.     }
  64.   } else if (state == GLUT_UP) {
  65.     mot = 0;
  66.   }
  67. }
  68. void
  69. toggle_t(void)
  70. {
  71.   show_t ^= 1;
  72. }
  73. void
  74. wire(void)
  75. {
  76.   static int w;
  77.   if (w ^= 1)
  78.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  79.   else
  80.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  81. }
  82. void
  83. light(void)
  84. {
  85.   static int l = 1;
  86.   if (l ^= 1)
  87.     glEnable(GL_LIGHTING);
  88.   else
  89.     glDisable(GL_LIGHTING);
  90. }
  91. void
  92. up(void)
  93. {
  94.   scale += .1;
  95. }
  96. void
  97. down(void)
  98. {
  99.   scale -= .1;
  100. }
  101. void
  102. help(void)
  103. {
  104.   printf("Usage: tvertexn");
  105.   printf("'h'            - helpn");
  106.   printf("'l'            - toggle lightingn");
  107.   printf("'t'            - toggle T vertexn");
  108.   printf("'w'            - toggle wireframen");
  109.   printf("'UP'           - scale upn");
  110.   printf("'DOWN'         - scale downn");
  111.   printf("left mouse     - pann");
  112.   printf("middle mouse   - rotaten");
  113. }
  114. void
  115. init(void)
  116. {
  117.   GLfloat pos[4] =
  118.   {0.0, 0.0, 1.0, 1.0};
  119.   glMatrixMode(GL_PROJECTION);
  120.   glLoadIdentity();
  121.   gluPerspective(50., 1., .1, 10.);
  122.   glMatrixMode(GL_MODELVIEW);
  123.   glLoadIdentity();
  124.   glTranslatef(0., 0., -3.5);
  125.   /* The default light is "infinite"; a local light is important to ensure
  126.      varying lighting color calculations at the vertices. */
  127.   glLightfv(GL_LIGHT0, GL_POSITION, pos);
  128.   glEnable(GL_LIGHT0);
  129.   glEnable(GL_LIGHTING);
  130. }
  131. void
  132. display(void)
  133. {
  134.   glClear(GL_COLOR_BUFFER_BIT);
  135.   glPushMatrix();
  136.   glTranslatef(transx, transy, 0.f);
  137.   glRotatef(rotx, 0., 1., 0.);
  138.   glRotatef(roty, 1., 0., 0.);
  139.   glScalef(scale, scale, 1.);
  140.   if (show_t) {
  141.     glBegin(GL_QUADS);
  142.     glVertex2f(-1., 0.);
  143.     glVertex2f(0., 0.);
  144.     glVertex2f(0., 1.);
  145.     glVertex2f(-1., 1.);
  146.     glVertex2f(0., 0.);
  147.     glVertex2f(1., 0.);
  148.     glVertex2f(1., 1.);
  149.     glVertex2f(0., 1.);
  150.     glVertex2f(-1., -1.);
  151.     glVertex2f(1., -1.);
  152.     glVertex2f(1., 0.);
  153.     glVertex2f(-1., 0.);
  154.     glEnd();
  155.   } else {
  156.     glBegin(GL_QUADS);
  157.     glVertex2f(-1., 0.);
  158.     glVertex2f(0., 0.);
  159.     glVertex2f(0., 1.);
  160.     glVertex2f(-1., 1.);
  161.     glVertex2f(0., 0.);
  162.     glVertex2f(1., 0.);
  163.     glVertex2f(1., 1.);
  164.     glVertex2f(0., 1.);
  165.     glVertex2f(-1., -1.);
  166.     glVertex2f(0., -1.);
  167.     glVertex2f(0., 0.);
  168.     glVertex2f(-1., 0.);
  169.     glVertex2f(0., -1.);
  170.     glVertex2f(1., -1.);
  171.     glVertex2f(1., 0.);
  172.     glVertex2f(0., 0.);
  173.     glEnd();
  174.   }
  175.   glPopMatrix();
  176.   glutSwapBuffers();
  177. }
  178. void
  179. reshape(int w, int h)
  180. {
  181.   glViewport(0, 0, w, h);
  182. }
  183. /* ARGSUSED1 */
  184. void
  185. key(unsigned char key, int x, int y)
  186. {
  187.   switch (key) {
  188.   case 'l':
  189.     light();
  190.     break;
  191.   case 't':
  192.     toggle_t();
  193.     break;
  194.   case 'w':
  195.     wire();
  196.     break;
  197.   case 'h':
  198.     help();
  199.     break;
  200.   case '33':
  201.     exit(0);
  202.     break;
  203.   default:
  204.     return;
  205.   }
  206.   glutPostRedisplay();
  207. }
  208. /* ARGSUSED1 */
  209. void
  210. special(int key, int x, int y)
  211. {
  212.   switch (key) {
  213.   case GLUT_KEY_UP:
  214.     up();
  215.     break;
  216.   case GLUT_KEY_DOWN:
  217.     down();
  218.     break;
  219.   default:
  220.     return;
  221.   }
  222.   glutPostRedisplay();
  223. }
  224. void
  225. menu(int value)
  226. {
  227.   key((unsigned char) value, 0, 0);
  228. }
  229. int
  230. main(int argc, char **argv)
  231. {
  232.   glutInit(&argc, argv);
  233.   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
  234.   (void) glutCreateWindow("T vertex artifact demo");
  235.   init();
  236.   glutDisplayFunc(display);
  237.   glutKeyboardFunc(key);
  238.   glutSpecialFunc(special);
  239.   glutReshapeFunc(reshape);
  240.   glutMouseFunc(mouse);
  241.   glutMotionFunc(motion);
  242.   glutCreateMenu(menu);
  243.   glutAddMenuEntry("Toggle T vertex", 't');
  244.   glutAddMenuEntry("Toggle wireframe/solid", 'w');
  245.   glutAddMenuEntry("Toggle lighting", 'l');
  246.   glutAddMenuEntry("Quit", '33');
  247.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  248.   glutMainLoop();
  249.   return 0;             /* ANSI C requires main to return int. */
  250. }