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

GIS编程

开发平台:

Visual C++

  1. /*
  2.  * main.c - part of the chess demo in the glut distribution.
  3.  *
  4.  * (C) Henk Kok (kok@wins.uva.nl)
  5.  *
  6.  * This file can be freely copied, changed, redistributed, etc. as long as
  7.  * this copyright notice stays intact.
  8.  */
  9. #include <stdlib.h>
  10. #include <GL/glut.h>
  11. #include <math.h>
  12. #include "chess.h"
  13. /* Some <math.h> files do not define M_PI... */
  14. #ifndef M_PI
  15. #define M_PI 3.14159265358979323846
  16. #endif
  17. #define M_TEXTURING 1
  18. #define M_REFLECTION 2
  19. #define M_CHAOS 3
  20. #define M_ANIMATION 4
  21. extern int reflection, texturing, animating, chaos;
  22. GLfloat lightpos[4] = { 2.0, 1.0, 1.0, 0.0 };
  23. GLfloat lightamb[4] = { 1.0, 1.0, 1.0, 1.0 };
  24. GLfloat lightdif[4] = { 1.0, 1.0, 1.0, 1.0 };
  25. float angle = 0.0, a2 =  45.0;
  26. int speed = 0;
  27. GLfloat px = -3.5, py = -16.5, pz = 9.5;
  28. void SetCamera(void)
  29. {
  30.     gluLookAt(0.0,2.0,2.0, 0.0,2.0,0.0, 0.0,1.0,0.0);
  31.     glRotatef(a2, 1.0, 0.0, 0.0);
  32.     glRotatef(angle, 0.0, 1.0, 0.0);
  33.     glTranslatef(px, -pz, py);
  34.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  35. }
  36. void display(void)
  37. {
  38.     glLoadIdentity();
  39.     SetCamera();
  40.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  41.     do_display();
  42.     glutSwapBuffers();
  43. }
  44. void myinit(void)
  45. {
  46.     glShadeModel (GL_SMOOTH);
  47.     glFrontFace(GL_CCW);
  48.     glEnable(GL_DEPTH_TEST);
  49.     glLoadIdentity();
  50.     glClearColor(0.0, 0.0, 0.0, 1.0);
  51.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  52.     glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb);
  53.     glLightfv(GL_LIGHT0, GL_DIFFUSE, lightdif);
  54.     glEnable(GL_LIGHTING);
  55.     glEnable(GL_LIGHT0);
  56.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  57.     init_lists();
  58. }
  59. void Animate(void)
  60. {
  61.     px -= speed * 0.02 * sin(angle*M_PI/180);
  62.     py += speed * 0.02 * cos(angle*M_PI/180);
  63.     if (animating)
  64. proceed();
  65.     glutPostRedisplay();
  66. }
  67. extern int chaosPieces;
  68. /* ARGSUSED1 */
  69. void parsekey(unsigned char key, int x, int y)
  70. {
  71.     switch (key)
  72.     {
  73. case 27: exit(0);
  74. case 13: speed = 0; break;
  75. case 'a': a2 += 5; break;
  76. case 'z': a2 -= 5; break;
  77. case 'A': pz += 0.5; break;
  78. case 'Z': pz -= 0.5; break;
  79.         default:
  80.     return;
  81.     }
  82.     glutPostRedisplay();
  83.     if (animating || (chaosPieces > 0) || (speed != 0)) 
  84.           glutIdleFunc(Animate);
  85.     else
  86.           glutIdleFunc(NULL);
  87. }
  88. /* ARGSUSED1 */
  89. void parsekey_special(int key, int x, int y)
  90. {
  91.     switch (key)
  92.     {
  93. case GLUT_KEY_UP: speed += 1; break;
  94. case GLUT_KEY_DOWN: speed -= 1; break;
  95. case GLUT_KEY_RIGHT: angle += 5; break;
  96. case GLUT_KEY_LEFT: angle -= 5; break;
  97. case GLUT_KEY_HOME:
  98.             angle = 0.0, a2 =  45.0;
  99.             speed = 0;
  100.             px = -3.5, py = -16.5, pz = 9.5;
  101.             break;
  102.         default:
  103.     return;
  104.     }
  105.     glutPostRedisplay();
  106.     if (animating || (chaosPieces > 0) || (speed != 0)) 
  107.           glutIdleFunc(Animate);
  108.     else
  109.           glutIdleFunc(NULL);
  110. }
  111. void handle_main_menu(int item)
  112. {
  113.     switch(item) {
  114.     case M_REFLECTION:
  115. reflection = !reflection;
  116.         glutPostRedisplay();
  117. break;
  118.     case M_TEXTURING:
  119. texturing = !texturing;
  120.         glutPostRedisplay();
  121. break;
  122.     case M_ANIMATION:
  123. animating = !animating;
  124. if (animating || (chaosPieces > 0) || (speed != 0)) 
  125.           glutIdleFunc(Animate);
  126. else
  127.           glutIdleFunc(NULL);
  128. break;
  129.     case M_CHAOS:
  130. chaos = !chaos;
  131. if (animating || chaos || (speed != 0)) 
  132.           glutIdleFunc(Animate);
  133. break;
  134.     }
  135. }
  136. void
  137. Visible(int visible)
  138. {
  139.   if (visible == GLUT_VISIBLE) {
  140.     if (animating || (chaosPieces > 0) || (speed != 0))
  141.       glutIdleFunc(Animate);
  142.   } else {
  143.     glutIdleFunc(NULL);
  144.   }
  145. }
  146. void myReshape(int w, int h)
  147. {
  148.     glMatrixMode(GL_PROJECTION);
  149.     glLoadIdentity();
  150.     glFrustum (-0.1, 0.1, -0.1, 0.1, 0.3, 200.0);
  151.     glMatrixMode (GL_MODELVIEW);
  152.     glViewport(0, 0, w, h);
  153.     glLoadIdentity();
  154.     SetCamera();
  155. }
  156. int main(int argc, char *argv[])
  157. {
  158.     glutInit(&argc, argv);
  159.     glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | GLUT_DOUBLE | GLUT_MULTISAMPLE | GLUT_STENCIL);
  160.     glutCreateWindow("Chess");
  161.     glutDisplayFunc(display);
  162.     glutInitWindowPosition(200, 0);
  163.     glutInitWindowSize(300, 300);
  164.     glutKeyboardFunc(parsekey);
  165.     glutSpecialFunc(parsekey_special);
  166.     glutReshapeFunc(myReshape);
  167.     glutVisibilityFunc(Visible);
  168.     myinit();
  169.     glutCreateMenu(handle_main_menu);
  170.     glutAddMenuEntry("Toggle texturing", M_TEXTURING);
  171.     glutAddMenuEntry("Toggle reflection", M_REFLECTION);
  172.     glutAddMenuEntry("-----------------", -1);
  173.     glutAddMenuEntry("Toggle animation", M_ANIMATION);
  174.     glutAddMenuEntry("Toggle CHAOS!", M_CHAOS);
  175.     glutAttachMenu(GLUT_RIGHT_BUTTON);
  176.  
  177.     glutSwapBuffers();
  178.     glutMainLoop();
  179.     return 0;             /* ANSI C requires main to return int. */
  180. }