diff options
Diffstat (limited to 'src/yuzu')
| -rw-r--r-- | src/yuzu/applets/qt_controller.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input.cpp | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player_widget.cpp | 89 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_input_player_widget.h | 2 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.cpp | 74 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.h | 18 | ||||
| -rw-r--r-- | src/yuzu/configuration/configure_vibration.ui | 7 | 
7 files changed, 151 insertions, 43 deletions
| diff --git a/src/yuzu/applets/qt_controller.cpp b/src/yuzu/applets/qt_controller.cpp index 4239c17f5..4104928d1 100644 --- a/src/yuzu/applets/qt_controller.cpp +++ b/src/yuzu/applets/qt_controller.cpp @@ -257,7 +257,7 @@ void QtControllerSelectorDialog::LoadConfiguration() {  }  void QtControllerSelectorDialog::CallConfigureVibrationDialog() { -    ConfigureVibration dialog(this); +    ConfigureVibration dialog(this, system.HIDCore());      dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint |                            Qt::WindowSystemMenuHint); diff --git a/src/yuzu/configuration/configure_input.cpp b/src/yuzu/configuration/configure_input.cpp index d53179dbb..7c5776189 100644 --- a/src/yuzu/configuration/configure_input.cpp +++ b/src/yuzu/configuration/configure_input.cpp @@ -164,7 +164,7 @@ void ConfigureInput::Initialize(InputCommon::InputSubsystem* input_subsystem,              });      connect(ui->vibrationButton, &QPushButton::clicked, -            [this] { CallConfigureDialog<ConfigureVibration>(*this); }); +            [this, &hid_core] { CallConfigureDialog<ConfigureVibration>(*this, hid_core); });      connect(ui->motionButton, &QPushButton::clicked, [this, input_subsystem] {          CallConfigureDialog<ConfigureMotionTouch>(*this, input_subsystem); diff --git a/src/yuzu/configuration/configure_input_player_widget.cpp b/src/yuzu/configuration/configure_input_player_widget.cpp index 6630321cb..fb168b2ca 100644 --- a/src/yuzu/configuration/configure_input_player_widget.cpp +++ b/src/yuzu/configuration/configure_input_player_widget.cpp @@ -70,7 +70,6 @@ void PlayerControlPreview::UpdateColors() {          colors.slider_arrow = QColor(14, 15, 18);          colors.font2 = QColor(255, 255, 255);          colors.indicator = QColor(170, 238, 255); -        colors.indicator2 = QColor(100, 255, 100);          colors.deadzone = QColor(204, 136, 136);          colors.slider_button = colors.button;      } @@ -88,7 +87,6 @@ void PlayerControlPreview::UpdateColors() {          colors.slider_arrow = QColor(65, 68, 73);          colors.font2 = QColor(0, 0, 0);          colors.indicator = QColor(0, 0, 200); -        colors.indicator2 = QColor(0, 150, 0);          colors.deadzone = QColor(170, 0, 0);          colors.slider_button = QColor(153, 149, 149);      } @@ -101,6 +99,8 @@ void PlayerControlPreview::UpdateColors() {      colors.font = QColor(255, 255, 255);      colors.led_on = QColor(255, 255, 0);      colors.led_off = QColor(170, 238, 255); +    colors.indicator2 = QColor(59, 165, 93); +    colors.charging = QColor(250, 168, 26);      colors.left = colors.primary;      colors.right = colors.primary; @@ -357,7 +357,7 @@ void PlayerControlPreview::DrawLeftController(QPainter& p, const QPointF center)      DrawCircle(p, center + QPoint(26, 71), 5);      // Draw battery -    DrawBattery(p, center + QPoint(-170, -140), +    DrawBattery(p, center + QPoint(-160, -140),                  battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);  } @@ -484,7 +484,7 @@ void PlayerControlPreview::DrawRightController(QPainter& p, const QPointF center      DrawSymbol(p, center + QPoint(-26, 66), Symbol::House, 5);      // Draw battery -    DrawBattery(p, center + QPoint(110, -140), +    DrawBattery(p, center + QPoint(120, -140),                  battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);  } @@ -621,9 +621,9 @@ void PlayerControlPreview::DrawDualController(QPainter& p, const QPointF center)      DrawSymbol(p, center + QPoint(50, 60), Symbol::House, 4.2f);      // Draw battery -    DrawBattery(p, center + QPoint(-100, -160), +    DrawBattery(p, center + QPoint(-200, -10),                  battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); -    DrawBattery(p, center + QPoint(40, -160), +    DrawBattery(p, center + QPoint(160, -10),                  battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);  } @@ -694,12 +694,12 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen      // ZL and ZR buttons      p.setPen(colors.outline); -    DrawTriggerButton(p, center + QPoint(-210, -130), Direction::Left, button_values[ZL]); -    DrawTriggerButton(p, center + QPoint(210, -130), Direction::Right, button_values[ZR]); +    DrawTriggerButton(p, center + QPoint(-210, -120), Direction::Left, button_values[ZL]); +    DrawTriggerButton(p, center + QPoint(210, -120), Direction::Right, button_values[ZR]);      p.setPen(colors.transparent);      p.setBrush(colors.font); -    DrawSymbol(p, center + QPoint(-210, -130), Symbol::ZL, 1.5f); -    DrawSymbol(p, center + QPoint(210, -130), Symbol::ZR, 1.5f); +    DrawSymbol(p, center + QPoint(-210, -120), Symbol::ZL, 1.5f); +    DrawSymbol(p, center + QPoint(210, -120), Symbol::ZR, 1.5f);      // Minus and Plus button      p.setPen(colors.outline); @@ -725,9 +725,9 @@ void PlayerControlPreview::DrawHandheldController(QPainter& p, const QPointF cen      DrawSymbol(p, center + QPoint(161, 37), Symbol::House, 2.75f);      // Draw battery -    DrawBattery(p, center + QPoint(-200, 110), +    DrawBattery(p, center + QPoint(-188, 95),                  battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]); -    DrawBattery(p, center + QPoint(130, 110), +    DrawBattery(p, center + QPoint(150, 95),                  battery_values[Core::HID::EmulatedDeviceIndex::RightIndex]);  } @@ -781,12 +781,12 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)      // ZL and ZR buttons      p.setPen(colors.outline); -    DrawTriggerButton(p, center + QPoint(-210, -130), Direction::Left, button_values[ZL]); -    DrawTriggerButton(p, center + QPoint(210, -130), Direction::Right, button_values[ZR]); +    DrawTriggerButton(p, center + QPoint(-210, -120), Direction::Left, button_values[ZL]); +    DrawTriggerButton(p, center + QPoint(210, -120), Direction::Right, button_values[ZR]);      p.setPen(colors.transparent);      p.setBrush(colors.font); -    DrawSymbol(p, center + QPoint(-210, -130), Symbol::ZL, 1.5f); -    DrawSymbol(p, center + QPoint(210, -130), Symbol::ZR, 1.5f); +    DrawSymbol(p, center + QPoint(-210, -120), Symbol::ZL, 1.5f); +    DrawSymbol(p, center + QPoint(210, -120), Symbol::ZR, 1.5f);      // Minus and Plus buttons      p.setPen(colors.outline); @@ -818,7 +818,7 @@ void PlayerControlPreview::DrawProController(QPainter& p, const QPointF center)      DrawSymbol(p, center + QPoint(29, -56), Symbol::House, 3.9f);      // Draw battery -    DrawBattery(p, center + QPoint(-30, -160), +    DrawBattery(p, center + QPoint(-20, -160),                  battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);  } @@ -875,7 +875,7 @@ void PlayerControlPreview::DrawGCController(QPainter& p, const QPointF center) {      DrawCircleButton(p, center + QPoint(0, -44), button_values[Plus], 8);      // Draw battery -    DrawBattery(p, center + QPoint(-30, -165), +    DrawBattery(p, center + QPoint(-20, 110),                  battery_values[Core::HID::EmulatedDeviceIndex::LeftIndex]);  } @@ -1030,6 +1030,10 @@ constexpr std::array<float, 30 * 2> symbol_c = {      -2.37f, 5.64f,  -0.65f, 6.44f,  1.25f,  6.47f,  3.06f,  5.89f,  4.63f,  4.92f,  4.63f,  6.83f,  }; +constexpr std::array<float, 6 * 2> symbol_charging = { +    6.5f, -1.0f, 1.0f, -1.0f, 1.0f, -3.0f, -6.5f, 1.0f, -1.0f, 1.0f, -1.0f, 3.0f, +}; +  constexpr std::array<float, 12 * 2> house = {      -1.3f, 0.0f,  -0.93f, 0.0f, -0.93f, 1.15f, 0.93f,  1.15f, 0.93f, 0.0f, 1.3f,  0.0f,      0.0f,  -1.2f, -1.3f,  0.0f, -0.43f, 0.0f,  -0.43f, .73f,  0.43f, .73f, 0.43f, 0.0f, @@ -2674,36 +2678,43 @@ void PlayerControlPreview::DrawBattery(QPainter& p, QPointF center,      if (battery == Common::Input::BatteryLevel::None) {          return;      } -    p.setPen(colors.outline); +    // Draw outline +    p.setPen(QPen(colors.button, 5)); +    p.setBrush(colors.transparent); +    p.drawRoundedRect(center.x(), center.y(), 34, 16, 2, 2); + +    p.setPen(QPen(colors.button, 3)); +    p.drawRect(center.x() + 35, center.y() + 4.5f, 4, 7); + +    // Draw Battery shape +    p.setPen(QPen(colors.indicator2, 3));      p.setBrush(colors.transparent); -    p.drawRect(center.x(), center.y(), 56, 20); -    p.drawRect(center.x() + 56, center.y() + 6, 3, 8); -    p.setBrush(colors.deadzone); +    p.drawRoundedRect(center.x(), center.y(), 34, 16, 2, 2); + +    p.setPen(QPen(colors.indicator2, 1)); +    p.setBrush(colors.indicator2); +    p.drawRect(center.x() + 35, center.y() + 4.5f, 4, 7);      switch (battery) {      case Common::Input::BatteryLevel::Charging: -        p.setBrush(colors.indicator2); -        p.drawText(center + QPoint(2, 14), tr("Charging")); +        p.drawRect(center.x(), center.y(), 34, 16); +        p.setPen(colors.slider); +        p.setBrush(colors.charging); +        DrawSymbol(p, center + QPointF(17.0f, 8.0f), Symbol::Charging, 2.1f);          break;      case Common::Input::BatteryLevel::Full: -        p.drawRect(center.x() + 42, center.y(), 14, 20); -        p.drawRect(center.x() + 28, center.y(), 14, 20); -        p.drawRect(center.x() + 14, center.y(), 14, 20); -        p.drawRect(center.x(), center.y(), 14, 20); +        p.drawRect(center.x(), center.y(), 34, 16);          break;      case Common::Input::BatteryLevel::Medium: -        p.drawRect(center.x() + 28, center.y(), 14, 20); -        p.drawRect(center.x() + 14, center.y(), 14, 20); -        p.drawRect(center.x(), center.y(), 14, 20); +        p.drawRect(center.x(), center.y(), 25, 16);          break;      case Common::Input::BatteryLevel::Low: -        p.drawRect(center.x() + 14, center.y(), 14, 20); -        p.drawRect(center.x(), center.y(), 14, 20); +        p.drawRect(center.x(), center.y(), 17, 16);          break;      case Common::Input::BatteryLevel::Critical: -        p.drawRect(center.x(), center.y(), 14, 20); +        p.drawRect(center.x(), center.y(), 6, 16);          break;      case Common::Input::BatteryLevel::Empty: -        p.drawRect(center.x(), center.y(), 5, 20); +        p.drawRect(center.x(), center.y(), 3, 16);          break;      default:          break; @@ -2724,6 +2735,7 @@ void PlayerControlPreview::DrawSymbol(QPainter& p, const QPointF center, Symbol      std::array<QPointF, symbol_sl.size() / 2> sl_icon;      std::array<QPointF, symbol_zr.size() / 2> zr_icon;      std::array<QPointF, symbol_sr.size() / 2> sr_icon; +    std::array<QPointF, symbol_charging.size() / 2> charging_icon;      switch (symbol) {      case Symbol::House:          for (std::size_t point = 0; point < house.size() / 2; ++point) { @@ -2809,6 +2821,13 @@ void PlayerControlPreview::DrawSymbol(QPainter& p, const QPointF center, Symbol          }          p.drawPolygon(sr_icon.data(), static_cast<int>(sr_icon.size()));          break; +    case Symbol::Charging: +        for (std::size_t point = 0; point < symbol_charging.size() / 2; ++point) { +            charging_icon[point] = center + QPointF(symbol_charging[point * 2] * icon_size, +                                                    symbol_charging[point * 2 + 1] * icon_size); +        } +        p.drawPolygon(charging_icon.data(), static_cast<int>(charging_icon.size())); +        break;      }  } diff --git a/src/yuzu/configuration/configure_input_player_widget.h b/src/yuzu/configuration/configure_input_player_widget.h index 4cd5c3be0..3582ef77a 100644 --- a/src/yuzu/configuration/configure_input_player_widget.h +++ b/src/yuzu/configuration/configure_input_player_widget.h @@ -72,6 +72,7 @@ private:          ZL,          ZR,          SR, +        Charging,      };      struct ColorMapping { @@ -94,6 +95,7 @@ private:          QColor slider_button{};          QColor slider_arrow{};          QColor deadzone{}; +        QColor charging{};      };      void UpdateColors(); diff --git a/src/yuzu/configuration/configure_vibration.cpp b/src/yuzu/configuration/configure_vibration.cpp index adce04b27..779b6401c 100644 --- a/src/yuzu/configuration/configure_vibration.cpp +++ b/src/yuzu/configuration/configure_vibration.cpp @@ -9,11 +9,14 @@  #include "common/param_package.h"  #include "common/settings.h" +#include "core/hid/emulated_controller.h" +#include "core/hid/hid_core.h" +#include "core/hid/hid_types.h"  #include "ui_configure_vibration.h"  #include "yuzu/configuration/configure_vibration.h" -ConfigureVibration::ConfigureVibration(QWidget* parent) -    : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()) { +ConfigureVibration::ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_) +    : QDialog(parent), ui(std::make_unique<Ui::ConfigureVibration>()), hid_core{hid_core_} {      ui->setupUi(this);      vibration_groupboxes = { @@ -31,6 +34,13 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)      const auto& players = Settings::values.players.GetValue();      for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { +        auto controller = hid_core.GetEmulatedControllerByIndex(i); +        Core::HID::ControllerUpdateCallback engine_callback{ +            .on_change = [this, +                          i](Core::HID::ControllerTriggerType type) { VibrateController(type, i); }, +            .is_npad_service = false, +        }; +        controller_callback_key[i] = controller->SetCallback(engine_callback);          vibration_groupboxes[i]->setChecked(players[i].vibration_enabled);          vibration_spinboxes[i]->setValue(players[i].vibration_strength);      } @@ -45,7 +55,14 @@ ConfigureVibration::ConfigureVibration(QWidget* parent)      RetranslateUI();  } -ConfigureVibration::~ConfigureVibration() = default; +ConfigureVibration::~ConfigureVibration() { +    StopVibrations(); + +    for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { +        auto controller = hid_core.GetEmulatedControllerByIndex(i); +        controller->DeleteCallback(controller_callback_key[i]); +    } +};  void ConfigureVibration::ApplyConfiguration() {      auto& players = Settings::values.players.GetValue(); @@ -70,3 +87,54 @@ void ConfigureVibration::changeEvent(QEvent* event) {  void ConfigureVibration::RetranslateUI() {      ui->retranslateUi(this);  } + +void ConfigureVibration::VibrateController(Core::HID::ControllerTriggerType type, +                                           std::size_t player_index) { +    if (type != Core::HID::ControllerTriggerType::Button) { +        return; +    } + +    auto& player = Settings::values.players.GetValue()[player_index]; +    auto controller = hid_core.GetEmulatedControllerByIndex(player_index); +    const int vibration_strenght = vibration_spinboxes[player_index]->value(); +    const auto& buttons = controller->GetButtonsValues(); + +    bool button_is_pressed = false; +    for (std::size_t i = 0; i < buttons.size(); ++i) { +        if (buttons[i].value) { +            button_is_pressed = true; +            break; +        } +    } + +    if (!button_is_pressed) { +        StopVibrations(); +        return; +    } + +    const int old_vibration_enabled = player.vibration_enabled; +    const bool old_vibration_strenght = player.vibration_strength; +    player.vibration_enabled = true; +    player.vibration_strength = vibration_strenght; + +    const Core::HID::VibrationValue vibration{ +        .low_amplitude = 1.0f, +        .low_frequency = 160.0f, +        .high_amplitude = 1.0f, +        .high_frequency = 320.0f, +    }; +    controller->SetVibration(0, vibration); +    controller->SetVibration(1, vibration); + +    // Restore previous values +    player.vibration_enabled = old_vibration_enabled; +    player.vibration_strength = old_vibration_strenght; +} + +void ConfigureVibration::StopVibrations() { +    for (std::size_t i = 0; i < NUM_PLAYERS; ++i) { +        auto controller = hid_core.GetEmulatedControllerByIndex(i); +        controller->SetVibration(0, Core::HID::DEFAULT_VIBRATION_VALUE); +        controller->SetVibration(1, Core::HID::DEFAULT_VIBRATION_VALUE); +    } +} diff --git a/src/yuzu/configuration/configure_vibration.h b/src/yuzu/configuration/configure_vibration.h index 37bbc2653..50b8195fa 100644 --- a/src/yuzu/configuration/configure_vibration.h +++ b/src/yuzu/configuration/configure_vibration.h @@ -15,11 +15,16 @@ namespace Ui {  class ConfigureVibration;  } +namespace Core::HID { +enum class ControllerTriggerType; +class HIDCore; +} // namespace Core::HID +  class ConfigureVibration : public QDialog {      Q_OBJECT  public: -    explicit ConfigureVibration(QWidget* parent); +    explicit ConfigureVibration(QWidget* parent, Core::HID::HIDCore& hid_core_);      ~ConfigureVibration() override;      void ApplyConfiguration(); @@ -27,14 +32,21 @@ public:  private:      void changeEvent(QEvent* event) override;      void RetranslateUI(); +    void VibrateController(Core::HID::ControllerTriggerType type, std::size_t player_index); +    void StopVibrations();      std::unique_ptr<Ui::ConfigureVibration> ui;      static constexpr std::size_t NUM_PLAYERS = 8; -    // Groupboxes encapsulating the vibration strength spinbox. +    /// Groupboxes encapsulating the vibration strength spinbox.      std::array<QGroupBox*, NUM_PLAYERS> vibration_groupboxes; -    // Spinboxes representing the vibration strength percentage. +    /// Spinboxes representing the vibration strength percentage.      std::array<QSpinBox*, NUM_PLAYERS> vibration_spinboxes; + +    /// Callback index to stop the controllers events +    std::array<int, NUM_PLAYERS> controller_callback_key; + +    Core::HID::HIDCore& hid_core;  }; diff --git a/src/yuzu/configuration/configure_vibration.ui b/src/yuzu/configuration/configure_vibration.ui index efdf317a9..447a18eb1 100644 --- a/src/yuzu/configuration/configure_vibration.ui +++ b/src/yuzu/configuration/configure_vibration.ui @@ -17,6 +17,13 @@     <string notr="true"/>    </property>    <layout class="QVBoxLayout"> +   <item row="0" column="0" colspan="4"> +    <widget class="QLabel" name="label_1"> +     <property name="text"> +      <string>Press any controller button to vibrate the controller.</string> +     </property> +    </widget> +   </item>     <item>      <widget class="QGroupBox" name="vibrationStrengthGroup">       <property name="title"> | 
