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

GIS编程

开发平台:

Visual C++

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