nuclear@2: #include nuclear@18: #include nuclear@2: #include nuclear@3: #include nuclear@1: #include "opengl.h" nuclear@0: #include "istereo.h" nuclear@2: #include "sanegl.h" nuclear@2: #include "sdr.h" nuclear@4: #include "respath.h" nuclear@14: #include "tex.h" nuclear@19: #include "cam.h" nuclear@18: #include "config.h" nuclear@4: nuclear@19: static void render(float t); nuclear@19: static void draw_tunnel(float t); nuclear@19: static void tunnel_vertex(float u, float v, float du, float dv, float t); nuclear@19: static void worm(float t, float z, float *tx, float *ty); nuclear@4: static unsigned int get_shader_program(const char *vfile, const char *pfile); nuclear@18: static float get_sec(void); nuclear@2: nuclear@2: unsigned int prog; nuclear@14: unsigned int tex; nuclear@0: nuclear@21: int view_xsz, view_ysz; nuclear@21: nuclear@24: #ifdef IPHONE nuclear@21: int stereo = 1; nuclear@24: #else nuclear@24: int stereo = 0; nuclear@24: #endif nuclear@18: nuclear@18: /* construction parameters */ nuclear@18: int sides = 24; nuclear@18: int segm = 20; nuclear@18: float ring_height = 0.5; nuclear@18: nuclear@23: float split = 0.53; nuclear@18: nuclear@0: int init(void) nuclear@0: { nuclear@4: add_resource_path("sdr"); nuclear@14: add_resource_path("data"); nuclear@3: nuclear@4: if(!(prog = get_shader_program("test.v.glsl", "test.p.glsl"))) { nuclear@2: fprintf(stderr, "failed to load shader program\n"); nuclear@2: return -1; nuclear@2: } nuclear@14: nuclear@14: if(!(tex = load_texture(find_resource("tiles.ppm", 0, 0)))) { nuclear@14: fprintf(stderr, "failed to load texture\n"); nuclear@14: return -1; nuclear@14: } nuclear@14: nuclear@22: cam_fov(43.0); nuclear@21: nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void cleanup(void) nuclear@0: { nuclear@2: free_program(prog); nuclear@0: } nuclear@0: nuclear@0: void redraw(void) nuclear@0: { nuclear@19: float pan_x, pan_y, z; nuclear@19: float tsec = get_sec(); nuclear@18: nuclear@21: z = ring_height * segm; nuclear@19: worm(tsec, z, &pan_x, &pan_y); nuclear@19: nuclear@22: glClearColor(0.6, 0.6, 0.6, 1.0); nuclear@21: glClear(GL_COLOR_BUFFER_BIT); nuclear@21: nuclear@19: if(stereo) { nuclear@21: int split_pt = (int)((float)view_ysz * split); nuclear@21: nuclear@23: /* right eye */ nuclear@21: glViewport(0, 0, view_xsz, split_pt); nuclear@21: cam_aspect((float)split_pt / (float)view_xsz); nuclear@19: nuclear@21: gl_matrix_mode(GL_PROJECTION); nuclear@21: gl_load_identity(); nuclear@23: cam_stereo_proj_matrix(CAM_RIGHT); nuclear@23: gl_rotatef(-90, 0, 0, 1); nuclear@23: nuclear@23: gl_matrix_mode(GL_MODELVIEW); nuclear@23: gl_load_identity(); nuclear@23: cam_stereo_view_matrix(CAM_RIGHT); nuclear@23: gl_translatef(-pan_x, -pan_y, -1.1 * ring_height * segm); nuclear@23: /*gl_rotatef(-90, 0, 0, 1);*/ nuclear@23: nuclear@23: render(tsec); nuclear@23: nuclear@23: /* left eye */ nuclear@23: glViewport(0, split_pt, view_xsz, view_ysz - split_pt); nuclear@23: cam_aspect((float)(view_ysz - split_pt) / (float)view_xsz); nuclear@23: nuclear@23: gl_matrix_mode(GL_PROJECTION); nuclear@23: gl_load_identity(); nuclear@19: cam_stereo_proj_matrix(CAM_LEFT); nuclear@21: gl_rotatef(-90, 0, 0, 1); nuclear@19: nuclear@21: gl_matrix_mode(GL_MODELVIEW); nuclear@21: gl_load_identity(); nuclear@19: cam_stereo_view_matrix(CAM_LEFT); nuclear@21: gl_translatef(-pan_x, -pan_y, -1.1 * ring_height * segm); nuclear@21: /*gl_rotatef(-90, 0, 0, 1);*/ nuclear@19: nuclear@19: render(tsec); nuclear@19: } else { nuclear@19: gl_matrix_mode(GL_MODELVIEW); nuclear@19: gl_load_identity(); nuclear@19: cam_view_matrix(); nuclear@19: gl_translatef(-pan_x, -pan_y, -1.1 * ring_height * segm); nuclear@19: nuclear@19: render(tsec); nuclear@19: } nuclear@19: nuclear@19: nuclear@19: /*glClearColor(0.4, 0.6, 1.0, 1.0); nuclear@0: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); nuclear@2: nuclear@2: bind_program(prog); nuclear@2: nuclear@13: gl_matrix_mode(GL_MODELVIEW); nuclear@2: gl_load_identity(); nuclear@13: gl_translatef(0, 0, -8); nuclear@18: gl_rotatef(t * 100.0, 0, 0, 1); nuclear@2: nuclear@16: bind_texture(tex, 0); nuclear@17: set_uniform_int(prog, "tex", 0); nuclear@6: nuclear@13: gl_begin(GL_QUADS); nuclear@14: gl_texcoord2f(0, 0); nuclear@2: gl_color3f(1, 0, 0); nuclear@2: gl_vertex3f(-1, -1, 0); nuclear@14: gl_texcoord2f(1, 0); nuclear@2: gl_color3f(0, 1, 0); nuclear@2: gl_vertex3f(1, -1, 0); nuclear@14: gl_texcoord2f(1, 1); nuclear@2: gl_color3f(0, 0, 1); nuclear@2: gl_vertex3f(1, 1, 0); nuclear@14: gl_texcoord2f(0, 1); nuclear@2: gl_color3f(1, 1, 0); nuclear@2: gl_vertex3f(-1, 1, 0); nuclear@13: gl_end(); nuclear@2: nuclear@19: bind_texture(0, 0);*/ nuclear@14: nuclear@2: assert(glGetError() == GL_NO_ERROR); nuclear@0: } nuclear@2: nuclear@19: static void render(float t) nuclear@19: { nuclear@19: draw_tunnel(t); nuclear@19: } nuclear@19: nuclear@19: static void draw_tunnel(float t) nuclear@19: { nuclear@19: static const float uoffs[] = {0.0, 0.0, 1.0, 1.0}; nuclear@19: static const float voffs[] = {0.0, 1.0, 1.0, 0.0}; nuclear@19: int i, j, k; nuclear@19: float du, dv; nuclear@19: nuclear@19: bind_program(prog); nuclear@19: set_uniform_float(prog, "t", t); nuclear@19: nuclear@19: bind_texture(tex, 0); nuclear@19: nuclear@24: gl_matrix_mode(GL_TEXTURE); nuclear@24: gl_load_identity(); nuclear@24: gl_translatef(0, -t * 0.75, 0); nuclear@19: nuclear@19: gl_begin(GL_QUADS); nuclear@19: gl_color3f(1.0, 1.0, 1.0); nuclear@19: nuclear@19: du = 1.0 / sides; nuclear@19: dv = 1.0 / segm; nuclear@19: nuclear@19: for(i=0; i nuclear@18: nuclear@18: static float get_sec(void) nuclear@18: { nuclear@18: static float first; nuclear@18: static int init; nuclear@18: nuclear@18: if(!init) { nuclear@18: init = 1; nuclear@18: first = CACurrentMediaTime(); nuclear@18: return 0.0f; nuclear@18: } nuclear@18: return CACurrentMediaTime() - first; nuclear@18: } nuclear@18: nuclear@18: #else nuclear@18: nuclear@18: static float get_sec(void) nuclear@18: { nuclear@18: return (float)glutGet(GLUT_ELAPSED_TIME) / 1000.0f; nuclear@18: } nuclear@18: #endif