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

GIS编程

开发平台:

Visual C++

  1. /* 
  2.  * agv_example.c  (version 1.0)
  3.  *
  4.  * Example program to show how to use AGV
  5.  *
  6.  * See agviewer.h, agviewer.c and comments within for more info
  7.  *
  8.  * Philip Winston - 4/11/95
  9.  * pwinston@hmc.edu
  10.  * http://www.cs.hmc.edu/people/pwinston
  11.  */
  12. #include <GL/glut.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <math.h>
  16. #include "agviewer.h"
  17. typedef enum {NOTALLOWED, AXES, STUFF, RING } DisplayLists;
  18. int DrawAxes = 0;
  19. #define ROTATEINC 2;
  20. GLfloat Rotation = 0;  /* start ring flat and not spinning */
  21. int     Rotating = 0;
  22. void myGLInit(void)
  23. {
  24.   GLfloat mat_ambuse[] = { 0.6, 0.0, 0.0, 1.0 };
  25.   GLfloat mat_specular[] = { 0.4, 0.4, 0.4, 1.0 };
  26.   GLfloat light0_position[] = { 0.6, 0.4, 0.3, 0.0 };
  27.   glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
  28.   glEnable(GL_LIGHTING);
  29.   glEnable(GL_LIGHT0);
  30.   glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_ambuse);
  31.   glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  32.   glMaterialf(GL_FRONT, GL_SHININESS, 25.0);
  33.   
  34.   glMatrixMode(GL_PROJECTION);
  35.   glLoadIdentity();
  36.   glMatrixMode(GL_MODELVIEW);
  37.   glLoadIdentity();
  38.   glEnable(GL_NORMALIZE);
  39.   glDepthFunc(GL_LESS);
  40.   glEnable(GL_DEPTH_TEST);
  41.   glShadeModel(GL_SMOOTH);
  42.   glFlush();
  43. void MakeDisplayLists(void)
  44. {
  45.   glNewList(STUFF, GL_COMPILE);
  46.   glPushMatrix();
  47.     glutSolidCube(1.0);
  48.     glTranslatef(2, 0, 0);
  49.     glutSolidSphere(0.5, 10, 10);
  50.     glTranslatef(-2, 0, 3);
  51.     glRotatef(-90, 1, 0, 0);
  52.     glutSolidCone(0.5, 1.0, 8, 8);
  53.   glPopMatrix();
  54.   glEndList();
  55.   glNewList(RING, GL_COMPILE);
  56.     glutSolidTorus(0.1, 0.5, 8, 15);
  57.   glEndList();
  58. }
  59. void display(void)
  60. {
  61.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  62.   glMatrixMode(GL_PROJECTION);
  63.   glLoadIdentity();
  64.   gluPerspective(60, 1, 0.01, 100);
  65.     /* so this replaces gluLookAt or equiv */
  66.   agvViewTransform();
  67.   glMatrixMode(GL_MODELVIEW);
  68.   glLoadIdentity();
  69.     /* we call agvMakeAxesList() to make this display list */
  70.   if (DrawAxes)
  71.     glCallList(AXES);
  72.   glCallList(STUFF);
  73.   glTranslatef(-2, 1, -2);
  74.   glRotatef(Rotation, 1, 0, 0);
  75.   glCallList(RING);
  76.   glutSwapBuffers();
  77.   glFlush();
  78. }
  79.   /* rotate the axis and adjust position if nec. */
  80. void rotatethering(void)
  81.   Rotation += ROTATEINC;
  82.   if (agvMoving)   /* we since we are the only idle function, we must */
  83.     agvMove();     /* give AGV the chance to update the eye position */
  84.   glutPostRedisplay();
  85. }
  86. typedef enum { MENU_AXES, MENU_QUIT, MENU_RING } MenuChoices;
  87. void handlemenu(int value)
  88. {
  89.   switch (value) {
  90.     case MENU_AXES:
  91.       DrawAxes = !DrawAxes;
  92.       break;
  93.     case MENU_QUIT:
  94.       exit(0);
  95.       break;
  96.     case MENU_RING:
  97.       Rotating = !Rotating;
  98.       if (Rotating) {
  99. glutIdleFunc(rotatethering);    /* install our idle function */
  100. agvSetAllowIdle(0);             /* and tell AGV to not */
  101.       } else {
  102. glutIdleFunc(NULL);    /* uninstall our idle function      */
  103. agvSetAllowIdle(1);    /* and tell AGV it can mess with it */
  104.       }
  105.       break;
  106.     }
  107.   glutPostRedisplay();
  108. }
  109. void visible(int v)
  110. {
  111.   if (v == GLUT_VISIBLE) {
  112.     if (Rotating) {
  113.       glutIdleFunc(rotatethering);
  114.       agvSetAllowIdle(0);
  115.     } else {
  116.       glutIdleFunc(NULL);
  117.       agvSetAllowIdle(1);      
  118.     }
  119.   } else {
  120.       glutIdleFunc(NULL);
  121.       agvSetAllowIdle(0);
  122.   }
  123. }
  124. void MenuInit(void)
  125. {
  126.   int sub2 = glutCreateMenu(agvSwitchMoveMode);   /* pass these right to */
  127.   glutAddMenuEntry("Flying move",  FLYING);       /* agvSwitchMoveMode() */
  128.   glutAddMenuEntry("Polar move",   POLAR);
  129.   glutCreateMenu(handlemenu);
  130.   glutAddSubMenu("Movement", sub2);
  131.   glutAddMenuEntry("Toggle Axes", MENU_AXES);
  132.   glutAddMenuEntry("Toggle ring rotation", MENU_RING);
  133.   glutAddMenuEntry("Quit", MENU_QUIT);
  134.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  135. }
  136. int main(int argc, char** argv)
  137. {
  138.   glutInit(&argc, argv);
  139.   glutInitWindowSize(512, 512);
  140.   glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
  141.   glutCreateWindow("AGV example");
  142.   
  143.   glutVisibilityFunc(visible);
  144.   if (Rotating)
  145.     glutIdleFunc(rotatethering);
  146.  
  147.     /*
  148.      * let AGV know if it can mess with the idle function (if we've
  149.      * just installed an idle function, we tell AGV it can't touch it)
  150.      */
  151.   agvInit(!Rotating);
  152.     
  153.     /* 
  154.      * agvInit() installs mouse, motion, and keyboard handles, but 
  155.      * we don't care for this example cause we only use right button menu
  156.      */
  157.   agvMakeAxesList(AXES);  /* create AGV axes */
  158.   myGLInit(); 
  159.   MakeDisplayLists();
  160.   MenuInit();
  161.   glutDisplayFunc(display);
  162.   glutMainLoop();
  163.   return 0;             /* ANSI C requires main to return int. */
  164. }