diff options
Diffstat (limited to 'src/yuzu/configuration')
19 files changed, 551 insertions, 95 deletions
| diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index bac9dff90..87ab88cfa 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -351,6 +351,10 @@ void Config::ReadPlayerValue(std::size_t player_index) {              player_motions = default_param;          }      } + +    if (player_index == 0) { +        ReadMousePanningValues(); +    }  }  void Config::ReadDebugValues() { @@ -471,6 +475,7 @@ void Config::ReadControlValues() {      ReadKeyboardValues();      ReadMouseValues();      ReadTouchscreenValues(); +    ReadMousePanningValues();      ReadMotionTouchValues();      ReadHidbusValues();      ReadIrCameraValues(); @@ -481,8 +486,6 @@ void Config::ReadControlValues() {      Settings::values.enable_raw_input = false;  #endif      ReadBasicSetting(Settings::values.emulate_analog_keyboard); -    Settings::values.mouse_panning = false; -    ReadBasicSetting(Settings::values.mouse_panning_sensitivity);      ReadBasicSetting(Settings::values.enable_joycon_driver);      ReadBasicSetting(Settings::values.enable_procon_driver);      ReadBasicSetting(Settings::values.random_amiibo_id); @@ -496,6 +499,16 @@ void Config::ReadControlValues() {      qt_config->endGroup();  } +void Config::ReadMousePanningValues() { +    ReadBasicSetting(Settings::values.mouse_panning); +    ReadBasicSetting(Settings::values.mouse_panning_x_sensitivity); +    ReadBasicSetting(Settings::values.mouse_panning_y_sensitivity); +    ReadBasicSetting(Settings::values.mouse_panning_deadzone_x_counterweight); +    ReadBasicSetting(Settings::values.mouse_panning_deadzone_y_counterweight); +    ReadBasicSetting(Settings::values.mouse_panning_decay_strength); +    ReadBasicSetting(Settings::values.mouse_panning_min_decay); +} +  void Config::ReadMotionTouchValues() {      int num_touch_from_button_maps =          qt_config->beginReadArray(QStringLiteral("touch_from_button_maps")); @@ -761,6 +774,7 @@ void Config::ReadRendererValues() {      ReadGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);      ReadGlobalSetting(Settings::values.enable_compute_pipelines);      ReadGlobalSetting(Settings::values.use_video_framerate); +    ReadGlobalSetting(Settings::values.barrier_feedback_loops);      ReadGlobalSetting(Settings::values.bg_red);      ReadGlobalSetting(Settings::values.bg_green);      ReadGlobalSetting(Settings::values.bg_blue); @@ -1063,6 +1077,10 @@ void Config::SavePlayerValue(std::size_t player_index) {                       QString::fromStdString(player.motions[i]),                       QString::fromStdString(default_param));      } + +    if (player_index == 0) { +        SaveMousePanningValues(); +    }  }  void Config::SaveDebugValues() { @@ -1099,6 +1117,16 @@ void Config::SaveTouchscreenValues() {      WriteSetting(QStringLiteral("touchscreen_diameter_y"), touchscreen.diameter_y, 15);  } +void Config::SaveMousePanningValues() { +    // Don't overwrite values.mouse_panning +    WriteBasicSetting(Settings::values.mouse_panning_x_sensitivity); +    WriteBasicSetting(Settings::values.mouse_panning_y_sensitivity); +    WriteBasicSetting(Settings::values.mouse_panning_deadzone_x_counterweight); +    WriteBasicSetting(Settings::values.mouse_panning_deadzone_y_counterweight); +    WriteBasicSetting(Settings::values.mouse_panning_decay_strength); +    WriteBasicSetting(Settings::values.mouse_panning_min_decay); +} +  void Config::SaveMotionTouchValues() {      WriteBasicSetting(Settings::values.touch_device);      WriteBasicSetting(Settings::values.touch_from_button_map_index); @@ -1185,6 +1213,7 @@ void Config::SaveControlValues() {      SaveDebugValues();      SaveMouseValues();      SaveTouchscreenValues(); +    SaveMousePanningValues();      SaveMotionTouchValues();      SaveHidbusValues();      SaveIrCameraValues(); @@ -1199,7 +1228,6 @@ void Config::SaveControlValues() {      WriteBasicSetting(Settings::values.random_amiibo_id);      WriteBasicSetting(Settings::values.keyboard_enabled);      WriteBasicSetting(Settings::values.emulate_analog_keyboard); -    WriteBasicSetting(Settings::values.mouse_panning_sensitivity);      WriteBasicSetting(Settings::values.controller_navigation);      WriteBasicSetting(Settings::values.tas_enable); @@ -1417,6 +1445,7 @@ void Config::SaveRendererValues() {      WriteGlobalSetting(Settings::values.use_vulkan_driver_pipeline_cache);      WriteGlobalSetting(Settings::values.enable_compute_pipelines);      WriteGlobalSetting(Settings::values.use_video_framerate); +    WriteGlobalSetting(Settings::values.barrier_feedback_loops);      WriteGlobalSetting(Settings::values.bg_red);      WriteGlobalSetting(Settings::values.bg_green);      WriteGlobalSetting(Settings::values.bg_blue); diff --git a/src/yuzu/configuration/config.h b/src/yuzu/configuration/config.h index 0fd4baf6b..1211389d2 100644 --- a/src/yuzu/configuration/config.h +++ b/src/yuzu/configuration/config.h @@ -74,6 +74,7 @@ private:      void ReadKeyboardValues();      void ReadMouseValues();      void ReadTouchscreenValues(); +    void ReadMousePanningValues();      void ReadMotionTouchValues();      void ReadHidbusValues();      void ReadIrCameraValues(); @@ -104,6 +105,7 @@ private:      void SaveDebugValues();      void SaveMouseValues();      void SaveTouchscreenValues(); +    void SaveMousePanningValues();      void SaveMotionTouchValues();      void SaveHidbusValues();      void SaveIrCameraValues(); diff --git a/src/yuzu/configuration/configure_dialog.cpp b/src/yuzu/configuration/configure_dialog.cpp index 8e76a819a..bdf83ebfe 100644 --- a/src/yuzu/configuration/configure_dialog.cpp +++ b/src/yuzu/configuration/configure_dialog.cpp @@ -6,6 +6,7 @@  #include "common/settings.h"  #include "core/core.h"  #include "ui_configure.h" +#include "vk_device_info.h"  #include "yuzu/configuration/config.h"  #include "yuzu/configuration/configure_audio.h"  #include "yuzu/configuration/configure_cpu.h" @@ -28,6 +29,7 @@  ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,                                   InputCommon::InputSubsystem* input_subsystem, +                                 std::vector<VkDeviceInfo::Record>& vk_device_records,                                   Core::System& system_, bool enable_web_config)      : QDialog(parent), ui{std::make_unique<Ui::ConfigureDialog>()},        registry(registry_), system{system_}, audio_tab{std::make_unique<ConfigureAudio>(system_, @@ -38,7 +40,8 @@ ConfigureDialog::ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_,        general_tab{std::make_unique<ConfigureGeneral>(system_, this)},        graphics_advanced_tab{std::make_unique<ConfigureGraphicsAdvanced>(system_, this)},        graphics_tab{std::make_unique<ConfigureGraphics>( -          system_, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this)}, +          system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, +          this)},        hotkeys_tab{std::make_unique<ConfigureHotkeys>(system_.HIDCore(), this)},        input_tab{std::make_unique<ConfigureInput>(system_, this)},        network_tab{std::make_unique<ConfigureNetwork>(system_, this)}, diff --git a/src/yuzu/configuration/configure_dialog.h b/src/yuzu/configuration/configure_dialog.h index a086a07c4..2a08b7fee 100644 --- a/src/yuzu/configuration/configure_dialog.h +++ b/src/yuzu/configuration/configure_dialog.h @@ -4,7 +4,9 @@  #pragma once  #include <memory> +#include <vector>  #include <QDialog> +#include "yuzu/vk_device_info.h"  namespace Core {  class System; @@ -40,8 +42,9 @@ class ConfigureDialog : public QDialog {  public:      explicit ConfigureDialog(QWidget* parent, HotkeyRegistry& registry_, -                             InputCommon::InputSubsystem* input_subsystem, Core::System& system_, -                             bool enable_web_config = true); +                             InputCommon::InputSubsystem* input_subsystem, +                             std::vector<VkDeviceInfo::Record>& vk_device_records, +                             Core::System& system_, bool enable_web_config = true);      ~ConfigureDialog() override;      void ApplyConfiguration(); diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp index 431585216..a4965524a 100644 --- a/src/yuzu/configuration/configure_graphics.cpp +++ b/src/yuzu/configuration/configure_graphics.cpp @@ -1,10 +1,6 @@  // SPDX-FileCopyrightText: 2016 Citra Emulator Project  // SPDX-License-Identifier: GPL-2.0-or-later -// Include this early to include Vulkan headers how we want to -#include "video_core/vulkan_common/vulkan_device.h" -#include "video_core/vulkan_common/vulkan_wrapper.h" -  #include <algorithm>  #include <functional>  #include <iosfwd> @@ -34,13 +30,11 @@  #include "common/settings.h"  #include "core/core.h"  #include "ui_configure_graphics.h" -#include "video_core/vulkan_common/vulkan_instance.h" -#include "video_core/vulkan_common/vulkan_library.h" -#include "video_core/vulkan_common/vulkan_surface.h"  #include "yuzu/configuration/configuration_shared.h"  #include "yuzu/configuration/configure_graphics.h"  #include "yuzu/qt_common.h"  #include "yuzu/uisettings.h" +#include "yuzu/vk_device_info.h"  static const std::vector<VkPresentModeKHR> default_present_modes{VK_PRESENT_MODE_IMMEDIATE_KHR,                                                                   VK_PRESENT_MODE_FIFO_KHR}; @@ -77,9 +71,10 @@ static constexpr Settings::VSyncMode PresentModeToSetting(VkPresentModeKHR mode)  }  ConfigureGraphics::ConfigureGraphics(const Core::System& system_, +                                     std::vector<VkDeviceInfo::Record>& records_,                                       const std::function<void()>& expose_compute_option_,                                       QWidget* parent) -    : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphics>()}, +    : QWidget(parent), ui{std::make_unique<Ui::ConfigureGraphics>()}, records{records_},        expose_compute_option{expose_compute_option_}, system{system_} {      vulkan_device = Settings::values.vulkan_device.GetValue();      RetrieveVulkanDevices(); @@ -504,47 +499,19 @@ void ConfigureGraphics::UpdateAPILayout() {      }  } -void ConfigureGraphics::RetrieveVulkanDevices() try { -    if (UISettings::values.has_broken_vulkan) { -        return; -    } - -    using namespace Vulkan; - -    auto* window = this->window()->windowHandle(); -    auto wsi = QtCommon::GetWindowSystemInfo(window); - -    vk::InstanceDispatch dld; -    const auto library = OpenLibrary(); -    const vk::Instance instance = CreateInstance(*library, dld, VK_API_VERSION_1_1, wsi.type); -    const std::vector<VkPhysicalDevice> physical_devices = instance.EnumeratePhysicalDevices(); -    vk::SurfaceKHR surface = CreateSurface(instance, wsi); - +void ConfigureGraphics::RetrieveVulkanDevices() {      vulkan_devices.clear(); -    vulkan_devices.reserve(physical_devices.size()); +    vulkan_devices.reserve(records.size());      device_present_modes.clear(); -    device_present_modes.reserve(physical_devices.size()); -    for (const VkPhysicalDevice device : physical_devices) { -        const auto physical_device = vk::PhysicalDevice(device, dld); -        const std::string name = physical_device.GetProperties().deviceName; -        const std::vector<VkPresentModeKHR> present_modes = -            physical_device.GetSurfacePresentModesKHR(*surface); -        vulkan_devices.push_back(QString::fromStdString(name)); -        device_present_modes.push_back(present_modes); - -        VkPhysicalDeviceDriverProperties driver_properties{}; -        driver_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES; -        driver_properties.pNext = nullptr; -        VkPhysicalDeviceProperties2 properties{}; -        properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; -        properties.pNext = &driver_properties; -        dld.vkGetPhysicalDeviceProperties2(physical_device, &properties); -        if (driver_properties.driverID == VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS) { +    device_present_modes.reserve(records.size()); +    for (const auto& record : records) { +        vulkan_devices.push_back(QString::fromStdString(record.name)); +        device_present_modes.push_back(record.vsync_support); + +        if (record.has_broken_compute) {              expose_compute_option();          }      } -} catch (const Vulkan::vk::Exception& exception) { -    LOG_ERROR(Frontend, "Failed to enumerate devices with error: {}", exception.what());  }  Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const { diff --git a/src/yuzu/configuration/configure_graphics.h b/src/yuzu/configuration/configure_graphics.h index 364b1cac2..be9310b74 100644 --- a/src/yuzu/configuration/configure_graphics.h +++ b/src/yuzu/configuration/configure_graphics.h @@ -12,6 +12,7 @@  #include <qobjectdefs.h>  #include <vulkan/vulkan_core.h>  #include "common/common_types.h" +#include "vk_device_info.h"  class QEvent;  class QObject; @@ -39,6 +40,7 @@ class ConfigureGraphics : public QWidget {  public:      explicit ConfigureGraphics(const Core::System& system_, +                               std::vector<VkDeviceInfo::Record>& records,                                 const std::function<void()>& expose_compute_option_,                                 QWidget* parent = nullptr);      ~ConfigureGraphics() override; @@ -77,6 +79,7 @@ private:      ConfigurationShared::CheckState use_disk_shader_cache;      ConfigurationShared::CheckState use_asynchronous_gpu_emulation; +    std::vector<VkDeviceInfo::Record>& records;      std::vector<QString> vulkan_devices;      std::vector<std::vector<VkPresentModeKHR>> device_present_modes;      std::vector<VkPresentModeKHR> diff --git a/src/yuzu/configuration/configure_graphics_advanced.cpp b/src/yuzu/configuration/configure_graphics_advanced.cpp index 0463ac8b9..c0a044767 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.cpp +++ b/src/yuzu/configuration/configure_graphics_advanced.cpp @@ -43,6 +43,8 @@ void ConfigureGraphicsAdvanced::SetConfiguration() {      ui->enable_compute_pipelines_checkbox->setChecked(          Settings::values.enable_compute_pipelines.GetValue());      ui->use_video_framerate_checkbox->setChecked(Settings::values.use_video_framerate.GetValue()); +    ui->barrier_feedback_loops_checkbox->setChecked( +        Settings::values.barrier_feedback_loops.GetValue());      if (Settings::IsConfiguringGlobal()) {          ui->gpu_accuracy->setCurrentIndex( @@ -94,6 +96,9 @@ void ConfigureGraphicsAdvanced::ApplyConfiguration() {                                               enable_compute_pipelines);      ConfigurationShared::ApplyPerGameSetting(&Settings::values.use_video_framerate,                                               ui->use_video_framerate_checkbox, use_video_framerate); +    ConfigurationShared::ApplyPerGameSetting(&Settings::values.barrier_feedback_loops, +                                             ui->barrier_feedback_loops_checkbox, +                                             barrier_feedback_loops);  }  void ConfigureGraphicsAdvanced::changeEvent(QEvent* event) { @@ -130,6 +135,8 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {              Settings::values.enable_compute_pipelines.UsingGlobal());          ui->use_video_framerate_checkbox->setEnabled(              Settings::values.use_video_framerate.UsingGlobal()); +        ui->barrier_feedback_loops_checkbox->setEnabled( +            Settings::values.barrier_feedback_loops.UsingGlobal());          return;      } @@ -157,6 +164,9 @@ void ConfigureGraphicsAdvanced::SetupPerGameUI() {      ConfigurationShared::SetColoredTristate(ui->use_video_framerate_checkbox,                                              Settings::values.use_video_framerate,                                              use_video_framerate); +    ConfigurationShared::SetColoredTristate(ui->barrier_feedback_loops_checkbox, +                                            Settings::values.barrier_feedback_loops, +                                            barrier_feedback_loops);      ConfigurationShared::SetColoredComboBox(          ui->gpu_accuracy, ui->label_gpu_accuracy,          static_cast<int>(Settings::values.gpu_accuracy.GetValue(true))); diff --git a/src/yuzu/configuration/configure_graphics_advanced.h b/src/yuzu/configuration/configure_graphics_advanced.h index a4dc8ceb0..369a7c83e 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.h +++ b/src/yuzu/configuration/configure_graphics_advanced.h @@ -48,6 +48,7 @@ private:      ConfigurationShared::CheckState use_vulkan_driver_pipeline_cache;      ConfigurationShared::CheckState enable_compute_pipelines;      ConfigurationShared::CheckState use_video_framerate; +    ConfigurationShared::CheckState barrier_feedback_loops;      const Core::System& system;  }; diff --git a/src/yuzu/configuration/configure_graphics_advanced.ui b/src/yuzu/configuration/configure_graphics_advanced.ui index e7f0ef6be..d527a6f38 100644 --- a/src/yuzu/configuration/configure_graphics_advanced.ui +++ b/src/yuzu/configuration/configure_graphics_advanced.ui @@ -202,6 +202,16 @@ Compute pipelines are always enabled on all other drivers.</string>           </widget>          </item>          <item> +         <widget class="QCheckBox" name="barrier_feedback_loops_checkbox"> +          <property name="toolTip"> +           <string>Improves rendering of transparency effects in specific games.</string> +          </property> +          <property name="text"> +           <string>Barrier feedback loops</string> +          </property> +         </widget> +        </item> +        <item>           <widget class="QWidget" name="af_layout" native="true">            <layout class="QHBoxLayout" name="horizontalLayout_1">             <property name="leftMargin"> diff --git a/src/yuzu/configuration/configure_input_advanced.cpp b/src/yuzu/configuration/configure_input_advanced.cpp index f13156434..3cfd5d439 100644 --- a/src/yuzu/configuration/configure_input_advanced.cpp +++ b/src/yuzu/configuration/configure_input_advanced.cpp @@ -129,9 +129,6 @@ void ConfigureInputAdvanced::ApplyConfiguration() {      Settings::values.mouse_enabled = ui->mouse_enabled->isChecked();      Settings::values.keyboard_enabled = ui->keyboard_enabled->isChecked();      Settings::values.emulate_analog_keyboard = ui->emulate_analog_keyboard->isChecked(); -    Settings::values.mouse_panning = ui->mouse_panning->isChecked(); -    Settings::values.mouse_panning_sensitivity = -        static_cast<float>(ui->mouse_panning_sensitivity->value());      Settings::values.touchscreen.enabled = ui->touchscreen_enabled->isChecked();      Settings::values.enable_raw_input = ui->enable_raw_input->isChecked();      Settings::values.enable_udp_controller = ui->enable_udp_controller->isChecked(); @@ -167,8 +164,6 @@ void ConfigureInputAdvanced::LoadConfiguration() {      ui->mouse_enabled->setChecked(Settings::values.mouse_enabled.GetValue());      ui->keyboard_enabled->setChecked(Settings::values.keyboard_enabled.GetValue());      ui->emulate_analog_keyboard->setChecked(Settings::values.emulate_analog_keyboard.GetValue()); -    ui->mouse_panning->setChecked(Settings::values.mouse_panning.GetValue()); -    ui->mouse_panning_sensitivity->setValue(Settings::values.mouse_panning_sensitivity.GetValue());      ui->touchscreen_enabled->setChecked(Settings::values.touchscreen.enabled);      ui->enable_raw_input->setChecked(Settings::values.enable_raw_input.GetValue());      ui->enable_udp_controller->setChecked(Settings::values.enable_udp_controller.GetValue()); @@ -197,8 +192,6 @@ void ConfigureInputAdvanced::RetranslateUI() {  void ConfigureInputAdvanced::UpdateUIEnabled() {      ui->debug_configure->setEnabled(ui->debug_enabled->isChecked());      ui->touchscreen_advanced->setEnabled(ui->touchscreen_enabled->isChecked()); -    ui->mouse_panning->setEnabled(!ui->mouse_enabled->isChecked()); -    ui->mouse_panning_sensitivity->setEnabled(!ui->mouse_enabled->isChecked());      ui->ring_controller_configure->setEnabled(ui->enable_ring_controller->isChecked());  #if QT_VERSION > QT_VERSION_CHECK(6, 0, 0) || !defined(YUZU_USE_QT_MULTIMEDIA)      ui->enable_ir_sensor->setEnabled(false); diff --git a/src/yuzu/configuration/configure_input_advanced.ui b/src/yuzu/configuration/configure_input_advanced.ui index 2e8b13660..2994d0ab4 100644 --- a/src/yuzu/configuration/configure_input_advanced.ui +++ b/src/yuzu/configuration/configure_input_advanced.ui @@ -2744,48 +2744,13 @@                       </widget>                     </item>                     <item row="8" column="0"> -                     <widget class="QCheckBox" name="mouse_panning"> -                       <property name="minimumSize"> -                         <size> -                           <width>0</width> -                           <height>23</height> -                         </size> -                       </property> -                       <property name="text"> -                         <string>Enable mouse panning</string> -                       </property> -                     </widget> -                   </item> -                   <item row="8" column="2"> -                     <widget class="QSpinBox" name="mouse_panning_sensitivity"> -                       <property name="toolTip"> -                         <string>Mouse sensitivity</string> -                       </property> -                       <property name="alignment"> -                         <set>Qt::AlignCenter</set> -                       </property> -                       <property name="suffix"> -                         <string>%</string> -                       </property> -                       <property name="minimum"> -                         <number>1</number> -                       </property> -                       <property name="maximum"> -                         <number>100</number> -                       </property> -                       <property name="value"> -                         <number>100</number> -                       </property> -                     </widget> -                   </item> -                   <item row="9" column="0">                       <widget class="QLabel" name="motion_touch">                         <property name="text">                           <string>Motion / Touch</string>                         </property>                       </widget>                     </item> -                   <item row="9" column="2"> +                   <item row="8" column="2">                       <widget class="QPushButton" name="buttonMotionTouch">                         <property name="text">                           <string>Configure</string> diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp index 2c2e7e47b..576f5b571 100644 --- a/src/yuzu/configuration/configure_input_player.cpp +++ b/src/yuzu/configuration/configure_input_player.cpp @@ -23,6 +23,7 @@  #include "yuzu/configuration/config.h"  #include "yuzu/configuration/configure_input_player.h"  #include "yuzu/configuration/configure_input_player_widget.h" +#include "yuzu/configuration/configure_mouse_panning.h"  #include "yuzu/configuration/input_profiles.h"  #include "yuzu/util/limitable_input_dialog.h" @@ -711,6 +712,21 @@ ConfigureInputPlayer::ConfigureInputPlayer(QWidget* parent, std::size_t player_i          });      } +    if (player_index_ == 0) { +        connect(ui->mousePanningButton, &QPushButton::clicked, [this, input_subsystem_] { +            const auto right_stick_param = +                emulated_controller->GetStickParam(Settings::NativeAnalog::RStick); +            ConfigureMousePanning dialog(this, input_subsystem_, +                                         right_stick_param.Get("deadzone", 0.0f), +                                         right_stick_param.Get("range", 1.0f)); +            if (dialog.exec() == QDialog::Accepted) { +                dialog.ApplyConfiguration(); +            } +        }); +    } else { +        ui->mousePanningWidget->hide(); +    } +      // Player Connected checkbox      connect(ui->groupConnectedController, &QGroupBox::toggled,              [this](bool checked) { emit Connected(checked); }); diff --git a/src/yuzu/configuration/configure_input_player.ui b/src/yuzu/configuration/configure_input_player.ui index a9567c6ee..43f6c7b50 100644 --- a/src/yuzu/configuration/configure_input_player.ui +++ b/src/yuzu/configuration/configure_input_player.ui @@ -3048,6 +3048,102 @@                  </item>                 </layout>                </item> +              <item> +               <widget class="QWidget" name="mousePanningWidget" native="true"> +                <layout class="QHBoxLayout" name="mousePanningHorizontalLayout"> +                 <property name="spacing"> +                  <number>0</number> +                 </property> +                 <property name="leftMargin"> +                  <number>0</number> +                 </property> +                 <property name="topMargin"> +                  <number>0</number> +                 </property> +                 <property name="rightMargin"> +                  <number>0</number> +                 </property> +                 <property name="bottomMargin"> +                  <number>3</number> +                 </property> +                 <item> +                  <spacer name="mousePanningHorizontalSpacerLeft"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                 <item> +                  <widget class="QGroupBox" name="mousePanningGroup"> +                   <property name="title"> +                    <string>Mouse panning</string> +                   </property> +                   <property name="alignment"> +                    <set>Qt::AlignCenter</set> +                   </property> +                   <layout class="QVBoxLayout" name="mousePanningVerticalLayout"> +                    <property name="spacing"> +                     <number>3</number> +                    </property> +                    <property name="leftMargin"> +                     <number>3</number> +                    </property> +                    <property name="topMargin"> +                     <number>3</number> +                    </property> +                    <property name="rightMargin"> +                     <number>3</number> +                    </property> +                    <property name="bottomMargin"> +                     <number>3</number> +                    </property> +                    <item> +                     <widget class="QPushButton" name="mousePanningButton"> +                      <property name="minimumSize"> +                       <size> +                        <width>68</width> +                        <height>0</height> +                       </size> +                      </property> +                      <property name="maximumSize"> +                       <size> +                        <width>68</width> +                        <height>16777215</height> +                       </size> +                      </property> +                      <property name="styleSheet"> +                       <string notr="true">min-width: 68px;</string> +                      </property> +                      <property name="text"> +                       <string>Configure</string> +                      </property> +                     </widget> +                    </item> +                   </layout> +                  </widget> +                 </item> +                 <item> +                  <spacer name="mousePanningHorizontalSpacerRight"> +                   <property name="orientation"> +                    <enum>Qt::Horizontal</enum> +                   </property> +                   <property name="sizeHint" stdset="0"> +                    <size> +                     <width>20</width> +                     <height>20</height> +                    </size> +                   </property> +                  </spacer> +                 </item> +                </layout> +               </widget> +              </item>               </layout>              </widget>             </item> diff --git a/src/yuzu/configuration/configure_mouse_panning.cpp b/src/yuzu/configuration/configure_mouse_panning.cpp new file mode 100644 index 000000000..f183d2740 --- /dev/null +++ b/src/yuzu/configuration/configure_mouse_panning.cpp @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include <QCloseEvent> + +#include "common/settings.h" +#include "ui_configure_mouse_panning.h" +#include "yuzu/configuration/configure_mouse_panning.h" + +ConfigureMousePanning::ConfigureMousePanning(QWidget* parent, +                                             InputCommon::InputSubsystem* input_subsystem_, +                                             float right_stick_deadzone, float right_stick_range) +    : QDialog(parent), input_subsystem{input_subsystem_}, +      ui(std::make_unique<Ui::ConfigureMousePanning>()) { +    ui->setupUi(this); +    SetConfiguration(right_stick_deadzone, right_stick_range); +    ConnectEvents(); +} + +ConfigureMousePanning::~ConfigureMousePanning() = default; + +void ConfigureMousePanning::closeEvent(QCloseEvent* event) { +    event->accept(); +} + +void ConfigureMousePanning::SetConfiguration(float right_stick_deadzone, float right_stick_range) { +    ui->enable->setChecked(Settings::values.mouse_panning.GetValue()); +    ui->x_sensitivity->setValue(Settings::values.mouse_panning_x_sensitivity.GetValue()); +    ui->y_sensitivity->setValue(Settings::values.mouse_panning_y_sensitivity.GetValue()); +    ui->deadzone_x_counterweight->setValue( +        Settings::values.mouse_panning_deadzone_x_counterweight.GetValue()); +    ui->deadzone_y_counterweight->setValue( +        Settings::values.mouse_panning_deadzone_y_counterweight.GetValue()); +    ui->decay_strength->setValue(Settings::values.mouse_panning_decay_strength.GetValue()); +    ui->min_decay->setValue(Settings::values.mouse_panning_min_decay.GetValue()); + +    if (right_stick_deadzone > 0.0f || right_stick_range != 1.0f) { +        ui->warning_label->setText(QString::fromStdString( +            "Mouse panning works better with a deadzone of 0% and a range of 100%.\n" +            "Current values are " + +            std::to_string(static_cast<int>(right_stick_deadzone * 100.0f)) + "% and " + +            std::to_string(static_cast<int>(right_stick_range * 100.0f)) + "% respectively.")); +    } else { +        ui->warning_label->hide(); +    } +} + +void ConfigureMousePanning::SetDefaultConfiguration() { +    ui->x_sensitivity->setValue(Settings::values.mouse_panning_x_sensitivity.GetDefault()); +    ui->y_sensitivity->setValue(Settings::values.mouse_panning_y_sensitivity.GetDefault()); +    ui->deadzone_x_counterweight->setValue( +        Settings::values.mouse_panning_deadzone_x_counterweight.GetDefault()); +    ui->deadzone_y_counterweight->setValue( +        Settings::values.mouse_panning_deadzone_y_counterweight.GetDefault()); +    ui->decay_strength->setValue(Settings::values.mouse_panning_decay_strength.GetDefault()); +    ui->min_decay->setValue(Settings::values.mouse_panning_min_decay.GetDefault()); +} + +void ConfigureMousePanning::ConnectEvents() { +    connect(ui->default_button, &QPushButton::clicked, this, +            &ConfigureMousePanning::SetDefaultConfiguration); +    connect(ui->button_box, &QDialogButtonBox::accepted, this, +            &ConfigureMousePanning::ApplyConfiguration); +    connect(ui->button_box, &QDialogButtonBox::rejected, this, [this] { reject(); }); +} + +void ConfigureMousePanning::ApplyConfiguration() { +    Settings::values.mouse_panning = ui->enable->isChecked(); +    Settings::values.mouse_panning_x_sensitivity = static_cast<float>(ui->x_sensitivity->value()); +    Settings::values.mouse_panning_y_sensitivity = static_cast<float>(ui->y_sensitivity->value()); +    Settings::values.mouse_panning_deadzone_x_counterweight = +        static_cast<float>(ui->deadzone_x_counterweight->value()); +    Settings::values.mouse_panning_deadzone_y_counterweight = +        static_cast<float>(ui->deadzone_y_counterweight->value()); +    Settings::values.mouse_panning_decay_strength = static_cast<float>(ui->decay_strength->value()); +    Settings::values.mouse_panning_min_decay = static_cast<float>(ui->min_decay->value()); + +    accept(); +} diff --git a/src/yuzu/configuration/configure_mouse_panning.h b/src/yuzu/configuration/configure_mouse_panning.h new file mode 100644 index 000000000..08c6e1f62 --- /dev/null +++ b/src/yuzu/configuration/configure_mouse_panning.h @@ -0,0 +1,35 @@ +// SPDX-FileCopyrightText: 2023 yuzu Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include <memory> +#include <QDialog> + +namespace InputCommon { +class InputSubsystem; +} + +namespace Ui { +class ConfigureMousePanning; +} + +class ConfigureMousePanning : public QDialog { +    Q_OBJECT +public: +    explicit ConfigureMousePanning(QWidget* parent, InputCommon::InputSubsystem* input_subsystem_, +                                   float right_stick_deadzone, float right_stick_range); +    ~ConfigureMousePanning() override; + +public slots: +    void ApplyConfiguration(); + +private: +    void closeEvent(QCloseEvent* event) override; +    void SetConfiguration(float right_stick_deadzone, float right_stick_range); +    void SetDefaultConfiguration(); +    void ConnectEvents(); + +    InputCommon::InputSubsystem* input_subsystem; +    std::unique_ptr<Ui::ConfigureMousePanning> ui; +}; diff --git a/src/yuzu/configuration/configure_mouse_panning.ui b/src/yuzu/configuration/configure_mouse_panning.ui new file mode 100644 index 000000000..75795b727 --- /dev/null +++ b/src/yuzu/configuration/configure_mouse_panning.ui @@ -0,0 +1,238 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ConfigureMousePanning</class> + <widget class="QDialog" name="configure_mouse_panning"> +  <property name="windowTitle"> +   <string>Configure mouse panning</string> +  </property> +  <layout class="QVBoxLayout"> +   <item> +    <widget class="QCheckBox" name="enable"> +     <property name="text"> +      <string>Enable</string> +     </property> +     <property name="toolTip"> +      <string>Can be toggled via a hotkey</string> +     </property> +    </widget> +   </item> +   <item> +    <layout class="QHBoxLayout"> +     <item> +      <widget class="QGroupBox" name="sensitivity_box"> +       <property name="title"> +        <string>Sensitivity</string> +       </property> +       <layout class="QGridLayout"> +        <item row="0" column="0"> +         <widget class="QLabel" name="x_sensitivity_label"> +          <property name="text"> +           <string>Horizontal</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <widget class="QSpinBox" name="x_sensitivity"> +          <property name="alignment"> +           <set>Qt::AlignCenter</set> +          </property> +          <property name="suffix"> +           <string>%</string> +          </property> +          <property name="minimum"> +           <number>1</number> +          </property> +          <property name="maximum"> +           <number>100</number> +          </property> +          <property name="value"> +           <number>50</number> +          </property> +         </widget> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="y_sensitivity_label"> +          <property name="text"> +           <string>Vertical</string> +          </property> +         </widget> +        </item> +        <item row="1" column="1"> +         <widget class="QSpinBox" name="y_sensitivity"> +          <property name="alignment"> +           <set>Qt::AlignCenter</set> +          </property> +          <property name="suffix"> +           <string>%</string> +          </property> +          <property name="minimum"> +           <number>1</number> +          </property> +          <property name="maximum"> +           <number>100</number> +          </property> +          <property name="value"> +           <number>50</number> +          </property> +         </widget> +        </item> +       </layout> +      </widget> +     </item> +     <item> +      <widget class="QGroupBox" name="deadzone_counterweight_box"> +       <property name="title"> +        <string>Deadzone counterweight</string> +       </property> +       <property name="toolTip"> +        <string>Counteracts a game's built-in deadzone</string> +       </property> +       <layout class="QGridLayout"> +        <item row="0" column="0"> +         <widget class="QLabel" name="deadzone_x_counterweight_label"> +          <property name="text"> +           <string>Horizontal</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <widget class="QSpinBox" name="deadzone_x_counterweight"> +          <property name="alignment"> +           <set>Qt::AlignCenter</set> +          </property> +          <property name="suffix"> +           <string>%</string> +          </property> +          <property name="minimum"> +           <number>0</number> +          </property> +          <property name="maximum"> +           <number>100</number> +          </property> +          <property name="value"> +           <number>0</number> +          </property> +         </widget> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="deadzone_y_counterweight_label"> +          <property name="text"> +           <string>Vertical</string> +          </property> +         </widget> +        </item> +        <item row="1" column="1"> +         <widget class="QSpinBox" name="deadzone_y_counterweight"> +          <property name="alignment"> +           <set>Qt::AlignCenter</set> +          </property> +          <property name="suffix"> +           <string>%</string> +          </property> +          <property name="minimum"> +           <number>0</number> +          </property> +          <property name="maximum"> +           <number>100</number> +          </property> +          <property name="value"> +           <number>0</number> +          </property> +         </widget> +        </item> +       </layout> +      </widget> +     </item> +     <item> +      <widget class="QGroupBox" name="decay_box"> +       <property name="title"> +        <string>Stick decay</string> +       </property> +       <layout class="QGridLayout"> +        <item row="0" column="0"> +         <widget class="QLabel" name="decay_strength_label"> +          <property name="text"> +           <string>Strength</string> +          </property> +         </widget> +        </item> +        <item row="0" column="1"> +         <widget class="QSpinBox" name="decay_strength"> +          <property name="alignment"> +           <set>Qt::AlignCenter</set> +          </property> +          <property name="suffix"> +           <string>%</string> +          </property> +          <property name="minimum"> +           <number>0</number> +          </property> +          <property name="maximum"> +           <number>100</number> +          </property> +          <property name="value"> +           <number>22</number> +          </property> +         </widget> +        </item> +        <item row="1" column="0"> +         <widget class="QLabel" name="min_decay_label"> +          <property name="text"> +           <string>Minimum</string> +          </property> +         </widget> +        </item> +        <item row="1" column="1"> +         <widget class="QSpinBox" name="min_decay"> +          <property name="alignment"> +           <set>Qt::AlignCenter</set> +          </property> +          <property name="suffix"> +           <string>%</string> +          </property> +          <property name="minimum"> +           <number>0</number> +          </property> +          <property name="maximum"> +           <number>100</number> +          </property> +          <property name="value"> +           <number>5</number> +          </property> +         </widget> +        </item> +       </layout> +      </widget> +     </item> +    </layout> +   </item> +   <item> +    <widget class="QLabel" name="warning_label"> +     <property name="text"> +      <string/> +     </property> +    </widget> +   </item> +   <item> +    <layout class="QHBoxLayout"> +     <item> +      <widget class="QPushButton" name="default_button"> +       <property name="text"> +        <string>Default</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QDialogButtonBox" name="button_box"> +       <property name="standardButtons"> +        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> +       </property> +      </widget> +     </item> +    </layout> +   </item> +  </layout> + </widget> + <resources/> + <connections/> +</ui> diff --git a/src/yuzu/configuration/configure_per_game.cpp b/src/yuzu/configuration/configure_per_game.cpp index 7ac162586..eb96e6068 100644 --- a/src/yuzu/configuration/configure_per_game.cpp +++ b/src/yuzu/configuration/configure_per_game.cpp @@ -6,6 +6,7 @@  #include <memory>  #include <string>  #include <utility> +#include <vector>  #include <fmt/format.h> @@ -34,8 +35,10 @@  #include "yuzu/configuration/configure_system.h"  #include "yuzu/uisettings.h"  #include "yuzu/util/util.h" +#include "yuzu/vk_device_info.h"  ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::string& file_name, +                                   std::vector<VkDeviceInfo::Record>& vk_device_records,                                     Core::System& system_)      : QDialog(parent),        ui(std::make_unique<Ui::ConfigurePerGame>()), title_id{title_id_}, system{system_} { @@ -50,7 +53,7 @@ ConfigurePerGame::ConfigurePerGame(QWidget* parent, u64 title_id_, const std::st      general_tab = std::make_unique<ConfigureGeneral>(system_, this);      graphics_advanced_tab = std::make_unique<ConfigureGraphicsAdvanced>(system_, this);      graphics_tab = std::make_unique<ConfigureGraphics>( -        system_, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this); +        system_, vk_device_records, [&]() { graphics_advanced_tab->ExposeComputeOption(); }, this);      input_tab = std::make_unique<ConfigureInputPerGame>(system_, game_config.get(), this);      system_tab = std::make_unique<ConfigureSystem>(system_, this); diff --git a/src/yuzu/configuration/configure_per_game.h b/src/yuzu/configuration/configure_per_game.h index 85752f1fa..7ec1ded06 100644 --- a/src/yuzu/configuration/configure_per_game.h +++ b/src/yuzu/configuration/configure_per_game.h @@ -5,11 +5,13 @@  #include <memory>  #include <string> +#include <vector>  #include <QDialog>  #include <QList>  #include "core/file_sys/vfs_types.h" +#include "vk_device_info.h"  #include "yuzu/configuration/config.h"  namespace Core { @@ -45,6 +47,7 @@ class ConfigurePerGame : public QDialog {  public:      // Cannot use std::filesystem::path due to https://bugreports.qt.io/browse/QTBUG-73263      explicit ConfigurePerGame(QWidget* parent, u64 title_id_, const std::string& file_name, +                              std::vector<VkDeviceInfo::Record>& vk_device_records,                                Core::System& system_);      ~ConfigurePerGame() override; diff --git a/src/yuzu/configuration/configure_ringcon.ui b/src/yuzu/configuration/configure_ringcon.ui index 514dff372..38ecccc3d 100644 --- a/src/yuzu/configuration/configure_ringcon.ui +++ b/src/yuzu/configuration/configure_ringcon.ui @@ -23,7 +23,7 @@        </size>       </property>       <property name="text"> -      <string>If you want to use this controller configure player 1 as right controller and player 2 as dual joycon before starting the game to allow this controller to be detected properly.</string> +      <string>To use Ring-Con, configure player 1 as right Joy-Con (both physical and emulated), and player 2 as left Joy-Con (left physical and dual emulated) before starting the game.</string>       </property>       <property name="wordWrap">        <bool>true</bool> | 
