From 5c95fd244f5dea0f57f6eaf6694f9513086f76f3 Mon Sep 17 00:00:00 2001 From: Lubos Date: Tue, 26 Jul 2022 17:20:46 +0200 Subject: [PATCH] OpenXR - Automatically switch between fullscreen/VR --- Common/GPU/OpenGL/GLRenderManager.cpp | 14 ++++++++++++++ GPU/GLES/ShaderManagerGLES.cpp | 17 +++++++++++++++-- UI/EmuScreen.cpp | 20 -------------------- UI/PauseScreen.cpp | 8 -------- VR/VRRenderer.cpp | 9 +++++++++ VR/VRRenderer.h | 3 +++ 6 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Common/GPU/OpenGL/GLRenderManager.cpp b/Common/GPU/OpenGL/GLRenderManager.cpp index 7c48132d34..6959b0d753 100644 --- a/Common/GPU/OpenGL/GLRenderManager.cpp +++ b/Common/GPU/OpenGL/GLRenderManager.cpp @@ -10,6 +10,7 @@ #ifdef OPENXR #include "VR/VRBase.h" +#include "VR/VRInput.h" #include "VR/VRRenderer.h" #endif @@ -209,6 +210,19 @@ bool GLRenderManager::ThreadFrame() { return false; #ifdef OPENXR VR_BeginFrame(VR_GetEngine()); + + // Decide if the scene is 3D or not + if (VR_GeView3DCount() > 100) { + VR_SetMode(VR_MODE_MONO_6DOF); + } else { + VR_SetMode(VR_MODE_FLAT_SCREEN); + } + VR_SetView3DCount(VR_GeView3DCount() / 2); + + // hack to quick enable 2D mode in game + if (IN_VRGetButtonState(0) & ovrButton_GripTrigger) { + VR_SetMode(VR_MODE_FLAT_SCREEN); + } #endif // In case of syncs or other partial completion, we keep going until we complete a frame. diff --git a/GPU/GLES/ShaderManagerGLES.cpp b/GPU/GLES/ShaderManagerGLES.cpp index 903434f37c..bc1295aabc 100644 --- a/GPU/GLES/ShaderManagerGLES.cpp +++ b/GPU/GLES/ShaderManagerGLES.cpp @@ -51,6 +51,7 @@ #include "GPU/GLES/FramebufferManagerGLES.h" #ifdef OPENXR +#include "VR/VRBase.h" #include "VR/VRRenderer.h" #endif @@ -314,11 +315,23 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu render_->SetUniformUI1(&u_depal_mask_shift_off_fmt, val); } +#ifdef OPENXR + bool is2D = true; + for (int i = 0; i < 4; i++) { + for (int j = 0; j < 4; j++) { + if ((i != j) && (fabs(gstate.projMatrix[i * 4 + j]) > 0.0001f)) { + VR_SetView3DCount(VR_GeView3DCount() + 1); + is2D = false; + } + } + } +#endif + // Update any dirty uniforms before we draw if (dirty & DIRTY_PROJMATRIX) { Matrix4x4 flippedMatrix; #ifdef OPENXR - if (VR_GetMode() == VR_MODE_FLAT_SCREEN) { + if ((VR_GetMode() == VR_MODE_FLAT_SCREEN) || is2D) { memcpy(&flippedMatrix, gstate.projMatrix, 16 * sizeof(float)); } else { ovrMatrix4f hmdProjection = VR_GetMatrix(VR_PROJECTION_MATRIX_LEFT_EYE); @@ -484,7 +497,7 @@ void LinkedShader::UpdateUniforms(u32 vertType, const ShaderID &vsid, bool useBu } if (dirty & DIRTY_VIEWMATRIX) { #ifdef OPENXR - if (VR_GetMode() == VR_MODE_FLAT_SCREEN) { + if ((VR_GetMode() == VR_MODE_FLAT_SCREEN) || is2D) { SetMatrix4x3(render_, &u_view, gstate.viewMatrix); } else { // Get view matrix from the game diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 079ad7bbce..aa08576467 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -96,12 +96,6 @@ using namespace std::placeholders; static AVIDump avi; #endif -#ifdef OPENXR -#include -#include -#include -#endif - // TODO: Ugly! static bool frameStep_; static int lastNumFlips; @@ -827,9 +821,6 @@ protected: }; void EmuScreen::CreateViews() { -#ifdef OPENXR - VR_SetMode(VR_MODE_MONO_6DOF); -#endif using namespace UI; auto dev = GetI18NCategory("Developer"); @@ -1014,17 +1005,6 @@ UI::EventReturn EmuScreen::OnReset(UI::EventParams ¶ms) { } void EmuScreen::update() { -#ifdef OPENXR - // hack to quick enable 2D mode in game and adjust the view - bool leftPressed = IN_VRGetButtonState(0) & ovrButton_Left; - bool rightPressed = IN_VRGetButtonState(0) & ovrButton_Right; - bool gripPressed = IN_VRGetButtonState(0) & ovrButton_GripTrigger; - if (gripPressed && leftPressed) { - VR_SetMode(VR_MODE_FLAT_SCREEN); - } else if (gripPressed && rightPressed) { - VR_SetMode(VR_MODE_MONO_6DOF); - } -#endif using namespace UI; UIScreen::update(); diff --git a/UI/PauseScreen.cpp b/UI/PauseScreen.cpp index 03fc98a451..339409ed6e 100644 --- a/UI/PauseScreen.cpp +++ b/UI/PauseScreen.cpp @@ -48,10 +48,6 @@ #include "UI/OnScreenDisplay.h" #include "UI/GameInfoCache.h" -#ifdef OPENXR -#include -#endif - AsyncImageFileView::AsyncImageFileView(const Path &filename, UI::ImageSizeMode sizeMode, UI::LayoutParams *layoutParams) : UI::Clickable(layoutParams), canFocus_(true), filename_(filename), color_(0xFFFFFFFF), sizeMode_(sizeMode), textureFailed_(false), fixedSizeW_(0.0f), fixedSizeH_(0.0f) {} @@ -368,10 +364,6 @@ GamePauseScreen::~GamePauseScreen() { } void GamePauseScreen::CreateViews() { -#ifdef OPENXR - VR_SetMode(VR_MODE_FLAT_SCREEN); -#endif - static const int NUM_SAVESLOTS = 5; using namespace UI; diff --git a/VR/VRRenderer.cpp b/VR/VRRenderer.cpp index 6f9483cd79..ed9d0a345f 100644 --- a/VR/VRRenderer.cpp +++ b/VR/VRRenderer.cpp @@ -16,6 +16,7 @@ GLboolean initialized = GL_FALSE; GLboolean stageSupported = GL_FALSE; GLboolean viewInverted = GL_FALSE; VRMode vrMode = VR_MODE_FLAT_SCREEN; +int view3DCount = 0; float menuYaw = 0; float recenterYaw = 0; @@ -434,6 +435,14 @@ VRMode VR_GetMode() { return vrMode; } +int VR_GeView3DCount() { + return view3DCount; +} + +void VR_SetView3DCount( int value ) { + view3DCount = value; +} + void VR_BindFramebuffer( engine_t* engine, int eye ) { if (!initialized) return; ovrFramebuffer* frameBuffer = &engine->appState.Renderer.FrameBuffer[eye]; diff --git a/VR/VRRenderer.h b/VR/VRRenderer.h index f7a811ea04..177435d952 100644 --- a/VR/VRRenderer.h +++ b/VR/VRRenderer.h @@ -25,6 +25,9 @@ void VR_EndFrame( engine_t* engine ); void VR_SetMode( VRMode mode ); VRMode VR_GetMode(); +int VR_GeView3DCount(); +void VR_SetView3DCount( int value ); + void VR_BindFramebuffer( engine_t* engine, int eye ); ovrMatrix4f VR_GetMatrix( VRMatrix matrix ); void VR_SetInvertedProjection( bool inverted );