nuclear@4: #include nuclear@4: #include nuclear@4: #include "vr.h" nuclear@4: #include "vr_impl.h" nuclear@4: nuclear@4: nuclear@8: static void swap_buffers(void); nuclear@8: nuclear@8: nuclear@4: static struct vr_module *vrm; nuclear@4: static float idmat[] = { nuclear@4: 1, 0, 0, 0, nuclear@4: 0, 1, 0, 0, nuclear@4: 0, 0, 1, 0, nuclear@4: 0, 0, 0, 1 nuclear@4: }; nuclear@4: static float fbtex_rect[] = { nuclear@4: 0, 0, 1, 1 nuclear@4: }; nuclear@4: nuclear@4: int vr_init(void) nuclear@4: { nuclear@4: int i, nmodules; nuclear@4: nuclear@4: if(vrm) { nuclear@4: vr_shutdown(); nuclear@4: } nuclear@4: nuclear@4: vr_init_modules(); nuclear@4: nuclear@4: nmodules = vr_get_num_modules(); nuclear@4: for(i=0; iinit() != -1) { nuclear@4: /* add to the active modules array */ nuclear@4: vr_activate_module(i); nuclear@4: if(!vrm) { nuclear@4: vr_use_module(0); nuclear@4: } nuclear@4: } nuclear@4: } nuclear@4: nuclear@4: if(!vrm) { nuclear@4: return -1; nuclear@4: } nuclear@4: return 0; nuclear@4: } nuclear@4: nuclear@4: void vr_shutdown(void) nuclear@4: { nuclear@4: vr_clear_modules(); nuclear@4: vrm = 0; nuclear@4: fbtex_rect[0] = fbtex_rect[1] = 0; nuclear@4: fbtex_rect[2] = fbtex_rect[3] = 1; nuclear@4: } nuclear@4: nuclear@4: int vr_module_count(void) nuclear@4: { nuclear@4: return vr_get_num_active_modules(); nuclear@4: } nuclear@4: nuclear@4: const char *vr_module_name(int idx) nuclear@4: { nuclear@4: struct vr_module *m = vr_get_active_module(idx); nuclear@4: if(!m) { nuclear@4: return 0; nuclear@4: } nuclear@4: return m->name; nuclear@4: } nuclear@4: nuclear@4: int vr_use_module(int idx) nuclear@4: { nuclear@4: if(idx >= 0 && idx < vr_get_num_active_modules()) { nuclear@9: struct vr_module *m = vr_get_active_module(idx); nuclear@9: if(m != vrm) { nuclear@9: vrm = m; nuclear@9: printf("using vr module: %s\n", vrm->name); nuclear@9: } nuclear@4: return 0; nuclear@4: } nuclear@4: return -1; nuclear@4: } nuclear@4: nuclear@4: int vr_use_module_named(const char *name) nuclear@4: { nuclear@4: int i, count = vr_get_num_active_modules(); nuclear@4: nuclear@4: for(i=0; iname, name) == 0) { nuclear@4: return vr_use_module(i); nuclear@4: } nuclear@4: } nuclear@4: return -1; nuclear@4: } nuclear@4: nuclear@7: void vr_set_opti(const char *optname, int val) nuclear@7: { nuclear@7: if(vrm && vrm->set_option) { nuclear@7: vrm->set_option(optname, OTYPE_INT, &val); nuclear@7: } nuclear@7: } nuclear@7: nuclear@7: void vr_set_optf(const char *optname, float val) nuclear@7: { nuclear@7: if(vrm && vrm->set_option) { nuclear@7: vrm->set_option(optname, OTYPE_FLOAT, &val); nuclear@7: } nuclear@7: } nuclear@7: nuclear@7: int vr_get_opti(const char *optname) nuclear@7: { nuclear@7: int res = 0; nuclear@7: nuclear@7: if(vrm && vrm->get_option) { nuclear@7: vrm->get_option(optname, OTYPE_INT, &res); nuclear@7: } nuclear@7: return res; nuclear@7: } nuclear@7: nuclear@7: float vr_get_optf(const char *optname) nuclear@7: { nuclear@7: float res = 0.0f; nuclear@7: nuclear@7: if(vrm && vrm->get_option) { nuclear@7: vrm->get_option(optname, OTYPE_FLOAT, &res); nuclear@7: } nuclear@7: return res; nuclear@7: } nuclear@7: nuclear@7: nuclear@7: int vr_view_translation(int eye, float *vec) nuclear@7: { nuclear@7: if(vrm && vrm->translation) { nuclear@7: vrm->translation(eye, vec); nuclear@7: return 0; nuclear@7: } nuclear@7: vec[0] = vec[1] = vec[2] = 0.0f; nuclear@7: return -1; nuclear@7: } nuclear@7: nuclear@7: int vr_view_rotation(int eye, float *quat) nuclear@7: { nuclear@7: if(vrm && vrm->rotation) { nuclear@7: vrm->rotation(eye, quat); nuclear@7: return 0; nuclear@7: } nuclear@7: quat[0] = quat[1] = quat[2] = 0.0f; nuclear@7: quat[3] = 1.0f; nuclear@7: return -1; nuclear@7: } nuclear@7: nuclear@4: int vr_view_matrix(int eye, float *mat) nuclear@4: { nuclear@10: float offs[3], quat[4]; nuclear@10: nuclear@10: if(vrm && vrm->view_matrix) { nuclear@10: vrm->view_matrix(eye, mat); nuclear@10: return 1; nuclear@10: } nuclear@10: nuclear@10: if(!vr_view_translation(eye, offs) && !vr_view_rotation(eye, quat)) { nuclear@10: return 0; nuclear@10: } nuclear@10: /* TODO construct matrix */ nuclear@4: return 0; nuclear@4: } nuclear@4: nuclear@7: int vr_proj_matrix(int eye, float znear, float zfar, float *mat) nuclear@4: { nuclear@4: if(vrm && vrm->proj_matrix) { nuclear@7: vrm->proj_matrix(eye, znear, zfar, mat); nuclear@4: return 1; nuclear@4: } nuclear@4: memcpy(mat, idmat, sizeof idmat); nuclear@4: return 0; nuclear@4: } nuclear@4: nuclear@6: void vr_begin(int eye) nuclear@4: { nuclear@6: if(vrm && vrm->begin) { nuclear@6: vrm->begin(eye); nuclear@4: } nuclear@4: } nuclear@4: nuclear@6: void vr_end(void) nuclear@4: { nuclear@6: if(vrm && vrm->end) { nuclear@6: vrm->end(); nuclear@6: } nuclear@4: } nuclear@6: nuclear@6: int vr_swap_buffers(void) nuclear@6: { nuclear@8: int res = 0; nuclear@8: nuclear@6: if(vrm && vrm->present) { nuclear@8: res = vrm->present(); nuclear@8: } nuclear@8: nuclear@8: if(!res) { nuclear@8: swap_buffers(); nuclear@6: } nuclear@6: return 0; nuclear@6: } nuclear@8: nuclear@7: void vr_output_texture(unsigned int tex, float umin, float vmin, float umax, float vmax) nuclear@7: { nuclear@7: float halfu = (umax + umin) * 0.5f; nuclear@7: nuclear@7: vr_output_texture_eye(VR_EYE_LEFT, tex, umin, vmin, halfu, vmax); nuclear@7: vr_output_texture_eye(VR_EYE_RIGHT, tex, halfu, vmin, umax, vmax); nuclear@7: } nuclear@7: nuclear@7: void vr_output_texture_eye(int eye, unsigned int tex, float umin, float vmin, float umax, float vmax) nuclear@7: { nuclear@7: if(vrm && vrm->set_eye_texture) { nuclear@7: vrm->set_eye_texture(eye, tex, umin, vmin, umax, vmax); nuclear@7: } nuclear@7: } nuclear@7: nuclear@7: void vr_recenter(void) nuclear@7: { nuclear@7: if(vrm && vrm->recenter) { nuclear@7: vrm->recenter(); nuclear@7: } nuclear@8: } nuclear@8: nuclear@8: nuclear@8: #ifdef __unix__ nuclear@8: #include nuclear@8: nuclear@8: static void swap_buffers(void) nuclear@8: { nuclear@8: glXSwapBuffers(glXGetCurrentDisplay(), glXGetCurrentDrawable()); nuclear@8: } nuclear@8: nuclear@8: #endif nuclear@8: nuclear@8: #ifdef WIN32 nuclear@8: #include nuclear@8: nuclear@8: static void swap_buffers(void) nuclear@8: { nuclear@8: SwapBuffers(wglGetCurrentDC()); nuclear@8: } nuclear@8: #endif