nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: #ifndef __APPLE__ nuclear@0: #include nuclear@0: #else nuclear@0: #include nuclear@0: #endif nuclear@0: nuclear@0: #include "cam.h" nuclear@0: #include "zscn.h" nuclear@0: nuclear@0: struct Light { nuclear@0: float pos[4]; nuclear@0: float color[4]; nuclear@0: }; nuclear@0: nuclear@0: static void cleanup(); nuclear@0: static int parse_args(int argc, char **argv); nuclear@0: static void disp(); nuclear@0: static void render_scene(); nuclear@0: static void reshape(int x, int y); nuclear@0: static void keyb(unsigned char key, int x, int y); nuclear@0: static void mouse(int bn, int state, int x, int y); nuclear@0: static void motion(int x, int y); nuclear@0: nuclear@0: static bool use_stereo = false; nuclear@0: static bool use_zbuf = true; nuclear@2: static float focus_dist = 1.0; nuclear@0: nuclear@0: static std::list scn_fnames; nuclear@0: static henge::Scene *scn; nuclear@0: nuclear@0: nuclear@0: int main(int argc, char **argv) nuclear@0: { nuclear@0: unsigned int init_flags = GLUT_RGB | GLUT_DOUBLE; nuclear@0: nuclear@0: atexit(cleanup); nuclear@0: nuclear@0: glutInitWindowSize(800, 600); nuclear@0: glutInit(&argc, argv); nuclear@0: nuclear@0: if(parse_args(argc, argv) == -1) { nuclear@0: return 1; nuclear@0: } nuclear@0: if(use_stereo) { nuclear@0: init_flags |= GLUT_STEREO; nuclear@0: } nuclear@0: if(use_zbuf) { nuclear@0: init_flags |= GLUT_DEPTH; nuclear@0: } nuclear@0: nuclear@0: glutInitDisplayMode(init_flags); nuclear@0: glutCreateWindow("stereoscopic scene viewer"); nuclear@0: nuclear@0: glutDisplayFunc(disp); nuclear@0: glutReshapeFunc(reshape); nuclear@0: glutKeyboardFunc(keyb); nuclear@0: glutMouseFunc(mouse); nuclear@0: glutMotionFunc(motion); nuclear@0: nuclear@0: if(use_zbuf) { nuclear@0: glEnable(GL_DEPTH_TEST); nuclear@0: } nuclear@0: nuclear@0: glEnable(GL_LIGHTING); nuclear@0: { nuclear@0: int i, num_lights; nuclear@0: struct Light lights[] = { nuclear@0: {{-0.85, 0.7, 1, 0}, {1.0, 1.0, 1.0, 1.0}}, nuclear@0: {{1, -0.5, 0.9, 0}, {0.75, 0.75, 0.75, 1.0}}, nuclear@0: {{0, 0, 1, 0}, {0.4, 0.4, 0.4, 1.0}} nuclear@0: }; nuclear@0: nuclear@0: num_lights = sizeof lights / sizeof *lights; nuclear@0: nuclear@0: for(i=0; i::iterator it = scn_fnames.begin(); nuclear@0: while(it != scn_fnames.end()) { nuclear@0: if(!(scn->load(it->c_str()))) { nuclear@0: fprintf(stderr, "failed to load scene: %s\n", it->c_str()); nuclear@0: return 1; nuclear@0: } nuclear@0: it++; nuclear@0: } nuclear@0: if(!scn->object_count()) { nuclear@0: fprintf(stderr, "didn't load any geometry, aborting\n"); nuclear@0: return 1; nuclear@0: } nuclear@0: nuclear@0: henge::Renderer *rend = henge::get_renderer(); nuclear@0: rend->set_render_mask(henge::REND_ALL & ~henge::REND_CAM); nuclear@0: nuclear@0: cam_reset(); nuclear@2: cam_focus_dist(focus_dist); nuclear@0: nuclear@0: glutMainLoop(); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: static void cleanup() nuclear@0: { nuclear@0: delete scn; nuclear@0: } nuclear@0: nuclear@0: static int parse_args(int argc, char **argv) nuclear@0: { nuclear@2: char *endptr; nuclear@2: nuclear@0: for(int i=1; i\tstereo focus distance\n"); nuclear@0: printf(" -h\tprint usage and exit\n"); nuclear@0: exit(0); nuclear@0: nuclear@0: default: nuclear@0: fprintf(stderr, "unrecognized argument: %s\n", argv[i]); nuclear@0: return -1; nuclear@0: } nuclear@0: } else { nuclear@0: scn_fnames.push_back(argv[i]); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: static void disp() nuclear@0: { nuclear@0: unsigned int clear_flags = GL_COLOR_BUFFER_BIT | (use_zbuf ? GL_DEPTH_BUFFER_BIT : 0); nuclear@0: nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glLoadIdentity(); nuclear@0: cam_stereo_proj_matrix(use_stereo ? CAM_LEFT : CAM_CENTER); nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glLoadIdentity(); nuclear@0: cam_stereo_view_matrix(use_stereo ? CAM_LEFT : CAM_CENTER); nuclear@0: nuclear@0: if(!use_stereo) { nuclear@0: glClear(clear_flags); nuclear@0: render_scene(); nuclear@0: } else { nuclear@0: glDrawBuffer(GL_BACK_LEFT); nuclear@0: glClear(clear_flags); nuclear@0: render_scene(); nuclear@0: nuclear@0: glMatrixMode(GL_PROJECTION); nuclear@0: glLoadIdentity(); nuclear@0: cam_stereo_proj_matrix(CAM_RIGHT); nuclear@0: glMatrixMode(GL_MODELVIEW); nuclear@0: glLoadIdentity(); nuclear@0: cam_stereo_view_matrix(CAM_RIGHT); nuclear@0: nuclear@0: glDrawBuffer(GL_BACK_RIGHT); nuclear@0: glClear(clear_flags); nuclear@0: render_scene(); nuclear@0: } nuclear@0: nuclear@0: glutSwapBuffers(); nuclear@0: assert(glGetError() == GL_NO_ERROR); nuclear@0: } nuclear@0: nuclear@0: static void render_scene() nuclear@0: { nuclear@0: scn->render(); nuclear@0: } nuclear@0: nuclear@0: static void reshape(int x, int y) nuclear@0: { nuclear@0: glViewport(0, 0, x, y); nuclear@0: nuclear@0: cam_aspect((float)x / (float)y); nuclear@0: } nuclear@0: nuclear@0: static void keyb(unsigned char key, int x, int y) nuclear@0: { nuclear@0: switch(key) { nuclear@0: case 27: nuclear@0: exit(0); nuclear@0: nuclear@0: case '-': nuclear@0: focus_dist -= 0.5; nuclear@0: cam_focus_dist(focus_dist); nuclear@0: glutPostRedisplay(); nuclear@0: printf("focus_dist: %f\n", focus_dist); nuclear@0: break; nuclear@0: nuclear@0: case '=': nuclear@0: focus_dist += 0.5; nuclear@0: cam_focus_dist(focus_dist); nuclear@0: glutPostRedisplay(); nuclear@0: printf("focus_dist: %f\n", focus_dist); nuclear@0: break; nuclear@0: nuclear@0: default: nuclear@0: break; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static int px = -1, py; nuclear@0: static int bnstate[32]; nuclear@0: nuclear@0: static void mouse(int bn, int state, int x, int y) nuclear@0: { nuclear@0: bnstate[bn] = state == GLUT_DOWN ? 1 : 0; nuclear@0: nuclear@0: if(state == GLUT_DOWN) { nuclear@0: px = x; nuclear@0: py = y; nuclear@0: } else { nuclear@0: px = -1; nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: static void motion(int x, int y) nuclear@0: { nuclear@0: int dx = x - px; nuclear@0: int dy = y - py; nuclear@0: nuclear@0: px = x; nuclear@0: py = y; nuclear@0: nuclear@0: if(bnstate[0]) { nuclear@0: cam_rotate(dx, dy); nuclear@0: glutPostRedisplay(); nuclear@0: } nuclear@0: if(bnstate[1]) { nuclear@0: cam_pan(dx, dy); nuclear@0: glutPostRedisplay(); nuclear@0: } nuclear@0: if(bnstate[2]) { nuclear@0: cam_zoom(dy); nuclear@0: glutPostRedisplay(); nuclear@0: } nuclear@0: }