From abd2454154b62c358900ede69f6029c1be59c6de Mon Sep 17 00:00:00 2001 From: oneup03 Date: Sat, 31 Aug 2024 22:32:53 -0500 Subject: [PATCH] Stereoscopic 3D Enhancements - Increase maximum 3D depth to 255% - Fix touch screen to only render 2D when separate window layout is used - Cleanup some 3D option localizations --- .../settings/ui/SettingsFragmentPresenter.kt | 2 +- src/android/app/src/main/jni/default_ini.h | 2 +- src/citra_qt/citra_qt.cpp | 2 +- .../configuration/configure_enhancements.ui | 2 +- src/core/frontend/emu_window.cpp | 30 +++++++++++----- .../renderer_opengl/renderer_opengl.cpp | 34 ++++++++++++++----- .../renderer_vulkan/renderer_vulkan.cpp | 32 ++++++++++++----- 7 files changed, 75 insertions(+), 29 deletions(-) diff --git a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt index 31401567f..c6c8139b7 100644 --- a/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citra/citra_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -829,7 +829,7 @@ class SettingsFragmentPresenter(private val fragmentView: SettingsFragmentView) R.string.factor3d, R.string.factor3d_description, 0, - 100, + 255, "%", IntSetting.STEREOSCOPIC_3D_DEPTH.key, IntSetting.STEREOSCOPIC_3D_DEPTH.defaultValue.toFloat() diff --git a/src/android/app/src/main/jni/default_ini.h b/src/android/app/src/main/jni/default_ini.h index 5c802856e..f3ee1afc1 100644 --- a/src/android/app/src/main/jni/default_ini.h +++ b/src/android/app/src/main/jni/default_ini.h @@ -162,7 +162,7 @@ bg_green = render_3d = # Change 3D Intensity -# 0 - 100: Intensity. 0 (default) +# 0 - 255: Intensity. 0 (default) factor_3d = # The name of the post processing shader to apply. diff --git a/src/citra_qt/citra_qt.cpp b/src/citra_qt/citra_qt.cpp index 0b3c78f70..88460ab6d 100644 --- a/src/citra_qt/citra_qt.cpp +++ b/src/citra_qt/citra_qt.cpp @@ -832,7 +832,7 @@ void GMainWindow::InitializeHotkeys() { }); connect_shortcut(QStringLiteral("Increase 3D Factor"), [this] { const auto factor_3d = Settings::values.factor_3d.GetValue(); - if (factor_3d < 100) { + if (factor_3d < 255) { if (factor_3d % FACTOR_3D_STEP != 0) { Settings::values.factor_3d = factor_3d + FACTOR_3D_STEP - (factor_3d % FACTOR_3D_STEP); diff --git a/src/citra_qt/configuration/configure_enhancements.ui b/src/citra_qt/configuration/configure_enhancements.ui index a496d35f5..c17914a5d 100644 --- a/src/citra_qt/configuration/configure_enhancements.ui +++ b/src/citra_qt/configuration/configure_enhancements.ui @@ -276,7 +276,7 @@ 0 - 100 + 255 0 diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index 6c2811cf0..8cc5c2a77 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -94,17 +94,24 @@ bool EmuWindow::IsWithinTouchscreen(const Layout::FramebufferLayout& layout, uns std::tuple EmuWindow::ClipToTouchScreen(unsigned new_x, unsigned new_y) const { Settings::StereoRenderOption render_3d_mode = Settings::values.render_3d.GetValue(); + bool separate_win = false; +#ifndef ANDROID + separate_win = + (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); +#endif if (new_x >= framebuffer_layout.width / 2) { - if (render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) + if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || + render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && + !separate_win) new_x -= framebuffer_layout.width / 2; else if (render_3d_mode == Settings::StereoRenderOption::CardboardVR) new_x -= (framebuffer_layout.width / 2) - (framebuffer_layout.cardboard.user_x_shift * 2); } - if (render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) { + if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || + render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && + !separate_win) { new_x = std::max(new_x, framebuffer_layout.bottom_screen.left / 2); new_x = std::min(new_x, framebuffer_layout.bottom_screen.right / 2 - 1); } else { @@ -130,21 +137,28 @@ void EmuWindow::CreateTouchState() { bool EmuWindow::TouchPressed(unsigned framebuffer_x, unsigned framebuffer_y) { Settings::StereoRenderOption render_3d_mode = Settings::values.render_3d.GetValue(); + bool separate_win = false; +#ifndef ANDROID + separate_win = + (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); +#endif if (!IsWithinTouchscreen(framebuffer_layout, framebuffer_x, framebuffer_y)) return false; if (framebuffer_x >= framebuffer_layout.width / 2) { - if (render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) + if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || + render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && + !separate_win) framebuffer_x -= framebuffer_layout.width / 2; else if (render_3d_mode == Settings::StereoRenderOption::CardboardVR) framebuffer_x -= (framebuffer_layout.width / 2) - (framebuffer_layout.cardboard.user_x_shift * 2); } std::scoped_lock guard(touch_state->mutex); - if (render_3d_mode == Settings::StereoRenderOption::SideBySide || - render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) { + if ((render_3d_mode == Settings::StereoRenderOption::SideBySide || + render_3d_mode == Settings::StereoRenderOption::ReverseSideBySide) && + !separate_win) { touch_state->touch_x = static_cast(framebuffer_x - framebuffer_layout.bottom_screen.left / 2) / (framebuffer_layout.bottom_screen.right / 2 - diff --git a/src/video_core/renderer_opengl/renderer_opengl.cpp b/src/video_core/renderer_opengl/renderer_opengl.cpp index 4f5dcb131..2b2e29843 100644 --- a/src/video_core/renderer_opengl/renderer_opengl.cpp +++ b/src/video_core/renderer_opengl/renderer_opengl.cpp @@ -793,6 +793,12 @@ void RendererOpenGL::DrawBottomScreen(const Layout::FramebufferLayout& layout, const auto orientation = layout.is_rotated ? Layout::DisplayOrientation::Landscape : Layout::DisplayOrientation::Portrait; + bool separate_win = false; +#ifndef ANDROID + separate_win = + (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); +#endif + switch (Settings::values.render_3d.GetValue()) { case Settings::StereoRenderOption::Off: { DrawSingleScreen(screen_infos[2], bottom_screen_left, bottom_screen_top, @@ -801,12 +807,17 @@ void RendererOpenGL::DrawBottomScreen(const Layout::FramebufferLayout& layout, } case Settings::StereoRenderOption::SideBySide: // Bottom screen is identical on both sides case Settings::StereoRenderOption::ReverseSideBySide: { - DrawSingleScreen(screen_infos[2], bottom_screen_left / 2, bottom_screen_top, - bottom_screen_width / 2, bottom_screen_height, orientation); - glUniform1i(uniform_layer, 1); - DrawSingleScreen( - screen_infos[2], static_cast((bottom_screen_left / 2) + (layout.width / 2)), - bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, orientation); + if (separate_win) { + DrawSingleScreen(screen_infos[2], bottom_screen_left, bottom_screen_top, + bottom_screen_width, bottom_screen_height, orientation); + } else { + DrawSingleScreen(screen_infos[2], bottom_screen_left / 2, bottom_screen_top, + bottom_screen_width / 2, bottom_screen_height, orientation); + glUniform1i(uniform_layer, 1); + DrawSingleScreen( + screen_infos[2], static_cast((bottom_screen_left / 2) + (layout.width / 2)), + bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, orientation); + } break; } case Settings::StereoRenderOption::CardboardVR: { @@ -822,9 +833,14 @@ void RendererOpenGL::DrawBottomScreen(const Layout::FramebufferLayout& layout, case Settings::StereoRenderOption::Anaglyph: case Settings::StereoRenderOption::Interlaced: case Settings::StereoRenderOption::ReverseInterlaced: { - DrawSingleScreenStereo(screen_infos[2], screen_infos[2], bottom_screen_left, - bottom_screen_top, bottom_screen_width, bottom_screen_height, - orientation); + if (separate_win) { + DrawSingleScreen(screen_infos[2], bottom_screen_left, bottom_screen_top, + bottom_screen_width, bottom_screen_height, orientation); + } else { + DrawSingleScreenStereo(screen_infos[2], screen_infos[2], bottom_screen_left, + bottom_screen_top, bottom_screen_width, bottom_screen_height, + orientation); + } break; } } diff --git a/src/video_core/renderer_vulkan/renderer_vulkan.cpp b/src/video_core/renderer_vulkan/renderer_vulkan.cpp index 6c95a22b7..026f6e48c 100644 --- a/src/video_core/renderer_vulkan/renderer_vulkan.cpp +++ b/src/video_core/renderer_vulkan/renderer_vulkan.cpp @@ -739,6 +739,12 @@ void RendererVulkan::DrawBottomScreen(const Layout::FramebufferLayout& layout, const auto orientation = layout.is_rotated ? Layout::DisplayOrientation::Landscape : Layout::DisplayOrientation::Portrait; + bool separate_win = false; +#ifndef ANDROID + separate_win = + (Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); +#endif + switch (Settings::values.render_3d.GetValue()) { case Settings::StereoRenderOption::Off: { DrawSingleScreen(2, bottom_screen_left, bottom_screen_top, bottom_screen_width, @@ -747,12 +753,17 @@ void RendererVulkan::DrawBottomScreen(const Layout::FramebufferLayout& layout, } case Settings::StereoRenderOption::SideBySide: // Bottom screen is identical on both sides case Settings::StereoRenderOption::ReverseSideBySide: { - DrawSingleScreen(2, bottom_screen_left / 2, bottom_screen_top, bottom_screen_width / 2, - bottom_screen_height, orientation); - draw_info.layer = 1; - DrawSingleScreen(2, static_cast((bottom_screen_left / 2) + (layout.width / 2)), - bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, - orientation); + if (separate_win) { + DrawSingleScreen(2, bottom_screen_left, bottom_screen_top, bottom_screen_width, + bottom_screen_height, orientation); + } else { + DrawSingleScreen(2, bottom_screen_left / 2, bottom_screen_top, bottom_screen_width / 2, + bottom_screen_height, orientation); + draw_info.layer = 1; + DrawSingleScreen(2, static_cast((bottom_screen_left / 2) + (layout.width / 2)), + bottom_screen_top, bottom_screen_width / 2, bottom_screen_height, + orientation); + } break; } case Settings::StereoRenderOption::CardboardVR: { @@ -767,8 +778,13 @@ void RendererVulkan::DrawBottomScreen(const Layout::FramebufferLayout& layout, case Settings::StereoRenderOption::Anaglyph: case Settings::StereoRenderOption::Interlaced: case Settings::StereoRenderOption::ReverseInterlaced: { - DrawSingleScreenStereo(2, 2, bottom_screen_left, bottom_screen_top, bottom_screen_width, - bottom_screen_height, orientation); + if (separate_win) { + DrawSingleScreen(2, bottom_screen_left, bottom_screen_top, bottom_screen_width, + bottom_screen_height, orientation); + } else { + DrawSingleScreenStereo(2, 2, bottom_screen_left, bottom_screen_top, bottom_screen_width, + bottom_screen_height, orientation); + } break; } }