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

GIS编程

开发平台:

Visual C++

  1. /* tess.c - by David Blythe, SGI */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <GL/glut.h>
  5. static GLfloat spin = 0;
  6. static int level = 4;
  7. static int model = 0;
  8. static GLfloat rotx, roty;
  9. static int ox = -1, oy = -1;
  10. static int mot;
  11. #define PAN     1
  12. #define ROT     2
  13. void
  14. movelight(int x, int y) {
  15.     spin += (y-oy);
  16.     ox = x; oy = y;
  17.     if (spin > 360.) spin -= 360.;
  18.     if (spin < -360.) spin -= -360.;
  19.     glutPostRedisplay();
  20. }
  21. void
  22. rotate(int x, int y) {
  23.     rotx += x-ox;
  24.     if (rotx > 360.) rotx -= 360.;
  25.     else if (rotx < -360.) rotx += 360.;
  26.     roty += y-oy;
  27.     if (roty > 360.) roty -= 360.;
  28.     else if (roty < -360.) roty += 360.;
  29.     ox = x; oy = y;
  30.     glutPostRedisplay();
  31. }
  32. void
  33. motion(int x, int y) {
  34.     if (mot == PAN) movelight(x, y);
  35.     else if (mot == ROT) rotate(x,y);
  36. }
  37. void
  38. mouse(int button, int state, int x, int y) {
  39.     if(state == GLUT_DOWN) {
  40.         switch(button) {
  41.         case GLUT_LEFT_BUTTON:
  42.             mot = PAN;
  43.             motion(ox = x, oy = y);
  44.             break;
  45.         case GLUT_MIDDLE_BUTTON:
  46.             mot = ROT;
  47.             motion(ox = x, oy = y);
  48.             break;
  49.         case GLUT_RIGHT_BUTTON:
  50.             break;
  51.         }
  52.     } else if (state == GLUT_UP) {
  53.         mot = 0;
  54.     }
  55. }
  56. void togglewire(void) {
  57.     static int toggle = 0;
  58.     toggle ^= 1;
  59.     glPolygonMode(GL_FRONT_AND_BACK, toggle ? GL_LINE : GL_FILL);
  60. }
  61. void genmodel(void) {
  62.     extern void sphere(int level);
  63.     glNewList(1, GL_COMPILE);
  64.     if (model) {
  65.         GLUquadricObj *q = gluNewQuadric();
  66.         gluSphere(q, 1.0, 10*level, 10*level);
  67.         gluDeleteQuadric(q);
  68.     } else {
  69.         sphere(level-1);
  70.     }
  71.     glEndList();
  72. }
  73. void togglemodel(void) {
  74.     model ^= 1;
  75.     genmodel();
  76. }
  77. void levelup(void) {
  78.     level += 1;
  79.     if (level > 7) level = 7;
  80.     genmodel();
  81. }
  82. void leveldown(void) {
  83.     level -= 1;
  84.     if (level <= 0) level = 1;
  85.     genmodel();
  86. }
  87. void help(void) {
  88.     printf("'h'      - helpn");
  89.     printf("'t'      - tessellation stylen");
  90.     printf("'UP'     - increase tessellationn");
  91.     printf("'DOWN'   - decrease tessellationn");
  92.     printf("left mouse     - rotate spheren");
  93.     printf("middle mouse   - move lightn");
  94. }
  95. void init(void) {
  96.     GLfloat specular[4] = { 1., 1., 1., 1. };
  97.     glEnable(GL_LIGHTING);
  98.     glEnable(GL_LIGHT0);
  99.     genmodel();
  100.     glDepthFunc(GL_LESS);
  101.     glEnable(GL_DEPTH_TEST);
  102.     glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular);
  103.     glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 30);
  104. }
  105. void display(void) {
  106.     GLfloat position[] = { 0.0, 0.0, 3.5, 1.0 };
  107.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  108.     glPushMatrix();
  109.     glTranslatef(0.0, 0.0, -5.0); 
  110.     glPushMatrix();
  111.     glRotatef(spin, 1.0, 0.0, 0.0);
  112.     glRotatef(0.0, 1.0, 0.0, 0.0);
  113.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  114.     glPopMatrix();
  115.     glRotatef(rotx, 0., 1., 0.);
  116.     glRotatef(roty, 1., 0., 0.);
  117.     glCallList(1);
  118.     glPopMatrix();
  119.     glutSwapBuffers();
  120. }
  121. void reshape(int w, int h) {
  122.     glViewport(0, 0, w, h);
  123.     glMatrixMode(GL_PROJECTION);
  124.     glLoadIdentity();
  125.     gluPerspective(40.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
  126.     glMatrixMode(GL_MODELVIEW);
  127. }
  128. /* ARGSUSED1 */
  129. void
  130. key(unsigned char key, int x, int y) {
  131.     switch(key) {
  132.     case 't': togglemodel(); break;
  133.     case 'w': togglewire(); break;
  134.     case 'h': help(); break;
  135.     case '33': exit(0);
  136.     default: break;
  137.     }
  138.     glutPostRedisplay();
  139. }
  140. /* ARGSUSED1 */
  141. void
  142. special(int key, int x, int y) {
  143.     switch(key) {
  144.     case GLUT_KEY_UP:   levelup(); break;
  145.     case GLUT_KEY_DOWN: leveldown(); break;
  146.     }
  147.     glutPostRedisplay();
  148. }
  149. void
  150. menu(int value)
  151. {
  152.     if(value<0)
  153.       special(-value,0,0);
  154.     else
  155.        key((unsigned char) value,0,0);
  156. }
  157. int main(int argc, char** argv) {
  158.     glutInit(&argc, argv);
  159.     glutInitWindowSize(512, 512);
  160.     glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE|GLUT_DEPTH);
  161.     (void)glutCreateWindow("Quality of sphere tesselation");
  162.     init();
  163.     glutDisplayFunc(display);
  164.     glutKeyboardFunc(key);
  165.     glutSpecialFunc(special);
  166.     glutReshapeFunc(reshape);
  167.     glutMouseFunc(mouse);
  168.     glutMotionFunc(motion);
  169.     glutCreateMenu(menu);
  170.     glutAddMenuEntry("Toggle sphere model", 't');
  171.     glutAddMenuEntry("Toggle solid/wireframe", 'w');
  172.     glutAddMenuEntry("Increase tessellation", -GLUT_KEY_UP);
  173.     glutAddMenuEntry("Decrease tessellation", -GLUT_KEY_DOWN);
  174.     glutAddMenuEntry("Print help message", 'h');
  175.     glutAddMenuEntry("Quit", '33');
  176.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  177.     glutMainLoop();
  178.     return 0;             /* ANSI C requires main to return int. */
  179. }