diff --git a/src/citra_qt/configuration/configure_enhancements.cpp b/src/citra_qt/configuration/configure_enhancements.cpp index 90dfbf44d..58790f53f 100644 --- a/src/citra_qt/configuration/configure_enhancements.cpp +++ b/src/citra_qt/configuration/configure_enhancements.cpp @@ -82,6 +82,14 @@ void ConfigureEnhancements::SetConfiguration() { ui->toggle_swap_screen->setChecked(Settings::values.swap_screen.GetValue()); ui->toggle_upright_screen->setChecked(Settings::values.upright_screen.GetValue()); ui->large_screen_proportion->setValue(Settings::values.large_screen_proportion.GetValue()); + ui->custom_top_left->setValue(Settings::values.custom_top_left.GetValue()); + ui->custom_top_top->setValue(Settings::values.custom_top_top.GetValue()); + ui->custom_top_right->setValue(Settings::values.custom_top_right.GetValue()); + ui->custom_top_bottom->setValue(Settings::values.custom_top_bottom.GetValue()); + ui->custom_bottom_left->setValue(Settings::values.custom_bottom_left.GetValue()); + ui->custom_bottom_top->setValue(Settings::values.custom_bottom_top.GetValue()); + ui->custom_bottom_right->setValue(Settings::values.custom_bottom_right.GetValue()); + ui->custom_bottom_bottom->setValue(Settings::values.custom_bottom_bottom.GetValue()); ui->toggle_dump_textures->setChecked(Settings::values.dump_textures.GetValue()); ui->toggle_custom_textures->setChecked(Settings::values.custom_textures.GetValue()); ui->toggle_preload_textures->setChecked(Settings::values.preload_textures.GetValue()); @@ -147,6 +155,15 @@ void ConfigureEnhancements::ApplyConfiguration() { } Settings::values.large_screen_proportion = ui->large_screen_proportion->value(); + Settings::values.custom_top_left = ui->custom_top_left->value(); + Settings::values.custom_top_top = ui->custom_top_top->value(); + Settings::values.custom_top_right = ui->custom_top_right->value(); + Settings::values.custom_top_bottom = ui->custom_top_bottom->value(); + Settings::values.custom_bottom_left = ui->custom_bottom_left->value(); + Settings::values.custom_bottom_top = ui->custom_bottom_top->value(); + Settings::values.custom_bottom_right = ui->custom_bottom_right->value(); + Settings::values.custom_bottom_bottom = ui->custom_bottom_bottom->value(); + ConfigurationShared::ApplyPerGameSetting(&Settings::values.filter_mode, ui->toggle_linear_filter, linear_filter); ConfigurationShared::ApplyPerGameSetting(&Settings::values.texture_filter, diff --git a/src/citra_qt/configuration/configure_enhancements.ui b/src/citra_qt/configuration/configure_enhancements.ui index 6f644d835..bbfca444a 100644 --- a/src/citra_qt/configuration/configure_enhancements.ui +++ b/src/citra_qt/configuration/configure_enhancements.ui @@ -1,544 +1,742 @@ - ConfigureEnhancements - - - - 0 - 0 - 440 - 748 - - - - - 0 - 0 - - - - Form - - - - - - Renderer - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Internal Resolution - - - - - - - - Auto (Window Size) - - - - - Native (400x240) - - - - - 2x Native (800x480) - - - - - 3x Native (1200x720) - - - - - 4x Native (1600x960) - - - - - 5x Native (2000x1200) - - - - - 6x Native (2400x1440) - - - - - 7x Native (2800x1680) - - - - - 8x Native (3200x1920) - - - - - 9x Native (3600x2160) - - - - - 10x Native (4000x2400) - - - - - - - - - - - Enable Linear Filtering - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Post-Processing Shader - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Texture Filter - - - - - - - - None - - - - - Anime4K - - - - - Bicubic - - - - - Nearest Neighbor - - - - - ScaleForce - - - - - xBRZ - - - - - - - - - - - - - - Stereoscopy - - - - - - - - Stereoscopic 3D Mode - - - - - - - - Off - - - - - Side by Side - - - - - Anaglyph - - - - - Interlaced - - - - - Reverse Interlaced - - - - - - - - - - - - Depth - - - - - - - % - - - 0 - - - 100 - - - 0 - - - - - - - - - - - Eye to Render in Monoscopic Mode - - - - - - - - Left Eye (default) - - - - - Right Eye - - - - - - - - - - - - - Layout - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Screen Layout: - - - - - - - - Default - - - - - Single Screen - - - - - Large Screen - - - - - Side by Side - - - - - Separate Windows - - - - - - - - - - - Swap Screens - - - - - - - Rotate Screens Upright - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Large Screen Proportion: - - - - - - - 1.000000000000000 - - - 16.000000000000000 - - - 4.000000000000000 - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Background Color: - - - - - - - - 40 - 16777215 - - - - - - - - - - - - - - Utility - - - - - - <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> - - - Use Custom Textures - - - - - - - <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> - - - Dump Textures - - - - - - - <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the game requires them.</p></body></html> - - - Preload Custom Textures - - - - - - - <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> - - - Async Custom Texture Loading - - - - - - - - - - Qt::Vertical - - - - 20 - 165 - - - - - - - - resolution_factor_combobox - toggle_linear_filter - shader_combobox - texture_filter_combobox - render_3d_combobox - factor_3d - mono_rendering_eye - layout_combobox - toggle_swap_screen - toggle_upright_screen - large_screen_proportion - bg_button - toggle_custom_textures - toggle_dump_textures - toggle_preload_textures - - - + ConfigureEnhancements + + + + 0 + 0 + 440 + 748 + + + + + 0 + 0 + + + + Form + + + + + + + 0 + 480 + + + + QFrame::NoFrame + + + 1 + + + true + + + + + 0 + 0 + 422 + 932 + + + + + + + Renderer + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Internal Resolution + + + + + + + + Auto (Window Size) + + + + + Native (400x240) + + + + + 2x Native (800x480) + + + + + 3x Native (1200x720) + + + + + 4x Native (1600x960) + + + + + 5x Native (2000x1200) + + + + + 6x Native (2400x1440) + + + + + 7x Native (2800x1680) + + + + + 8x Native (3200x1920) + + + + + 9x Native (3600x2160) + + + + + 10x Native (4000x2400) + + + + + + + + + + + Enable Linear Filtering + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Post-Processing Shader + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Texture Filter + + + + + + + + None + + + + + Anime4K + + + + + Bicubic + + + + + Nearest Neighbor + + + + + ScaleForce + + + + + xBRZ + + + + + + + + + + + + + + Stereoscopy + + + + + + + + Stereoscopic 3D Mode + + + + + + + + Off + + + + + Side by Side + + + + + Anaglyph + + + + + Interlaced + + + + + Reverse Interlaced + + + + + + + + + + + + Depth + + + + + + + % + + + 0 + + + 100 + + + 0 + + + + + + + + + + + Eye to Render in Monoscopic Mode + + + + + + + + Left Eye (default) + + + + + Right Eye + + + + + + + + + + + + + Layout + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Screen Layout: + + + + + + + + Default + + + + + Single Screen + + + + + Large Screen + + + + + Side by Side + + + + + Separate Windows + + + + + Custom Layout + + + + + + + + + + + Swap Screens + + + + + + + Rotate Screens Upright + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Large Screen Proportion: + + + + + + + 1.000000000000000 + + + 16.000000000000000 + + + 4.000000000000000 + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Background Color: + + + + + + + + 40 + 16777215 + + + + + + + + + + + + 0 + 0 + + + + Custom Layout + + + + + + Top Screen + + + + + + Left + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Top + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Right + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Bottom + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + + + + + 0 + 0 + + + + Bottom Screen + + + + + + Left + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Top + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Right + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + Bottom + + + + + + + QAbstractSpinBox::NoButtons + + + 2147483647 + + + + + + + + + + + + + + + + Utility + + + + + + <html><head/><body><p>Replace textures with PNG files.</p><p>Textures are loaded from load/textures/[Title ID]/.</p></body></html> + + + Use Custom Textures + + + + + + + <html><head/><body><p>Dump textures to PNG files.</p><p>Textures are dumped to dump/textures/[Title ID]/.</p></body></html> + + + Dump Textures + + + + + + + <html><head/><body><p>Load all custom textures into memory on boot, instead of loading them when the game requires them.</p></body></html> + + + Preload Custom Textures + + + + + + + <html><head/><body><p>Load custom textures asynchronously with background threads to reduce loading stutter</p></body></html> + + + Async Custom Texture Loading + + + + + + + + + + + + + + resolution_factor_combobox + toggle_linear_filter + shader_combobox + texture_filter_combobox + render_3d_combobox + factor_3d + mono_rendering_eye + layout_combobox + toggle_swap_screen + toggle_upright_screen + large_screen_proportion + bg_button + toggle_custom_textures + toggle_dump_textures + toggle_preload_textures + + + diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp index 6a99129c6..074d7ce93 100644 --- a/src/citra_qt/main.cpp +++ b/src/citra_qt/main.cpp @@ -375,6 +375,7 @@ void GMainWindow::InitializeWidgets() { actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Large_Screen); actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Side_by_Side); actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Separate_Windows); + actionGroup_ScreenLayouts->addAction(ui->action_Screen_Layout_Custom_Layout); } void GMainWindow::InitializeDebugWidgets() { @@ -795,6 +796,7 @@ void GMainWindow::ConnectMenuEvents() { connect_menu(ui->action_Screen_Layout_Large_Screen, &GMainWindow::ChangeScreenLayout); connect_menu(ui->action_Screen_Layout_Side_by_Side, &GMainWindow::ChangeScreenLayout); connect_menu(ui->action_Screen_Layout_Separate_Windows, &GMainWindow::ChangeScreenLayout); + connect_menu(ui->action_Screen_Layout_Custom_Layout, &GMainWindow::ChangeScreenLayout); connect_menu(ui->action_Screen_Layout_Swap_Screens, &GMainWindow::OnSwapScreens); connect_menu(ui->action_Screen_Layout_Upright_Screens, &GMainWindow::OnRotateScreens); @@ -1887,6 +1889,8 @@ void GMainWindow::ChangeScreenLayout() { new_layout = Settings::LayoutOption::SideScreen; } else if (ui->action_Screen_Layout_Separate_Windows->isChecked()) { new_layout = Settings::LayoutOption::SeparateWindows; + } else if (ui->action_Screen_Layout_Custom_Layout->isChecked()) { + new_layout = Settings::LayoutOption::CustomLayout; } Settings::values.layout_option = new_layout; @@ -1906,6 +1910,8 @@ void GMainWindow::ToggleScreenLayout() { case Settings::LayoutOption::SideScreen: return Settings::LayoutOption::SeparateWindows; case Settings::LayoutOption::SeparateWindows: + return Settings::LayoutOption::CustomLayout; + case Settings::LayoutOption::CustomLayout: return Settings::LayoutOption::Default; default: LOG_ERROR(Frontend, "Unknown layout option {}", @@ -2655,6 +2661,8 @@ void GMainWindow::SyncMenuUISettings() { Settings::LayoutOption::SideScreen); ui->action_Screen_Layout_Separate_Windows->setChecked( Settings::values.layout_option.GetValue() == Settings::LayoutOption::SeparateWindows); + ui->action_Screen_Layout_Custom_Layout->setChecked(Settings::values.layout_option.GetValue() == + Settings::LayoutOption::CustomLayout); ui->action_Screen_Layout_Swap_Screens->setChecked(Settings::values.swap_screen.GetValue()); ui->action_Screen_Layout_Upright_Screens->setChecked( Settings::values.upright_screen.GetValue()); diff --git a/src/citra_qt/main.ui b/src/citra_qt/main.ui index 345139568..dba9ba868 100644 --- a/src/citra_qt/main.ui +++ b/src/citra_qt/main.ui @@ -136,6 +136,7 @@ + @@ -520,6 +521,14 @@ Separate Windows + + + true + + + Custom Layout + + true diff --git a/src/common/settings.h b/src/common/settings.h index 0d980406f..873ef3359 100644 --- a/src/common/settings.h +++ b/src/common/settings.h @@ -35,6 +35,7 @@ enum class LayoutOption : u32 { #ifndef ANDROID SeparateWindows, #endif + CustomLayout, // Similiar to default, but better for mobile devices in portrait mode. Top screen in clamped to // the top of the frame, and the bottom screen is enlarged to match the top screen. MobilePortrait, diff --git a/src/core/frontend/emu_window.cpp b/src/core/frontend/emu_window.cpp index f70a5fc60..364e42729 100644 --- a/src/core/frontend/emu_window.cpp +++ b/src/core/frontend/emu_window.cpp @@ -217,6 +217,10 @@ void EmuWindow::UpdateCurrentFramebufferLayout(unsigned width, unsigned height, layout = Layout::MobileLandscapeFrameLayout( width, height, Settings::values.swap_screen.GetValue(), 2.25f, false); break; + case Settings::LayoutOption::CustomLayout: + layout = + Layout::CustomFrameLayout(width, height, Settings::values.swap_screen.GetValue()); + break; case Settings::LayoutOption::Default: default: layout = diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index 36a7c5de0..c34197fcf 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp @@ -487,6 +487,13 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale, bool is_secondar layout = MobileLandscapeFrameLayout( width, height, Settings::values.swap_screen.GetValue(), 2.25f, false); break; + case Settings::LayoutOption::CustomLayout: + layout = CustomFrameLayout(std::max(Settings::values.custom_top_right.GetValue(), + Settings::values.custom_bottom_right.GetValue()), + std::max(Settings::values.custom_top_bottom.GetValue(), + Settings::values.custom_bottom_bottom.GetValue()), + Settings::values.swap_screen.GetValue()); + break; case Settings::LayoutOption::Default: default: if (Settings::values.upright_screen.GetValue()) {