mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Merge pull request #16074 from lvonasek/hotfix_openxr_stereo
OpenXR - Stereo for most games fixed
This commit is contained in:
commit
4eeeae8a70
2 changed files with 19 additions and 7 deletions
|
@ -230,7 +230,8 @@ bool StartVRRender() {
|
||||||
|
|
||||||
// Decide if the scene is 3D or not
|
// Decide if the scene is 3D or not
|
||||||
if (g_Config.bEnableVR && !VR_GetConfig(VR_CONFIG_FORCE_2D) && (VR_GetConfig(VR_CONFIG_3D_GEOMETRY_COUNT) > 15)) {
|
if (g_Config.bEnableVR && !VR_GetConfig(VR_CONFIG_FORCE_2D) && (VR_GetConfig(VR_CONFIG_3D_GEOMETRY_COUNT) > 15)) {
|
||||||
VR_SetConfig(VR_CONFIG_MODE, g_Config.bEnableStereo ? VR_MODE_STEREO_6DOF : VR_MODE_MONO_6DOF);
|
bool stereo = VR_GetConfig(VR_CONFIG_6DOF_PRECISE) && g_Config.bEnableStereo;
|
||||||
|
VR_SetConfig(VR_CONFIG_MODE, stereo ? VR_MODE_STEREO_6DOF : VR_MODE_MONO_6DOF);
|
||||||
} else {
|
} else {
|
||||||
VR_SetConfig(VR_CONFIG_MODE, VR_MODE_FLAT_SCREEN);
|
VR_SetConfig(VR_CONFIG_MODE, VR_MODE_FLAT_SCREEN);
|
||||||
}
|
}
|
||||||
|
|
|
@ -359,13 +359,17 @@ void VR_FinishFrame( engine_t* engine ) {
|
||||||
for (int eye = 0; eye < ovrMaxNumEyes; eye++) {
|
for (int eye = 0; eye < ovrMaxNumEyes; eye++) {
|
||||||
int imageLayer = engine->appState.Renderer.Multiview ? eye : 0;
|
int imageLayer = engine->appState.Renderer.Multiview ? eye : 0;
|
||||||
ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[0];
|
ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[0];
|
||||||
if ((vrMode != VR_MODE_MONO_6DOF) && !engine->appState.Renderer.Multiview) {
|
XrPosef pose = invViewTransform[0];
|
||||||
frameBuffer = &engine->appState.Renderer.FrameBuffer[eye];
|
if (vrMode != VR_MODE_MONO_6DOF) {
|
||||||
|
if (!engine->appState.Renderer.Multiview) {
|
||||||
|
frameBuffer = &engine->appState.Renderer.FrameBuffer[eye];
|
||||||
|
}
|
||||||
|
pose = invViewTransform[eye];
|
||||||
}
|
}
|
||||||
|
|
||||||
memset(&projection_layer_elements[eye], 0, sizeof(XrCompositionLayerProjectionView));
|
memset(&projection_layer_elements[eye], 0, sizeof(XrCompositionLayerProjectionView));
|
||||||
projection_layer_elements[eye].type = XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW;
|
projection_layer_elements[eye].type = XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW;
|
||||||
projection_layer_elements[eye].pose = invViewTransform[eye];
|
projection_layer_elements[eye].pose = pose;
|
||||||
projection_layer_elements[eye].fov = fov;
|
projection_layer_elements[eye].fov = fov;
|
||||||
|
|
||||||
memset(&projection_layer_elements[eye].subImage, 0, sizeof(XrSwapchainSubImage));
|
memset(&projection_layer_elements[eye].subImage, 0, sizeof(XrSwapchainSubImage));
|
||||||
|
@ -502,9 +506,16 @@ ovrMatrix4f VR_GetMatrix( VRMatrix matrix ) {
|
||||||
output.M[2][3] -= hmdposition.z * (vrConfig[VR_CONFIG_MIRROR_AXIS_Z] ? -1.0f : 1.0f) * scale;
|
output.M[2][3] -= hmdposition.z * (vrConfig[VR_CONFIG_MIRROR_AXIS_Z] ? -1.0f : 1.0f) * scale;
|
||||||
}
|
}
|
||||||
if (vrConfig[VR_CONFIG_6DOF_PRECISE] && (matrix == VR_VIEW_MATRIX_RIGHT_EYE)) {
|
if (vrConfig[VR_CONFIG_6DOF_PRECISE] && (matrix == VR_VIEW_MATRIX_RIGHT_EYE)) {
|
||||||
output.M[0][3] += (invViewTransform[1].position.x - invViewTransform[0].position.x) * scale;
|
float dx = fabs(invViewTransform[1].position.x - invViewTransform[0].position.x);
|
||||||
output.M[1][3] += (invViewTransform[1].position.y - invViewTransform[0].position.y) * scale;
|
float dy = fabs(invViewTransform[1].position.y - invViewTransform[0].position.y);
|
||||||
output.M[2][3] += (invViewTransform[1].position.z - invViewTransform[0].position.z) * scale;
|
float dz = fabs(invViewTransform[1].position.z - invViewTransform[0].position.z);
|
||||||
|
float ipd = sqrt(dx * dx + dy * dy + dz * dz);
|
||||||
|
XrVector3f separation = {ipd * scale, 0.0f, 0.0f};
|
||||||
|
separation = XrQuaternionf_Rotate(invView.orientation, separation);
|
||||||
|
separation = XrVector3f_ScalarMultiply(separation, vrConfig[VR_CONFIG_MIRROR_AXIS_Z] ? -1.0f : 1.0f);
|
||||||
|
output.M[0][3] -= separation.x;
|
||||||
|
output.M[1][3] -= separation.y;
|
||||||
|
output.M[2][3] -= separation.z;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
Loading…
Add table
Reference in a new issue