summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerEmu
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2022-01-04 14:09:50 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2022-01-04 14:09:50 -0600
commit78a9bdf04a5745472b4ea86962cfb75170c1c7ee (patch)
treeecc16e661a82ab71b363b1a57735dcc23f1ed9fd /Source/Core/InputCommon/ControllerEmu
parent953eb49cd8f52495b0cde80487f19c0dc279ca25 (diff)
InputCommon: Use value of "Modifier" button "Range" setting rather than always applying 50%.
Make "Clear" button reset "Modifier" "Range" settings to 50%.
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu')
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp9
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.h2
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp9
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.h2
-rw-r--r--Source/Core/InputCommon/ControllerEmu/StickGate.cpp20
-rw-r--r--Source/Core/InputCommon/ControllerEmu/StickGate.h2
6 files changed, 33 insertions, 11 deletions
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<StickGate> 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<double> m_max_angle_setting;
SettingValue<double> 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;