diff --git a/Source/Core/Core/HW/GCPadEmu.cpp b/Source/Core/Core/HW/GCPadEmu.cpp index 0015686e43..13fb79e28a 100644 --- a/Source/Core/Core/HW/GCPadEmu.cpp +++ b/Source/Core/Core/HW/GCPadEmu.cpp @@ -198,10 +198,6 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) m_buttons->SetControlExpression(5, "`Return`"); #endif - // stick modifiers to 50 % - m_main_stick->controls[4]->control_ref->range = 0.5f; - m_c_stick->controls[4]->control_ref->range = 0.5f; - // D-Pad m_dpad->SetControlExpression(0, "`T`"); // Up m_dpad->SetControlExpression(1, "`G`"); // Down diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp index b4b1accc77..aaabfa5b17 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp @@ -40,9 +40,7 @@ AnalogStick::ReshapeData AnalogStick::GetReshapableState(bool adjusted) const if (!adjusted) return {x, y}; - const ControlState modifier = controls[4]->GetState(); - - return Reshape(x, y, modifier); + return Reshape(x, y, GetModifierInput()->GetState()); } AnalogStick::StateData AnalogStick::GetState() const @@ -55,6 +53,11 @@ ControlState AnalogStick::GetGateRadiusAtAngle(double ang) const return m_stick_gate->GetRadiusAtAngle(ang); } +Control* AnalogStick::GetModifierInput() const +{ + return controls[4].get(); +} + OctagonAnalogStick::OctagonAnalogStick(const char* name_, ControlState gate_radius) : OctagonAnalogStick(name_, name_, gate_radius) { diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.h index 5e95d12013..d5363cecef 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.h +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.h @@ -23,6 +23,8 @@ public: StateData GetState() const; private: + Control* GetModifierInput() const override; + std::unique_ptr m_stick_gate; }; diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp index cd6ee91cbc..69a3038b42 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp @@ -50,9 +50,7 @@ Tilt::ReshapeData Tilt::GetReshapableState(bool adjusted) const if (!adjusted) return {x, y}; - const ControlState modifier = controls[4]->GetState(); - - return Reshape(x, y, modifier); + return Reshape(x, y, GetModifierInput()->GetState()); } Tilt::StateData Tilt::GetState() const @@ -76,4 +74,9 @@ ControlState Tilt::GetMaxRotationalVelocity() const return m_max_rotational_velocity.GetValue() * MathUtil::TAU; } +Control* Tilt::GetModifierInput() const +{ + return controls[4].get(); +} + } // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.h index adc6fffdb8..b9de77d712 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.h +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.h @@ -31,6 +31,8 @@ public: ControlState GetMaxRotationalVelocity() const; private: + Control* GetModifierInput() const override; + SettingValue m_max_angle_setting; SettingValue m_max_rotational_velocity; }; diff --git a/Source/Core/InputCommon/ControllerEmu/StickGate.cpp b/Source/Core/InputCommon/ControllerEmu/StickGate.cpp index 5029fd7f1a..ce9259f06f 100644 --- a/Source/Core/InputCommon/ControllerEmu/StickGate.cpp +++ b/Source/Core/InputCommon/ControllerEmu/StickGate.cpp @@ -232,6 +232,15 @@ void ReshapableInput::LoadConfig(IniFile::Section* section, const std::string& d ControlGroup::LoadConfig(section, default_device, base_name); const std::string group(base_name + name + '/'); + + // Special handling for "Modifier" button "Range" settings which default to 50% instead of 100%. + if (const auto* modifier_input = GetModifierInput()) + { + section->Get(group + modifier_input->name + "/Range", &modifier_input->control_ref->range, + 50.0); + modifier_input->control_ref->range /= 100; + } + std::string load_str; section->Get(group + CALIBRATION_CONFIG_NAME, &load_str, ""); const auto load_data = SplitString(load_str, ' '); @@ -313,11 +322,7 @@ ReshapableInput::ReshapeData ReshapableInput::Reshape(ControlState x, ControlSta // This is affected by the modifier's "range" setting which defaults to 50%. if (modifier) { - // TODO: Modifier's range setting gets reset to 100% when the clear button is clicked. - // This causes the modifier to not behave how a user might suspect. - // Retaining the old scale-by-50% behavior until range is fixed to clear to 50%. - dist *= 0.5; - // dist *= modifier; + dist *= modifier; } // Apply deadzone as a percentage of the user-defined calibration shape/size: @@ -330,4 +335,9 @@ ReshapableInput::ReshapeData ReshapableInput::Reshape(ControlState x, ControlSta std::clamp(std::sin(angle) * dist, -clamp, clamp)}; } +Control* ReshapableInput::GetModifierInput() const +{ + return nullptr; +} + } // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/StickGate.h b/Source/Core/InputCommon/ControllerEmu/StickGate.h index 2b515ea71d..528aa4a5c8 100644 --- a/Source/Core/InputCommon/ControllerEmu/StickGate.h +++ b/Source/Core/InputCommon/ControllerEmu/StickGate.h @@ -110,6 +110,8 @@ protected: ReshapeData Reshape(ControlState x, ControlState y, ControlState modifier = 0.0, ControlState clamp = 1.0) const; + virtual Control* GetModifierInput() const; + private: void LoadConfig(IniFile::Section*, const std::string&, const std::string&) override; void SaveConfig(IniFile::Section*, const std::string&, const std::string&) override;