nuclear@8: #include nuclear@8: #include nuclear@8: #include nuclear@8: nuclear@8: #ifndef __APPLE__ nuclear@8: #include nuclear@8: #else nuclear@8: #include nuclear@8: #endif nuclear@8: nuclear@8: #include nuclear@8: #include "anim.h" nuclear@8: nuclear@8: struct body_part { nuclear@8: vec3_t pos, pivot, sz, color; nuclear@8: } parts[] = { nuclear@8: /* position pivot size color */ nuclear@8: {{0, 1, 0}, {0, -1, 0}, {1.8, 2.8, 0.8},{1, 0, 1}}, /* torso */ nuclear@8: nuclear@8: {{-0.5, -2.5, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {1, 0, 0}}, /* left-upper leg */ nuclear@8: {{0.5, -2.5, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {0, 1, 0}}, /* right-upper leg */ nuclear@8: nuclear@8: {{0, -2.1, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {1, 0.5, 0.5}}, /* left-lower leg */ nuclear@8: {{0, -2.1, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {0.5, 1, 0.5}}, /* right-lower leg */ nuclear@8: nuclear@8: {{0, 2.6, 0}, {0, -0.5, 0}, {1.2, 1.2, 1.2},{0, 1, 1}}, /* head */ nuclear@8: nuclear@8: {{-1.3, 0.4, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {0, 0, 1}}, /* left-upper arm */ nuclear@8: {{1.3, 0.4, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {1, 1, 0}}, /* right-upper arm */ nuclear@8: nuclear@8: {{0, -2.1, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {0.5, 0.5, 1}}, /* left-lower arm */ nuclear@8: {{0, -2.1, 0}, {0, 1, 0}, {0.8, 2, 0.8}, {1, 1, 0.5}}, /* right-lower arm */ nuclear@8: }; nuclear@8: nuclear@8: enum { nuclear@8: NODE_TORSO, nuclear@8: NODE_LEFT_UPPER_LEG, nuclear@8: NODE_RIGHT_UPPER_LEG, nuclear@8: NODE_LEFT_LOWER_LEG, nuclear@8: NODE_RIGHT_LOWER_LEG, nuclear@8: NODE_HEAD, nuclear@8: NODE_LEFT_UPPER_ARM, nuclear@8: NODE_RIGHT_UPPER_ARM, nuclear@8: NODE_LEFT_LOWER_ARM, nuclear@8: NODE_RIGHT_LOWER_ARM, nuclear@8: nuclear@8: NUM_NODES nuclear@8: }; nuclear@8: nuclear@8: int init(void); nuclear@21: static void set_walk_animation(int idx); nuclear@21: static void set_jump_animation(int idx); nuclear@8: void disp(void); nuclear@8: void idle(void); nuclear@8: void reshape(int x, int y); nuclear@8: void keyb(unsigned char key, int x, int y); nuclear@8: void mouse(int bn, int state, int x, int y); nuclear@8: void motion(int x, int y); nuclear@8: nuclear@10: float cam_theta = 200, cam_phi = 20, cam_dist = 15; nuclear@8: struct anm_node *root; nuclear@8: nuclear@8: struct anm_node *nodes[NUM_NODES]; nuclear@8: nuclear@21: int cur_anim = 0, next_anim = 0; nuclear@21: unsigned int trans_start_tm; nuclear@21: nuclear@8: int main(int argc, char **argv) nuclear@8: { nuclear@8: glutInitWindowSize(800, 600); nuclear@8: glutInit(&argc, argv); nuclear@8: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); nuclear@8: glutCreateWindow("libanim example"); nuclear@8: nuclear@8: glutDisplayFunc(disp); nuclear@8: glutIdleFunc(idle); nuclear@8: glutReshapeFunc(reshape); nuclear@8: glutKeyboardFunc(keyb); nuclear@8: glutMouseFunc(mouse); nuclear@8: glutMotionFunc(motion); nuclear@8: nuclear@8: if(init() == -1) { nuclear@8: return 1; nuclear@8: } nuclear@8: glutMainLoop(); nuclear@8: return 0; nuclear@8: } nuclear@8: nuclear@8: int init(void) nuclear@8: { nuclear@8: int i; nuclear@8: nuclear@8: glPointSize(3); nuclear@8: nuclear@8: glEnable(GL_DEPTH_TEST); nuclear@8: glEnable(GL_CULL_FACE); nuclear@8: glEnable(GL_LIGHTING); nuclear@8: glEnable(GL_LIGHT0); nuclear@8: nuclear@8: for(i=0; i= 1.0) { nuclear@21: t = 1.0; nuclear@21: cur_anim = next_anim; nuclear@21: anm_use_animation(root, cur_anim); nuclear@21: } else { nuclear@21: anm_use_animations(root, cur_anim, next_anim, t); nuclear@21: } nuclear@21: } nuclear@21: nuclear@20: /* first render a character with bottom-up lazy matrix calculation */ nuclear@20: glPushMatrix(); nuclear@20: glTranslatef(-2.5, 0, 0); nuclear@20: nuclear@8: for(i=0; imatrix); nuclear@20: nuclear@20: glPushMatrix(); nuclear@20: glMultMatrixf((float*)xform_transp); nuclear@20: nuclear@20: glScalef(parts[i].sz.x, parts[i].sz.y, parts[i].sz.z); nuclear@20: glutSolidCube(1.0); nuclear@20: nuclear@20: glPopMatrix(); nuclear@20: } nuclear@20: glPopMatrix(); nuclear@8: nuclear@8: glutSwapBuffers(); nuclear@8: assert(glGetError() == GL_NO_ERROR); nuclear@8: } nuclear@8: nuclear@8: void idle(void) nuclear@8: { nuclear@8: glutPostRedisplay(); nuclear@8: } nuclear@8: nuclear@8: void reshape(int x, int y) nuclear@8: { nuclear@8: glViewport(0, 0, x, y); nuclear@8: nuclear@8: glMatrixMode(GL_PROJECTION); nuclear@8: glLoadIdentity(); nuclear@8: gluPerspective(45.0, (float)x / (float)y, 0.5, 500.0); nuclear@8: } nuclear@8: nuclear@8: void keyb(unsigned char key, int x, int y) nuclear@8: { nuclear@8: switch(key) { nuclear@8: case 27: nuclear@8: exit(0); nuclear@21: nuclear@21: case ' ': nuclear@21: next_anim = (cur_anim + 1) % 2; nuclear@21: trans_start_tm = glutGet(GLUT_ELAPSED_TIME); nuclear@21: break; nuclear@8: } nuclear@8: } nuclear@8: nuclear@8: int bnstate[64]; nuclear@8: int prev_x, prev_y; nuclear@8: nuclear@8: void mouse(int bn, int state, int x, int y) nuclear@8: { nuclear@8: int idx = bn - GLUT_LEFT_BUTTON; nuclear@8: int down = state == GLUT_DOWN ? 1 : 0; nuclear@8: nuclear@8: bnstate[idx] = down; nuclear@8: nuclear@8: prev_x = x; nuclear@8: prev_y = y; nuclear@8: } nuclear@8: nuclear@8: void motion(int x, int y) nuclear@8: { nuclear@8: int dx = x - prev_x; nuclear@8: int dy = y - prev_y; nuclear@8: prev_x = x; nuclear@8: prev_y = y; nuclear@8: nuclear@8: if(bnstate[0]) { nuclear@8: cam_theta += dx * 0.5; nuclear@8: cam_phi += dy * 0.5; nuclear@8: nuclear@8: if(cam_phi < -90) { nuclear@8: cam_phi = -90; nuclear@8: } nuclear@8: if(cam_phi > 90) { nuclear@8: cam_phi = 90; nuclear@8: } nuclear@8: glutPostRedisplay(); nuclear@8: } nuclear@8: if(bnstate[2]) { nuclear@8: cam_dist += dy * 0.1; nuclear@8: if(cam_dist < 0.0) { nuclear@8: cam_dist = 0.0; nuclear@8: } nuclear@8: glutPostRedisplay(); nuclear@8: } nuclear@8: }