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

GIS编程

开发平台:

Visual C++

  1. /* aux2glut conversion Copyright (c) Mark J. Kilgard, 1997 */
  2. /* ==========================================================================
  3.                                MAIN_C
  4. =============================================================================
  5.     FUNCTION NAMES
  6.     movelight  -- moves the light source.
  7.     rotatexface  -- rotates the face about the X axis.
  8.     rotateyface  -- rotates the face about the Y axis.
  9.     myinit  -- local initialization.
  10.     faceinit  -- glutInit(&argc, argv); initialize the face data.
  11.     display  -- display functions.
  12.     myReshape  -- window respahe callback.
  13.     error_exit -- error function.
  14.     usage -- usage function.
  15.     GLenum Key  -- keyboard mappings.
  16.     main  -- main program.
  17.     C SPECIFICATIONS
  18.     void movelight  ( int x, int y )
  19.     void rotatexface  ( int x, int y )
  20.     void rotateyface  ( int x, int y )
  21.     void myinit  ( void )
  22.     faceinit  ( void )
  23.     void display  ( void )
  24.     void myReshape  ( GLsizei w, GLsizei h )
  25.     void error_exit ( char *error_message )
  26.     void usage ( char *name )
  27.     static GLenum Key  ( int key, GLenum mask )
  28.     void main  ( int argc, char** argv )
  29.     DESCRIPTION
  30. This module is where everything starts. This module comes as is 
  31. with no warranties.  
  32.     SIDE EFFECTS
  33. Unknown.
  34.    
  35.     HISTORY
  36. Created 16-Dec-94  Keith Waters at DEC's Cambridge Research Lab.
  37. Modified 22-Nov-96 Sing Bing Kang (sbk@crl.dec.com)
  38.   Added function print_mesg to print out all the keyboard commands
  39.   Added the following functionalities:
  40.     rereading the expression file
  41.     changing the expression (based on the expression file)
  42.     quitting the program with 'q' or 'Q' in addition to 'Esc'
  43. ============================================================================ */
  44. #include <stdio.h>
  45. #include <string.h>
  46. #include <stdlib.h>
  47. #include <GL/glut.h>
  48. #include "memory.h"               /* Local memory allocation macros          */
  49. /*#include "window.h"                Local window header                     */
  50. #include "head.h"                 /* Local head data structure               */
  51. int verbose = 0;
  52. void print_mesg(void);
  53. int DRAW_MODE = 2 ;
  54. HEAD *face ;
  55. static int spinxlight = 0 ;
  56. static int spinylight = 0 ;
  57. static int spinxface = 0 ;
  58. static int spinyface = 0 ;
  59. /* ========================================================================= */
  60. /* motion                                                              */
  61. /* ========================================================================= */  
  62. /*
  63. ** Rotate the face and light about.
  64. */
  65. int rotate = 0, movelight = 0, origx, origy;
  66. void motion ( int x, int y )
  67. {
  68.   if (rotate) {
  69.     spinyface = ( spinyface + (x - origx) ) % 360 ;
  70.     spinxface = ( spinxface + (y - origy) ) % 360 ;
  71.     origx = x;
  72.     origy = y;
  73.     glutPostRedisplay();
  74.   }
  75.   if (movelight) {
  76.     spinylight = ( spinylight + (x - origx ) ) % 360 ;
  77.     spinxlight = ( spinxlight + (y - origy ) ) % 360 ;
  78.     origx = x;
  79.     origy = y;
  80.     glutPostRedisplay();
  81.   }
  82. }
  83. void
  84. mouse(int button, int state, int x, int y)
  85. {
  86.   switch(button) {
  87.   case GLUT_LEFT_BUTTON:
  88.     if (state == GLUT_DOWN) {
  89.       origx = x;
  90.       origy = y;
  91.       rotate = 1;
  92.     } else {
  93.       rotate = 0;
  94.     }
  95.     break;
  96.   case GLUT_MIDDLE_BUTTON:
  97.     if (state == GLUT_DOWN) {
  98.       origx = x;
  99.       origy = y;
  100.       movelight = 1;
  101.     } else {
  102.       movelight = 0;
  103.     }
  104.     break;
  105.   }
  106. }
  107. /* ========================================================================= */
  108. /* myinit                                                      */
  109. /* ========================================================================= */  
  110. /*
  111. ** Do the lighting thing.
  112. */
  113. void myinit ( void )
  114. {
  115.   glEnable    ( GL_LIGHTING   ) ;
  116.   glEnable    ( GL_LIGHT0     ) ;
  117.   glDepthFunc ( GL_LEQUAL     ) ;
  118.   glEnable    ( GL_DEPTH_TEST ) ;
  119. }
  120. /* ========================================================================= */
  121. /* faceinit                                                      */
  122. /* ========================================================================= */  
  123. /*
  124. ** Read in the datafiles and glutInit(&argc, argv); initialize the face data structures.
  125. */
  126. void
  127. faceinit ( void )
  128. {
  129.   face = create_face         ( "index.dat", "faceline.dat") ;
  130.   read_muscles               ("muscle.dat", face ) ;
  131.   read_expression_vectors    ("expression-vectors.dat", face ) ;
  132.   data_struct                ( face ) ;
  133. }
  134. void
  135. read_expressions(void)
  136. {
  137.   read_expression_vectors    ("expression-vectors.dat", face ) ;
  138. }
  139. /* ========================================================================= */
  140. /* display                                                                   */
  141. /* ========================================================================= */  
  142. /*
  143. ** Here's were all the display action takes place.
  144. */
  145. void display ( void )
  146. {
  147.   GLfloat position [] = { 30.0, 70.0, 100.0, 1.0 }  ;
  148.     
  149.   glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ) ;
  150.   glPushMatrix ( ) ; 
  151.   
  152.     glTranslatef ( 0.0, 0.0, -30.0 ) ;
  153.     glRotated ( (GLdouble) spinxface, 1.0, 0.0, 0.0 ) ;
  154.     glRotated ( (GLdouble) spinyface, 0.0, 1.0, 0.0 ) ;
  155.   
  156.     glPushMatrix ( ) ; 
  157.       glRotated ( (GLdouble) spinxlight, 1.0, 0.0, 0.0 ) ;
  158.       glRotated ( (GLdouble) spinylight, 0.0, 1.0, 0.0 ) ;
  159.       glLightfv ( GL_LIGHT0, GL_POSITION, position ) ;
  160.   
  161.       glTranslated  ( 0.0, 0.0, 50.0 ) ;
  162.       glDisable ( GL_LIGHTING ) ;
  163.       glColor3f ( 0.0, 1.0, 1.0 ) ;
  164.       glutWireCube  ( 0.1 ) ;
  165.       glEnable ( GL_LIGHTING ) ;
  166.    glPopMatrix ( ) ;
  167.   calculate_polygon_vertex_normal  ( face ) ;
  168.   paint_polygons  ( face, DRAW_MODE, 0 ) ;
  169.   if ( DRAW_MODE == 0 )
  170.     paint_muscles ( face ) ;
  171.   
  172.   glPopMatrix();
  173.   glutSwapBuffers();
  174. }
  175. /* ========================================================================= */
  176. /* myReshape                                                      */
  177. /* ========================================================================= */  
  178. /*
  179. ** What to do of the window is modified.
  180. */
  181. void myReshape ( GLsizei w, GLsizei h )
  182. {
  183.   glViewport ( 0,0,w,h ) ;
  184.   glMatrixMode  ( GL_PROJECTION ) ;
  185.   glLoadIdentity( ) ;
  186.   gluPerspective( 40.0, (GLfloat) w/(GLfloat) h, 1.0, 100.0 ) ;
  187.   glMatrixMode  ( GL_MODELVIEW ) ;
  188. }
  189. /* ========================================================================= */
  190. /* error_exit                                                              */
  191. /* ========================================================================= */  
  192. /*
  193. ** Problems!
  194. */
  195. void error_exit( char *error_message )
  196. {
  197.     fprintf ( stderr, "%sn", error_message ) ;
  198.     exit( 1 ) ;
  199. }
  200. /* ========================================================================= */
  201. /* usage                                                      */
  202. /* ========================================================================= */  
  203. /*
  204. ** At startup provide usage modes.
  205. */
  206. void usage( char *name )
  207. {
  208.     fprintf( stderr, "n%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%sn",
  209.         "usage: ", name, " [options]nn",
  210.         "  Options:n",
  211.         "    -display  displayname  specify an X server connectionn",
  212.         "    -geometry geometry     specify window geometry in pixelsn",
  213.         "    -rgba                  ask for rgba visualn",
  214.         "    -index                 ask for color index visualn",
  215.         "    -doublebuffer          ask for double buffered visualn",
  216.         "    -singlebuffer          ask for single buffered visualn",
  217.         "    -accum                 ask for accumulation buffern",
  218.         "    -alpha                 ask for alpha buffern",
  219.         "    -depth                 ask for depth buffern",
  220.         "    -stencil               ask for stencil buffern",
  221.         "    -aux nauxbuf           specify number of aux buffersn",
  222.         "    -level planes          specify planes (0=main,>0=overlay,<0=underlayn",
  223.         "    -transparent           ask for transparent overlayn",
  224.         "    -opaque                ask for opaque overlayn"
  225.     );
  226.     
  227.     exit( 1);
  228. }
  229. /* ========================================================================= */
  230. /* Key                                                      */
  231. /* ========================================================================= */
  232. /*
  233. ** Actions on a key press.
  234. */
  235. static int m = 0, e = 0;
  236. /* ARGSUSED1 */
  237. static void Key ( unsigned char key, int x, int y )
  238. {
  239.   char title[512];
  240.   
  241.     switch ( key ) {
  242.       case 27 :
  243.       case 'q' :
  244.       case 'Q' :
  245. exit (0) ;
  246.       case 'r' :
  247.       case 'R' :
  248. printf ("Rereading expression filen");
  249.         read_expressions();
  250. e = 0; /* reset the expression count variable */
  251. glutPostRedisplay();
  252. break;
  253.       case 'a' :
  254. printf ("increment muscle: %sn", face->muscle[m]->name ) ;
  255. /* set the muscle activation */
  256. face->muscle[m]->mstat += 0.1 ;
  257. activate_muscle ( face, 
  258.  face->muscle[m]->head, 
  259.  face->muscle[m]->tail, 
  260.  face->muscle[m]->fs,
  261.  face->muscle[m]->fe,
  262.  face->muscle[m]->zone,
  263.  0.1 ) ;
  264. glutPostRedisplay();
  265. break;
  266.       case 'A' :
  267. printf ("decrement muscle: %sn", face->muscle[m]->name ) ;
  268. face->muscle[m]->mstat -= 0.1 ;
  269. activate_muscle ( face, 
  270.  face->muscle[m]->head, 
  271.  face->muscle[m]->tail, 
  272.  face->muscle[m]->fs,
  273.  face->muscle[m]->fe,
  274.  face->muscle[m]->zone,
  275.  -0.1 ) ;
  276. glutPostRedisplay();
  277. break;
  278.       case 'b' :
  279. DRAW_MODE++ ;
  280. if ( DRAW_MODE >= 3 ) DRAW_MODE = 0 ;
  281. printf ("draw mode: %dn", DRAW_MODE ) ;
  282. glutPostRedisplay();
  283. break;
  284.       case 'c' :
  285. face_reset ( face ) ;
  286. glutPostRedisplay();
  287. break;
  288.       case 'n' :
  289. m++ ;
  290. if ( m >= face->nmuscles ) m = 0 ;
  291.         sprintf(title, "geoface (%s)", face->muscle[m]->name);
  292.         glutSetWindowTitle(title);
  293. break;
  294.       case 'e' :
  295. if (face->expression) {
  296. face_reset  ( face ) ;
  297. expressions ( face, e ) ;
  298. e++ ;
  299. if ( e >= face->nexpressions ) e = 0 ;
  300. glutPostRedisplay();
  301. }
  302. break;
  303.       case 'h' :
  304. print_mesg();
  305.     }
  306. }
  307. /* ARGSUSED1 */
  308. void
  309. special(int key, int x, int y)
  310. {
  311.   char title[512];
  312.   switch(key) {
  313.   case GLUT_KEY_RIGHT:
  314.     m++ ;
  315.     if ( m >= face->nmuscles ) m = 0 ;
  316.     sprintf(title, "geoface (%s)", face->muscle[m]->name);
  317.     glutSetWindowTitle(title);
  318.     break;
  319.   case GLUT_KEY_LEFT:
  320.     m-- ;
  321.     if ( m < 0 ) m = face->nmuscles - 1 ;
  322.     sprintf(title, "geoface (%s)", face->muscle[m]->name);
  323.     glutSetWindowTitle(title);
  324.     break;
  325.   case GLUT_KEY_UP:
  326. face->muscle[m]->mstat += 0.1 ;
  327. activate_muscle ( face, 
  328.  face->muscle[m]->head, 
  329.  face->muscle[m]->tail, 
  330.  face->muscle[m]->fs,
  331.  face->muscle[m]->fe,
  332.  face->muscle[m]->zone,
  333.  0.1 ) ;
  334. glutPostRedisplay();
  335.     break;
  336.   case GLUT_KEY_DOWN:
  337. face->muscle[m]->mstat -= 0.1 ;
  338. activate_muscle ( face, 
  339.  face->muscle[m]->head, 
  340.  face->muscle[m]->tail, 
  341.  face->muscle[m]->fs,
  342.  face->muscle[m]->fe,
  343.  face->muscle[m]->zone,
  344.  -0.1 ) ;
  345. glutPostRedisplay();
  346.     break;
  347.   }
  348. }
  349. /* ========================================================================= *
  350.  * print_mesg
  351.  * Written by: Sing Bing Kang (sbk@crl.dec.com)
  352.  * Date: 11/22/96
  353.  * ========================================================================= */
  354. /*
  355. ** Prints out help message
  356. */
  357. void
  358. print_mesg(void)
  359. {
  360. fprintf(stderr,"n");
  361. fprintf(stderr,"a:       draw mode (to `pull' the current facial muscle)n");
  362. fprintf(stderr,"A:       draw mode (to `contract' current facial muscle)n");
  363. fprintf(stderr,"c:       face resetn");
  364. fprintf(stderr,"n:       next muscle (to select another facial muscle to manipulate)n");
  365. fprintf(stderr,"e:       next expressionn");
  366. fprintf(stderr,"b:       to change draw mode: wireframe->polygonal patches->smooth surfacen");
  367. fprintf(stderr,"r,R:     reread the expression file (../face-data/expression-vectors.dat)n         (Note: this resets the expression sequence to the beginning)n");
  368. fprintf(stderr,"q,Q,Esc: quitn");
  369. fprintf(stderr,"h:       outputs this messagen");
  370. fprintf(stderr,"n");
  371. }
  372. void
  373. muscle_select(int value)
  374. {
  375.   char title[512];
  376.   /* Select muscle. */
  377.   m = value;
  378.   sprintf(title, "geoface (%s)", face->muscle[m]->name);
  379.   glutSetWindowTitle(title);
  380. }
  381. void
  382. main_menu_select(int value)
  383. {
  384.   char title[512];
  385.   switch(value) {
  386.   case 1:
  387.     face_reset ( face ) ;
  388.     glutPostRedisplay();
  389.     break;
  390.   case 2:
  391.     print_mesg();
  392.     break;
  393.   case 3:
  394.     face->muscle[m]->mstat += 0.25 ;
  395.     activate_muscle ( face, 
  396.       face->muscle[m]->head, 
  397.       face->muscle[m]->tail, 
  398.       face->muscle[m]->fs,
  399.       face->muscle[m]->fe,
  400.       face->muscle[m]->zone,
  401.       +0.25 ) ;
  402.     glutPostRedisplay();
  403.     break;
  404.   case 4:
  405.     face->muscle[m]->mstat -= 0.25 ;
  406.     activate_muscle ( face, 
  407.       face->muscle[m]->head, 
  408.       face->muscle[m]->tail, 
  409.       face->muscle[m]->fs,
  410.       face->muscle[m]->fe,
  411.       face->muscle[m]->zone,
  412.       -0.25 ) ;
  413.     glutPostRedisplay();
  414.     break;
  415.   case 5:
  416.     m++ ;
  417.     if ( m >= face->nmuscles ) m = 0 ;
  418.     sprintf(title, "geoface (%s)", face->muscle[m]->name);
  419.     glutSetWindowTitle(title);
  420.     break;
  421.   case 666:
  422.     exit(0);
  423.     break;
  424.   }
  425. }
  426. void
  427. draw_mode_select(int value)
  428. {
  429.   DRAW_MODE = value;
  430.   glutPostRedisplay();
  431. }
  432. void
  433. make_menus(void)
  434. {
  435.   int i, j, muscle_menu, draw_mode_menu;
  436.   char *entry;
  437.   muscle_menu = glutCreateMenu(muscle_select);
  438.   for (i=0; i<face->nmuscles; i++) {
  439.     entry = face->muscle[i]->name;
  440.     for(j=(int) strlen(entry)-1; j>=0; j--) {
  441.       if (entry[j] == '_') entry[j] = ' ';
  442.     }
  443.     glutAddMenuEntry(entry, i);
  444.   }
  445.   draw_mode_menu = glutCreateMenu(draw_mode_select);
  446.   glutAddMenuEntry("Wireframe", 0);
  447.   glutAddMenuEntry("Polygonal patches", 1);
  448.   glutAddMenuEntry("Smooth surface", 2);
  449.   glutCreateMenu(main_menu_select);
  450.   glutAddMenuEntry("Pull muscle up", 3);
  451.   glutAddMenuEntry("Pull muscle down", 4);
  452.   glutAddMenuEntry("Next muscle", 5);
  453.   glutAddSubMenu("Select muscle", muscle_menu);
  454.   glutAddSubMenu("Draw mode", draw_mode_menu);
  455.   glutAddMenuEntry("Face reset", 1);
  456.   glutAddMenuEntry("Print help", 2);
  457.   glutAddMenuEntry("Quit", 666);
  458.   glutAttachMenu(GLUT_RIGHT_BUTTON);
  459. }
  460. /* ========================================================================= */
  461. /* main                                                     */
  462. /* ========================================================================= */
  463. /*
  464. ** All the initialization and action takes place here.
  465. */
  466. int main ( int argc, char** argv )
  467. {
  468.   int i;
  469.   glutInitWindowSize ( 400, 600 ) ;
  470.   glutInit(&argc, argv);
  471.   for(i=1; i<argc; i++) {
  472.     if(!strcmp(argv[i], "-v")) {
  473.       verbose = 1;
  474.     }
  475.   }
  476.   glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
  477.   glutCreateWindow ( "geoface" ) ;
  478.   myinit ( ) ;
  479.   faceinit ( ) ;
  480.   glutMouseFunc(mouse);
  481.   glutMotionFunc(motion);
  482.   glutKeyboardFunc ( Key ) ;
  483.   glutSpecialFunc(special);
  484.   glutReshapeFunc  ( myReshape ) ;
  485.   glutDisplayFunc(display);
  486.   make_menus();
  487.   glutMainLoop() ;
  488.   return 0;             /* ANSI C requires main to return int. */
  489. }
  490.