nuclear@19: #include nuclear@19: #include nuclear@19: #include nuclear@19: #ifndef __APPLE__ nuclear@19: #include nuclear@19: #else nuclear@19: #include nuclear@19: #endif nuclear@19: #include "goat3d.h" nuclear@19: nuclear@19: static void cleanup(void); nuclear@19: static void disp(void); nuclear@19: static void draw_scene(struct goat3d *g); nuclear@19: static void draw_mesh(struct goat3d_mesh *mesh); nuclear@19: static void reshape(int x, int y); nuclear@19: static void keyb(unsigned char key, int x, int y); nuclear@19: static void mouse(int bn, int st, int x, int y); nuclear@19: static void motion(int x, int y); nuclear@19: nuclear@19: static struct goat3d *goat; nuclear@19: static float cam_theta, cam_phi, cam_dist = 10; nuclear@19: nuclear@19: int main(int argc, char **argv) nuclear@19: { nuclear@19: glutInitWindowSize(800, 600); nuclear@19: glutInit(&argc, argv); nuclear@19: nuclear@19: if(!argv[1]) { nuclear@19: fprintf(stderr, "you must specify a goat3d scene file to open\n"); nuclear@19: return 1; nuclear@19: } nuclear@19: nuclear@19: if(!(goat = goat3d_create())) { nuclear@19: fprintf(stderr, "failed to create goat3d\n"); nuclear@19: return 1; nuclear@19: } nuclear@19: if(goat3d_load(goat, argv[1]) == -1) { nuclear@19: fprintf(stderr, "failed to load goat3d scene: %s\n", argv[1]); nuclear@19: goat3d_free(goat); nuclear@19: return 1; nuclear@19: } nuclear@19: nuclear@19: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); nuclear@19: glutCreateWindow(argv[1]); nuclear@19: nuclear@19: glutDisplayFunc(disp); nuclear@19: glutReshapeFunc(reshape); nuclear@19: glutKeyboardFunc(keyb); nuclear@19: glutMouseFunc(mouse); nuclear@19: glutMotionFunc(motion); nuclear@19: nuclear@19: glEnable(GL_DEPTH_TEST); nuclear@19: glEnable(GL_CULL_FACE); nuclear@19: glEnable(GL_LIGHTING); nuclear@19: glEnable(GL_LIGHT0); nuclear@19: nuclear@19: glClearColor(0.1, 0.1, 0.1, 1.0); nuclear@19: nuclear@19: atexit(cleanup); nuclear@19: nuclear@19: glutMainLoop(); nuclear@19: return 0; nuclear@19: } nuclear@19: nuclear@19: static void cleanup(void) nuclear@19: { nuclear@19: goat3d_free(goat); nuclear@19: } nuclear@19: nuclear@19: static void disp(void) nuclear@19: { nuclear@19: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); nuclear@19: nuclear@19: glMatrixMode(GL_MODELVIEW); nuclear@19: glLoadIdentity(); nuclear@19: glTranslatef(0, 0, -cam_dist); nuclear@19: glRotatef(cam_phi, 1, 0, 0); nuclear@19: glRotatef(cam_theta, 0, 1, 0); nuclear@19: nuclear@19: draw_scene(goat); nuclear@19: nuclear@19: glutSwapBuffers(); nuclear@19: assert(glGetError() == GL_NO_ERROR); nuclear@19: } nuclear@19: nuclear@19: static void draw_scene(struct goat3d *g) nuclear@19: { nuclear@19: int i, num_meshes; nuclear@19: nuclear@19: num_meshes = goat3d_get_mesh_count(g); nuclear@19: for(i=0; i 90) cam_phi = 90; nuclear@19: glutPostRedisplay(); nuclear@19: } nuclear@19: if(bnstate[2]) { nuclear@19: cam_dist += dy * 0.1; nuclear@19: nuclear@19: if(cam_dist < 0) cam_dist = 0; nuclear@19: glutPostRedisplay(); nuclear@19: } nuclear@19: }