# HG changeset patch # User John Tsiombikas # Date 1408742660 -10800 # Node ID 5dc4e2b8f6f583bf7a37e6ec17c839f80e806a54 # Parent e3f0ca1d008a0cf7843566c6fc598e99abb84372 LibOVR is broken diff -r e3f0ca1d008a -r 5dc4e2b8f6f5 src/game.cc --- a/src/game.cc Fri Aug 22 20:11:15 2014 +0300 +++ b/src/game.cc Sat Aug 23 00:24:20 2014 +0300 @@ -87,7 +87,6 @@ void game_render() { glBindFramebuffer(GL_FRAMEBUFFER, fbo); - glClearColor(1, 0, 0, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glViewport(0, 0, rtwidth / 2.0, rtheight); @@ -116,18 +115,18 @@ glMatrixMode(GL_PROJECTION); glLoadIdentity(); - //if(eye == 0 || !vr_proj_matrix(eye < 0 ? 0 : 1, 0.5, 500.0, mat)) { + if(eye == 0 || !vr_proj_matrix(eye < 0 ? 0 : 1, 0.5, 500.0, mat)) { gluPerspective(60.0, (float)fb_width / (float)fb_height, 0.5, 500.0); - /*} else { + } else { glLoadMatrixf(mat); - }*/ + } glMatrixMode(GL_MODELVIEW); - //if(eye == 0 || !vr_view_matrix(eye < 0 ? 0 : 1, mat)) { + if(eye == 0 || !vr_view_matrix(eye < 0 ? 0 : 1, mat)) { glLoadIdentity(); - /*} else { - glLoadTransposeMatrixf(mat); - }*/ + } else { + glLoadMatrixf(mat); + } glMultTransposeMatrixf(view_matrix[0]); draw_scene(); diff -r e3f0ca1d008a -r 5dc4e2b8f6f5 src/main.cc --- a/src/main.cc Fri Aug 22 20:11:15 2014 +0300 +++ b/src/main.cc Sat Aug 23 00:24:20 2014 +0300 @@ -84,6 +84,30 @@ static void keyb(unsigned char key, int x, int y) { + static bool fullscr; + static int prev_xsz, prev_ysz; + + switch(key) { + case 'f': + fullscr = !fullscr; + if(fullscr) { + int xoffs, yoffs; + + prev_xsz = glutGet(GLUT_WINDOW_WIDTH); + prev_ysz = glutGet(GLUT_WINDOW_HEIGHT); + + xoffs = vr_get_opti(VR_OPT_WIN_XOFFS); + yoffs = vr_get_opti(VR_OPT_WIN_YOFFS); + if(xoffs || yoffs) { + printf("repositioning: %d,%d\n", xoffs, yoffs); + glutPositionWindow(xoffs + 1, yoffs + 1); + } + glutFullScreen(); + } else { + glutReshapeWindow(prev_xsz, prev_ysz); + } + break; + } game_keyboard(key, true, x, y); } diff -r e3f0ca1d008a -r 5dc4e2b8f6f5 src/vr/vr.c --- a/src/vr/vr.c Fri Aug 22 20:11:15 2014 +0300 +++ b/src/vr/vr.c Sat Aug 23 00:24:20 2014 +0300 @@ -2,6 +2,7 @@ #include #include "vr.h" #include "vr_impl.h" +#include "mathutil.h" static void swap_buffers(void); @@ -133,37 +134,49 @@ { if(vrm && vrm->translation) { vrm->translation(eye, vec); - return 0; + return 1; } vec[0] = vec[1] = vec[2] = 0.0f; - return -1; + return 0; } int vr_view_rotation(int eye, float *quat) { if(vrm && vrm->rotation) { vrm->rotation(eye, quat); - return 0; + return 1; } quat[0] = quat[1] = quat[2] = 0.0f; quat[3] = 1.0f; - return -1; + return 0; } int vr_view_matrix(int eye, float *mat) { + int have_trans, have_rot; float offs[3], quat[4]; + float rmat[16], tmat[16]; if(vrm && vrm->view_matrix) { vrm->view_matrix(eye, mat); return 1; } - if(!vr_view_translation(eye, offs) && !vr_view_rotation(eye, quat)) { + have_trans = vr_view_translation(eye, offs); + have_rot = vr_view_rotation(eye, quat); + + if(!have_trans && !have_rot) { return 0; } - /* TODO construct matrix */ - return 0; + + offs[0] = -offs[0]; + offs[1] = -offs[1]; + offs[2] = -offs[2]; + + translation_matrix(offs, tmat); + rotation_matrix(quat, rmat); + mult_matrix(mat, tmat, rmat); + return 1; } int vr_proj_matrix(int eye, float znear, float zfar, float *mat) diff -r e3f0ca1d008a -r 5dc4e2b8f6f5 src/vr/vr.h --- a/src/vr/vr.h Fri Aug 22 20:11:15 2014 +0300 +++ b/src/vr/vr.h Sat Aug 23 00:24:20 2014 +0300 @@ -9,6 +9,8 @@ #define VR_OPT_REYE_YRES "right-eye-yres" #define VR_OPT_EYE_HEIGHT "eye-height" #define VR_OPT_IPD "ipd" +#define VR_OPT_WIN_XOFFS "win-xoffset" +#define VR_OPT_WIN_YOFFS "win-yoffset" enum { VR_EYE_LEFT, diff -r e3f0ca1d008a -r 5dc4e2b8f6f5 src/vr/vr_libovr.c --- a/src/vr/vr_libovr.c Fri Aug 22 20:11:15 2014 +0300 +++ b/src/vr/vr_libovr.c Sat Aug 23 00:24:20 2014 +0300 @@ -13,6 +13,8 @@ #include #include +#define DISABLE_RETARDED_HEALTH_WARNING + /* just dropping the prototype here to avoid including CAPI_HSWDisplay.h */ OVR_EXPORT void ovrhmd_EnableHSWDisplaySDKRender(ovrHmd hmd, ovrBool enabled); @@ -46,7 +48,7 @@ if(!(h = ovrHmd_Create(i))) { break; } - printf(" [%d]: %s - %s\n", h->Manufacturer, h->ProductName); + printf(" [%d]: %s - %s\n", i, h->Manufacturer, h->ProductName); if(!hmd) { hmd = h; @@ -60,6 +62,8 @@ return -1; } + ovrHmd_ConfigureTracking(hmd, 0xffffffff, 0); + eye_fov[0] = hmd->DefaultEyeFov[0]; eye_fov[1] = hmd->DefaultEyeFov[1]; @@ -76,6 +80,8 @@ set_option_int(optdb, VR_OPT_REYE_YRES, eye_res[1].h); set_option_float(optdb, VR_OPT_EYE_HEIGHT, ovrHmd_GetFloat(hmd, OVR_KEY_EYE_HEIGHT, OVR_DEFAULT_EYE_HEIGHT)); set_option_float(optdb, VR_OPT_IPD, ovrHmd_GetFloat(hmd, OVR_KEY_IPD, OVR_DEFAULT_IPD)); + set_option_int(optdb, VR_OPT_WIN_XOFFS, hmd->WindowsPos.x); + set_option_int(optdb, VR_OPT_WIN_YOFFS, hmd->WindowsPos.y); } deferred_init_done = 0; @@ -90,30 +96,33 @@ deferred_init_done = 1; - ovrHmd_ConfigureTracking(hmd, 0xffffffff, 0); - + memset(&glcfg, 0, sizeof glcfg); glcfg.OGL.Header.API = ovrRenderAPI_OpenGL; glcfg.OGL.Header.RTSize = hmd->Resolution; glcfg.OGL.Header.Multisample = 1; #ifdef WIN32 win = GetActiveWindow(); - glcfg.OGL.Window = win; + /*glcfg.OGL.Window = win; glcfg.OGL.DC = wglGetCurrentDC(); assert(glcfg.OGL.Window); - assert(glcfg.OGL.DC); + assert(glcfg.OGL.DC);*/ #endif - ovrHmd_AttachToWindow(hmd, win, 0, 0); - /*ovrHmd_SetEnabledCaps(hmd, ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction);*/ + if(!(hmd->HmdCaps & ovrHmdCap_ExtendDesktop)) { + ovrHmd_AttachToWindow(hmd, win, 0, 0); + } + ovrHmd_SetEnabledCaps(hmd, ovrHmdCap_LowPersistence | ovrHmdCap_DynamicPrediction); - dcaps = ovrDistortionCap_Chromatic | ovrDistortionCap_Vignette;/* | ovrDistortionCap_TimeWarp;// | - ovrDistortionCap_Overdrive; */ + dcaps = ovrDistortionCap_Chromatic | ovrDistortionCap_Vignette | ovrDistortionCap_TimeWarp | + ovrDistortionCap_Overdrive | ovrDistortionCap_NoRestore; if(!ovrHmd_ConfigureRendering(hmd, &glcfg.Config, dcaps, eye_fov, eye_render_desc)) { fprintf(stderr, "failed to configure LibOVR distortion renderer\n"); } - /* ovrhmd_EnableHSWDisplaySDKRender(hmd, 0); */ +#ifdef DISABLE_RETARDED_HEALTH_WARNING + ovrhmd_EnableHSWDisplaySDKRender(hmd, 0); +#endif } static void cleanup(void) @@ -153,14 +162,14 @@ { if(!hmd) { vec[0] = vec[1] = vec[2] = 0; - return -1; + return 0; } pose[eye] = ovrHmd_GetEyePose(hmd, eye == VR_EYE_LEFT ? ovrEye_Left : ovrEye_Right); vec[0] = pose[eye].Position.x; vec[1] = pose[eye].Position.y; vec[2] = pose[eye].Position.z; - return 0; + return 1; } static int rotation(int eye, float *quat) @@ -168,7 +177,7 @@ if(!hmd) { quat[0] = quat[1] = quat[2] = 0.0f; quat[3] = 1.0f; - return -1; + return 0; } pose[eye] = ovrHmd_GetEyePose(hmd, eye == VR_EYE_LEFT ? ovrEye_Left : ovrEye_Right); @@ -176,13 +185,14 @@ quat[1] = pose[eye].Orientation.y; quat[2] = pose[eye].Orientation.z; quat[3] = pose[eye].Orientation.w; - return 0; + return 1; } static const float idmat[] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; static void proj_matrix(int eye, float znear, float zfar, float *mat) { + int i, j; ovrMatrix4f vmat; if(!hmd) { @@ -191,7 +201,12 @@ } vmat = ovrMatrix4f_Projection(eye_render_desc[eye].Fov, znear, zfar, 1); - memcpy(mat, vmat.M[0], 16 * sizeof(float)); + + for(i=0; i<4; i++) { + for(j=0; j<4; j++) { + *mat++ = vmat.M[j][i]; + } + } } static int new_frame = 1; @@ -227,6 +242,9 @@ ovrSizei texsz; ovrRecti rect; + vmin = 1.0 - vmax; + vmax = 1.0 - vmin; + glBindTexture(GL_TEXTURE_2D, tex); glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &texsz.w); glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &texsz.h); @@ -236,9 +254,6 @@ rect.Size.w = (int)((umax - umin) * texsz.w); rect.Size.h = (int)((vmax - vmin) * texsz.h); - printf("eye %d texture: %u [%g, %g] -> [%g, %g]\n", eye, tex, umin, vmin, umax, vmax); - printf(" pixels [%d, %d] -> [%d, %d]\n", rect.Pos.x, rect.Pos.y, rect.Pos.x + rect.Size.w, rect.Pos.y + rect.Size.h); - eye_tex[eye].OGL.Header.API = ovrRenderAPI_OpenGL; eye_tex[eye].OGL.Header.TextureSize = texsz; eye_tex[eye].OGL.Header.RenderViewport = rect; diff -r e3f0ca1d008a -r 5dc4e2b8f6f5 vrchess.vcxproj --- a/vrchess.vcxproj Fri Aug 22 20:11:15 2014 +0300 +++ b/vrchess.vcxproj Sat Aug 23 00:24:20 2014 +0300 @@ -89,12 +89,14 @@ + + @@ -103,6 +105,7 @@ + diff -r e3f0ca1d008a -r 5dc4e2b8f6f5 vrchess.vcxproj.filters --- a/vrchess.vcxproj.filters Fri Aug 22 20:11:15 2014 +0300 +++ b/vrchess.vcxproj.filters Sat Aug 23 00:24:20 2014 +0300 @@ -49,6 +49,12 @@ src\vr + + src\vr + + + src\vr + @@ -81,5 +87,8 @@ src\vr + + src\vr + \ No newline at end of file