nuclear@16: #include nuclear@16: #include nuclear@16: #include nuclear@16: #include nuclear@16: #include nuclear@16: nuclear@16: using namespace goatgfx; nuclear@16: nuclear@16: static bool init(); nuclear@16: static void cleanup(); nuclear@16: static void display(); nuclear@16: static void reshape(int x, int y); nuclear@16: static void keyboard(unsigned char key, int x, int y); nuclear@16: static void mouse(int bn, int st, int x, int y); nuclear@16: static void motion(int x, int y); nuclear@16: static bool parse_args(int argc, char **argv); nuclear@16: nuclear@16: static float cam_theta, cam_phi; nuclear@16: static const char *scene_filename; nuclear@16: static Scene *scn; nuclear@16: nuclear@16: int main(int argc, char **argv) nuclear@16: { nuclear@16: glutInit(&argc, argv); nuclear@16: glutInitWindowSize(800, 600); nuclear@16: glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); nuclear@16: glutCreateWindow("viewscn"); nuclear@16: nuclear@16: glutDisplayFunc(display); nuclear@16: glutReshapeFunc(reshape); nuclear@16: glutKeyboardFunc(keyboard); nuclear@16: glutMouseFunc(mouse); nuclear@16: glutMotionFunc(motion); nuclear@16: nuclear@16: if(!parse_args(argc, argv)) { nuclear@16: return 1; nuclear@16: } nuclear@16: nuclear@16: if(!init()) { nuclear@16: return 1; nuclear@16: } nuclear@16: atexit(cleanup); nuclear@16: nuclear@16: glutMainLoop(); nuclear@16: return 0; nuclear@16: } nuclear@16: nuclear@16: static bool init() nuclear@16: { nuclear@16: glewInit(); nuclear@16: nuclear@16: glEnable(GL_DEPTH_TEST); nuclear@16: glEnable(GL_CULL_FACE); nuclear@16: nuclear@16: scn = new Scene; nuclear@16: if(!scn->load(scene_filename)) { nuclear@16: fatal_log("failed to load scene: %s\n", scene_filename); nuclear@16: return false; nuclear@16: } nuclear@16: nuclear@16: return true; nuclear@16: } nuclear@16: nuclear@16: static void cleanup() nuclear@16: { nuclear@16: delete scn; nuclear@16: } nuclear@16: nuclear@16: static void display() nuclear@16: { nuclear@16: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); nuclear@16: nuclear@16: Matrix4x4 view_matrix; nuclear@16: view_matrix.rotate(Vector3(1, 0, 0), M_PI * cam_phi / 180.0); nuclear@16: view_matrix.rotate(Vector3(0, 1, 0), M_PI * cam_theta / 180.0); nuclear@16: set_view_matrix(view_matrix); nuclear@16: nuclear@16: setup_gl_matrices(); nuclear@16: nuclear@16: scn->draw(); nuclear@16: nuclear@16: glutSwapBuffers(); nuclear@16: CHECKGLERR; nuclear@16: } nuclear@16: nuclear@16: static void reshape(int x, int y) nuclear@16: { nuclear@16: glViewport(0, 0, x, y); nuclear@16: nuclear@16: Matrix4x4 proj; nuclear@16: proj.set_perspective(M_PI / 4.0, (float)x / (float)y, 0.5, 500.0); nuclear@16: set_projection_matrix(proj); nuclear@16: } nuclear@16: nuclear@16: static void keyboard(unsigned char key, int x, int y) nuclear@16: { nuclear@16: switch(key) { nuclear@16: case 27: nuclear@16: exit(0); nuclear@16: } nuclear@16: } nuclear@16: nuclear@16: static bool bnstate[16]; nuclear@16: static int prev_x, prev_y; nuclear@16: nuclear@16: static void mouse(int bn, int st, int x, int y) nuclear@16: { nuclear@16: bnstate[bn - GLUT_LEFT_BUTTON] = st == GLUT_DOWN; nuclear@16: prev_x = x; nuclear@16: prev_y = y; nuclear@16: } nuclear@16: nuclear@16: static void motion(int x, int y) nuclear@16: { nuclear@16: int dx = x - prev_x; nuclear@16: int dy = y - prev_y; nuclear@16: prev_x = x; nuclear@16: prev_y = y; nuclear@16: nuclear@16: if(!dx && !dy) return; nuclear@16: nuclear@16: if(bnstate[0]) { nuclear@16: cam_theta += dx * 0.5; nuclear@16: cam_phi += dy * 0.5; nuclear@16: cam_phi = std::max(-90.0f, std::min(90.0f, cam_phi)); nuclear@16: glutPostRedisplay(); nuclear@16: } nuclear@16: } nuclear@16: nuclear@16: static bool parse_args(int argc, char **argv) nuclear@16: { nuclear@16: for(int i=1; i\n", argv[i]); nuclear@16: exit(0); nuclear@16: } nuclear@16: } else { nuclear@16: if(scene_filename) { nuclear@16: fprintf(stderr, "unexpected argument: %s\n", argv[i]); nuclear@16: return false; nuclear@16: } nuclear@16: scene_filename = argv[i]; nuclear@16: } nuclear@16: } nuclear@16: nuclear@16: if(!scene_filename) { nuclear@16: fprintf(stderr, "you must specify the scene file to view\n"); nuclear@16: return false; nuclear@16: } nuclear@16: nuclear@16: return true; nuclear@16: }