📄 main.c
字号:
char title[512];
switch ( key ) {
case 27 :
case 'q' :
case 'Q' :
exit (0) ;
case 'r' :
case 'R' :
printf ("Rereading expression file\n");
read_expressions();
e = 0; /* reset the expression count variable */
glutPostRedisplay();
break;
case 'a' :
printf ("increment muscle: %s\n", face->muscle[m]->name ) ;
/* set the muscle activation */
face->muscle[m]->mstat += 0.1 ;
activate_muscle ( face,
face->muscle[m]->head,
face->muscle[m]->tail,
face->muscle[m]->fs,
face->muscle[m]->fe,
face->muscle[m]->zone,
0.1 ) ;
glutPostRedisplay();
break;
case 'A' :
printf ("decrement muscle: %s\n", face->muscle[m]->name ) ;
face->muscle[m]->mstat -= 0.1 ;
activate_muscle ( face,
face->muscle[m]->head,
face->muscle[m]->tail,
face->muscle[m]->fs,
face->muscle[m]->fe,
face->muscle[m]->zone,
-0.1 ) ;
glutPostRedisplay();
break;
case 'b' :
DRAW_MODE++ ;
if ( DRAW_MODE >= 3 ) DRAW_MODE = 0 ;
printf ("draw mode: %d\n", DRAW_MODE ) ;
glutPostRedisplay();
break;
case 'c' :
face_reset ( face ) ;
glutPostRedisplay();
break;
case 'n' :
m++ ;
if ( m >= face->nmuscles ) m = 0 ;
sprintf(title, "geoface (%s)", face->muscle[m]->name);
glutSetWindowTitle(title);
break;
case 'e' :
if (face->expression) {
face_reset ( face ) ;
expressions ( face, e ) ;
e++ ;
if ( e >= face->nexpressions ) e = 0 ;
glutPostRedisplay();
}
break;
case 'h' :
print_mesg();
}
}
/* ARGSUSED1 */
void
special(int key, int x, int y)
{
char title[512];
switch(key) {
case GLUT_KEY_RIGHT:
m++ ;
if ( m >= face->nmuscles ) m = 0 ;
sprintf(title, "geoface (%s)", face->muscle[m]->name);
glutSetWindowTitle(title);
break;
case GLUT_KEY_LEFT:
m-- ;
if ( m < 0 ) m = face->nmuscles - 1 ;
sprintf(title, "geoface (%s)", face->muscle[m]->name);
glutSetWindowTitle(title);
break;
case GLUT_KEY_UP:
face->muscle[m]->mstat += 0.1 ;
activate_muscle ( face,
face->muscle[m]->head,
face->muscle[m]->tail,
face->muscle[m]->fs,
face->muscle[m]->fe,
face->muscle[m]->zone,
0.1 ) ;
glutPostRedisplay();
break;
case GLUT_KEY_DOWN:
face->muscle[m]->mstat -= 0.1 ;
activate_muscle ( face,
face->muscle[m]->head,
face->muscle[m]->tail,
face->muscle[m]->fs,
face->muscle[m]->fe,
face->muscle[m]->zone,
-0.1 ) ;
glutPostRedisplay();
break;
}
}
/* ========================================================================= *
* print_mesg
* Written by: Sing Bing Kang (sbk@crl.dec.com)
* Date: 11/22/96
* ========================================================================= */
/*
** Prints out help message
*/
void
print_mesg(void)
{
fprintf(stderr,"\n");
fprintf(stderr,"a: draw mode (to `pull' the current facial muscle)\n");
fprintf(stderr,"A: draw mode (to `contract' current facial muscle)\n");
fprintf(stderr,"c: face reset\n");
fprintf(stderr,"n: next muscle (to select another facial muscle to manipulate)\n");
fprintf(stderr,"e: next expression\n");
fprintf(stderr,"b: to change draw mode: wireframe->polygonal patches->smooth surface\n");
fprintf(stderr,"r,R: reread the expression file (../face-data/expression-vectors.dat)\n (Note: this resets the expression sequence to the beginning)\n");
fprintf(stderr,"q,Q,Esc: quit\n");
fprintf(stderr,"h: outputs this message\n");
fprintf(stderr,"\n");
}
void
muscle_select(int value)
{
char title[512];
/* Select muscle. */
m = value;
sprintf(title, "geoface (%s)", face->muscle[m]->name);
glutSetWindowTitle(title);
}
void
main_menu_select(int value)
{
char title[512];
switch(value) {
case 1:
face_reset ( face ) ;
glutPostRedisplay();
break;
case 2:
print_mesg();
break;
case 3:
face->muscle[m]->mstat += 0.25 ;
activate_muscle ( face,
face->muscle[m]->head,
face->muscle[m]->tail,
face->muscle[m]->fs,
face->muscle[m]->fe,
face->muscle[m]->zone,
+0.25 ) ;
glutPostRedisplay();
break;
case 4:
face->muscle[m]->mstat -= 0.25 ;
activate_muscle ( face,
face->muscle[m]->head,
face->muscle[m]->tail,
face->muscle[m]->fs,
face->muscle[m]->fe,
face->muscle[m]->zone,
-0.25 ) ;
glutPostRedisplay();
break;
case 5:
m++ ;
if ( m >= face->nmuscles ) m = 0 ;
sprintf(title, "geoface (%s)", face->muscle[m]->name);
glutSetWindowTitle(title);
break;
case 666:
exit(0);
break;
}
}
void
draw_mode_select(int value)
{
DRAW_MODE = value;
glutPostRedisplay();
}
void
make_menus(void)
{
int i, j, muscle_menu, draw_mode_menu;
char *entry;
muscle_menu = glutCreateMenu(muscle_select);
for (i=0; i<face->nmuscles; i++) {
entry = face->muscle[i]->name;
for(j=(int) strlen(entry)-1; j>=0; j--) {
if (entry[j] == '_') entry[j] = ' ';
}
glutAddMenuEntry(entry, i);
}
draw_mode_menu = glutCreateMenu(draw_mode_select);
glutAddMenuEntry("Wireframe", 0);
glutAddMenuEntry("Polygonal patches", 1);
glutAddMenuEntry("Smooth surface", 2);
glutCreateMenu(main_menu_select);
glutAddMenuEntry("Pull muscle up", 3);
glutAddMenuEntry("Pull muscle down", 4);
glutAddMenuEntry("Next muscle", 5);
glutAddSubMenu("Select muscle", muscle_menu);
glutAddSubMenu("Draw mode", draw_mode_menu);
glutAddMenuEntry("Face reset", 1);
glutAddMenuEntry("Print help", 2);
glutAddMenuEntry("Quit", 666);
glutAttachMenu(GLUT_RIGHT_BUTTON);
}
/* ========================================================================= */
/* main */
/* ========================================================================= */
/*
** All the initialization and action takes place here.
*/
int main ( int argc, char** argv )
{
int i;
glutInitWindowSize ( 400, 600 ) ;
glutInit(&argc, argv);
for(i=1; i<argc; i++) {
if(!strcmp(argv[i], "-v")) {
verbose = 1;
}
}
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE);
glutCreateWindow ( "geoface" ) ;
myinit ( ) ;
faceinit ( ) ;
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutKeyboardFunc ( Key ) ;
glutSpecialFunc(special);
glutReshapeFunc ( myReshape ) ;
glutDisplayFunc(display);
make_menus();
glutMainLoop() ;
return 0; /* ANSI C requires main to return int. */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -