diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index a105d7d29e..95e00a1d0a 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -105,6 +105,12 @@ long PadHandlerBase::FindKeyCodeByString(const std::unordered_map& map, const std::string& name, bool fallback = true); + // Get new multiplied value based on the multiplier + static s32 MultipliedInput(s32 raw_value, s32 multiplier); + // Get new scaled value between 0 and 255 based on its minimum and maximum static float ScaledInput(s32 raw_value, int minimum, int maximum); diff --git a/rpcs3/Input/keyboard_pad_handler.cpp b/rpcs3/Input/keyboard_pad_handler.cpp index 427d097562..cece412837 100644 --- a/rpcs3/Input/keyboard_pad_handler.cpp +++ b/rpcs3/Input/keyboard_pad_handler.cpp @@ -138,6 +138,18 @@ void keyboard_pad_handler::Key(const u32 code, bool pressed, u16 value) const bool is_max = pad.m_sticks[i].m_keyCodeMax == code; const bool is_min = pad.m_sticks[i].m_keyCodeMin == code; + if (!is_max && !is_min) + { + continue; + } + + const bool is_left_stick = i < 2; + + if (pressed) + { + value = MultipliedInput(value, is_left_stick ? m_l_stick_multiplier : m_r_stick_multiplier); + } + const u16 normalized_value = std::max(1, static_cast(std::floor(value / 2.0))); if (is_max) @@ -146,17 +158,14 @@ void keyboard_pad_handler::Key(const u32 code, bool pressed, u16 value) if (is_min) m_stick_min[i] = pressed ? normalized_value : 0; - if (is_max || is_min) + m_stick_val[i] = m_stick_max[i] - m_stick_min[i]; + + const f32 stick_lerp_factor = is_left_stick ? m_l_stick_lerp_factor : m_r_stick_lerp_factor; + + // to get the fastest response time possible we don't wanna use any lerp with factor 1 + if (stick_lerp_factor >= 1.0f) { - m_stick_val[i] = m_stick_max[i] - m_stick_min[i]; - - const f32 stick_lerp_factor = (i < 2) ? m_l_stick_lerp_factor : m_r_stick_lerp_factor; - - // to get the fastest response time possible we don't wanna use any lerp with factor 1 - if (stick_lerp_factor >= 1.0f) - { - pad.m_sticks[i].m_value = m_stick_val[i]; - } + pad.m_sticks[i].m_value = m_stick_val[i]; } } } @@ -735,6 +744,8 @@ bool keyboard_pad_handler::bindPadToDevice(std::shared_ptr pad, const std:: m_r_stick_lerp_factor = cfg->r_stick_lerp_factor / 100.0f; m_analog_lerp_factor = cfg->analog_lerp_factor / 100.0f; m_trigger_lerp_factor = cfg->trigger_lerp_factor / 100.0f; + m_l_stick_multiplier = cfg->lstickmultiplier; + m_r_stick_multiplier = cfg->rstickmultiplier; const auto find_key = [this](const cfg::string& name) { diff --git a/rpcs3/Input/keyboard_pad_handler.h b/rpcs3/Input/keyboard_pad_handler.h index 247615071f..10c81db41b 100644 --- a/rpcs3/Input/keyboard_pad_handler.h +++ b/rpcs3/Input/keyboard_pad_handler.h @@ -121,6 +121,8 @@ private: steady_clock::time_point m_stick_time; f32 m_l_stick_lerp_factor = 1.0f; f32 m_r_stick_lerp_factor = 1.0f; + u32 m_l_stick_multiplier = 100; + u32 m_r_stick_multiplier = 100; u8 m_stick_min[4] = { 0, 0, 0, 0 }; u8 m_stick_max[4] = { 128, 128, 128, 128 }; u8 m_stick_val[4] = { 128, 128, 128, 128 }; diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.cpp b/rpcs3/rpcs3qt/pad_settings_dialog.cpp index 465b217061..6c147d2754 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.cpp +++ b/rpcs3/rpcs3qt/pad_settings_dialog.cpp @@ -975,10 +975,14 @@ void pad_settings_dialog::UpdateLabels(bool is_reset) range = cfg.lstickmultiplier.to_list(); ui->stick_multi_left->setRange(std::stod(range.front()) / 100.0, std::stod(range.back()) / 100.0); ui->stick_multi_left->setValue(cfg.lstickmultiplier / 100.0); + ui->kb_stick_multi_left->setRange(std::stod(range.front()) / 100.0, std::stod(range.back()) / 100.0); + ui->kb_stick_multi_left->setValue(cfg.lstickmultiplier / 100.0); range = cfg.rstickmultiplier.to_list(); ui->stick_multi_right->setRange(std::stod(range.front()) / 100.0, std::stod(range.back()) / 100.0); ui->stick_multi_right->setValue(cfg.rstickmultiplier / 100.0); + ui->kb_stick_multi_right->setRange(std::stod(range.front()) / 100.0, std::stod(range.back()) / 100.0); + ui->kb_stick_multi_right->setValue(cfg.rstickmultiplier / 100.0); // Update Squircle Factors range = cfg.lpadsquircling.to_list(); @@ -1026,6 +1030,8 @@ void pad_settings_dialog::SwitchButtons(bool is_enabled) ui->chb_show_emulated_values->setEnabled(is_enabled); ui->stick_multi_left->setEnabled(is_enabled); ui->stick_multi_right->setEnabled(is_enabled); + ui->kb_stick_multi_left->setEnabled(is_enabled); + ui->kb_stick_multi_right->setEnabled(is_enabled); ui->squircle_left->setEnabled(is_enabled); ui->squircle_right->setEnabled(is_enabled); ui->gb_pressure_intensity->setEnabled(is_enabled && m_enable_pressure_intensity_button); @@ -1563,8 +1569,17 @@ void pad_settings_dialog::ApplyCurrentPlayerConfig(int new_player_id) // Apply rest of config auto& cfg = player->config; - cfg.lstickmultiplier.set(ui->stick_multi_left->value() * 100); - cfg.rstickmultiplier.set(ui->stick_multi_right->value() * 100); + if (m_handler->m_type == pad_handler::keyboard) + { + cfg.lstickmultiplier.set(ui->kb_stick_multi_left->value() * 100); + cfg.rstickmultiplier.set(ui->kb_stick_multi_right->value() * 100); + } + else + { + cfg.lstickmultiplier.set(ui->stick_multi_left->value() * 100); + cfg.rstickmultiplier.set(ui->stick_multi_right->value() * 100); + } + cfg.lpadsquircling.set(ui->squircle_left->value()); cfg.rpadsquircling.set(ui->squircle_right->value()); @@ -1727,6 +1742,7 @@ void pad_settings_dialog::SubscribeTooltips() SubscribeTooltip(ui->gb_pressure_intensity, tooltips.gamepad_settings.pressure_intensity); SubscribeTooltip(ui->gb_squircle, tooltips.gamepad_settings.squircle_factor); SubscribeTooltip(ui->gb_stick_multi, tooltips.gamepad_settings.stick_multiplier); + SubscribeTooltip(ui->gb_kb_stick_multi, tooltips.gamepad_settings.stick_multiplier); SubscribeTooltip(ui->gb_vibration, tooltips.gamepad_settings.vibration); SubscribeTooltip(ui->gb_sticks, tooltips.gamepad_settings.stick_deadzones); SubscribeTooltip(ui->gb_stick_preview, tooltips.gamepad_settings.emulated_preview); diff --git a/rpcs3/rpcs3qt/pad_settings_dialog.ui b/rpcs3/rpcs3qt/pad_settings_dialog.ui index 75bc591e78..3f9f862411 100644 --- a/rpcs3/rpcs3qt/pad_settings_dialog.ui +++ b/rpcs3/rpcs3qt/pad_settings_dialog.ui @@ -2369,8 +2369,8 @@ - - + + 0 @@ -2383,6 +2383,81 @@ 0 + + + + Stick Multipliers + + + + 5 + + + 5 + + + 5 + + + 5 + + + + + Left + + + + + + + 0.100000000000000 + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + + Right + + + + + + + 0.100000000000000 + + + + + + + Qt::Horizontal + + + + 0 + 0 + + + + + + + @@ -2465,7 +2540,7 @@ - + Qt::Vertical