diff --git a/Common/VR/PPSSPPVR.cpp b/Common/VR/PPSSPPVR.cpp index 2d3562468c..16b170e1fb 100644 --- a/Common/VR/PPSSPPVR.cpp +++ b/Common/VR/PPSSPPVR.cpp @@ -239,6 +239,7 @@ bool PreVRRender() { VR_SetConfig(VR_CONFIG_6DOF_ENABLED, g_Config.bEnable6DoF); VR_SetConfig(VR_CONFIG_CANVAS_DISTANCE, g_Config.iCanvasDistance); VR_SetConfig(VR_CONFIG_FOV_SCALE, g_Config.iFieldOfViewPercentage); + VR_SetConfig(VR_CONFIG_STEREO_SEPARATION, g_Config.iStereoSeparation); return true; } return false; diff --git a/Common/VR/VRRenderer.cpp b/Common/VR/VRRenderer.cpp index bb882416dc..1b42a27adb 100644 --- a/Common/VR/VRRenderer.cpp +++ b/Common/VR/VRRenderer.cpp @@ -493,14 +493,14 @@ ovrMatrix4f VR_GetMatrix( VRMatrix matrix ) { } output = ovrMatrix4f_CreateFromQuaternion(&invView.orientation); + float scale = (float)VR_GetConfig(VR_CONFIG_6DOF_SCALE) * 0.001f; if (vrConfig[VR_CONFIG_6DOF_ENABLED]) { - float scale = (float)VR_GetConfig(VR_CONFIG_6DOF_SCALE) * 0.001f; output.M[0][3] -= hmdposition.x * (vrConfig[VR_CONFIG_MIRROR_AXIS_X] ? -1.0f : 1.0f) * scale; output.M[1][3] -= hmdposition.y * (vrConfig[VR_CONFIG_MIRROR_AXIS_Y] ? -1.0f : 1.0f) * scale; output.M[2][3] -= hmdposition.z * (vrConfig[VR_CONFIG_MIRROR_AXIS_Z] ? -1.0f : 1.0f) * scale; } if (matrix == VR_VIEW_MATRIX_RIGHT_EYE) { - float ipdScale = 1.0f; + float ipdScale = (float)vrConfig[VR_CONFIG_STEREO_SEPARATION] * 0.1f * scale; output.M[0][3] += (invViewTransform[1].position.x - invViewTransform[0].position.x) * ipdScale; output.M[1][3] += (invViewTransform[1].position.y - invViewTransform[0].position.y) * ipdScale; output.M[2][3] += (invViewTransform[1].position.z - invViewTransform[0].position.z) * ipdScale; diff --git a/Common/VR/VRRenderer.h b/Common/VR/VRRenderer.h index d5ef2bdc6d..a8015776fd 100644 --- a/Common/VR/VRRenderer.h +++ b/Common/VR/VRRenderer.h @@ -7,7 +7,7 @@ enum VRConfig { //switching between 2D and 3D VR_CONFIG_MODE, VR_CONFIG_3D_GEOMETRY_COUNT, VR_CONFIG_FORCE_2D, //camera setup - VR_CONFIG_FOV_SCALE, VR_CONFIG_CANVAS_DISTANCE, + VR_CONFIG_FOV_SCALE, VR_CONFIG_CANVAS_DISTANCE, VR_CONFIG_STEREO_SEPARATION, //6DoF VR_CONFIG_6DOF_ENABLED, VR_CONFIG_6DOF_SCALE, VR_CONFIG_MIRROR_AXIS_X, VR_CONFIG_MIRROR_AXIS_Y, VR_CONFIG_MIRROR_AXIS_Z, diff --git a/Core/Config.cpp b/Core/Config.cpp index e75554ae73..710dd28af3 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -1205,9 +1205,10 @@ static ConfigSetting themeSettings[] = { static ConfigSetting vrSettings[] = { ConfigSetting("VREnable", &g_Config.bEnableVR, true), ConfigSetting("VREnable6DoF", &g_Config.bEnable6DoF, true), - ConfigSetting("VREnableStereo", &g_Config.bEnableStereo, true), + ConfigSetting("VREnableStereo", &g_Config.bEnableStereo, false), ConfigSetting("VRCanvasDistance", &g_Config.iCanvasDistance, 6), ConfigSetting("VRFieldOfView", &g_Config.iFieldOfViewPercentage, 100), + ConfigSetting("VRStereoSeparation", &g_Config.iStereoSeparation, 10), ConfigSetting(false), }; diff --git a/Core/Config.h b/Core/Config.h index 6ae172bfba..433e838f32 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -458,6 +458,7 @@ public: bool bEnableStereo; int iCanvasDistance; int iFieldOfViewPercentage; + int iStereoSeparation; // Debugger int iDisasmWindowX; diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 515e4f0fa5..cacd51e807 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -1115,13 +1115,15 @@ void GameSettingsScreen::CreateViews() { LinearLayout *vrSettings = AddTab("GameSettingsVR", ms->T("VR")); vrSettings->Add(new ItemHeader(vr->T("Virtual reality"))); vrSettings->Add(new CheckBox(&g_Config.bEnableVR, vr->T("Enable virtual reality"))); + vrSettings->Add(new PopupSliderChoice(&g_Config.iCanvasDistance, 1, 10, vr->T("Distance to 2D menus and scenes", "Distance to 2D menus and scenes"), 1, screenManager(), "")); CheckBox *vr6DoF = vrSettings->Add(new CheckBox(&g_Config.bEnable6DoF, vr->T("Enable 6 degrees of freedom movement"))); vr6DoF->SetEnabledPtr(&g_Config.bEnableVR); - CheckBox *vrStereo = vrSettings->Add(new CheckBox(&g_Config.bEnableStereo, vr->T("Enable stereoscopic vision"))); - vrStereo->SetEnabledPtr(&g_Config.bEnableVR); PopupSliderChoice *vrFieldOfView = vrSettings->Add(new PopupSliderChoice(&g_Config.iFieldOfViewPercentage, 100, 200, vr->T("Field of view scale", "Headset's field of view scale"), 10, screenManager(), vr->T("% of native FoV"))); vrFieldOfView->SetEnabledPtr(&g_Config.bEnableVR); - vrSettings->Add(new PopupSliderChoice(&g_Config.iCanvasDistance, 1, 10, vr->T("Distance to 2D menus and scenes", "Distance to 2D menus and scenes"), 1, screenManager(), "")); + CheckBox *vrStereo = vrSettings->Add(new CheckBox(&g_Config.bEnableStereo, vr->T("Enable stereoscopic vision (Experimental)"))); + vrStereo->SetEnabledPtr(&g_Config.bEnableVR); + PopupSliderChoice *vrStereoSepararation = vrSettings->Add(new PopupSliderChoice(&g_Config.iStereoSeparation, 1, 50, vr->T("Stereo separation (differs per game)", "Stereo separation (differs per game)"), 1, screenManager(), "x")); + vrStereoSepararation->SetEnabledPtr(&g_Config.bEnableStereo); } }