Skip to content

Commit

Permalink
InputCommon: Use value of "Modifier" button "Range" setting rather th…
Browse files Browse the repository at this point in the history
…an always applying 50%.

Make "Clear" button reset "Modifier" "Range" settings to 50%.
  • Loading branch information
jordan-woyak committed Jan 4, 2022
1 parent 953eb49 commit 78a9bdf
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 15 deletions.
4 changes: 0 additions & 4 deletions Source/Core/Core/HW/GCPadEmu.cpp
Expand Up @@ -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
Expand Down
Expand Up @@ -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
Expand All @@ -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)
{
Expand Down
Expand Up @@ -23,6 +23,8 @@ class AnalogStick : public ReshapableInput
StateData GetState() const;

private:
Control* GetModifierInput() const override;

std::unique_ptr<StickGate> m_stick_gate;
};

Expand Down
9 changes: 6 additions & 3 deletions Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp
Expand Up @@ -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
Expand All @@ -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
2 changes: 2 additions & 0 deletions Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.h
Expand Up @@ -31,6 +31,8 @@ class Tilt : public ReshapableInput
ControlState GetMaxRotationalVelocity() const;

private:
Control* GetModifierInput() const override;

SettingValue<double> m_max_angle_setting;
SettingValue<double> m_max_rotational_velocity;
};
Expand Down
20 changes: 15 additions & 5 deletions Source/Core/InputCommon/ControllerEmu/StickGate.cpp
Expand Up @@ -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, ' ');
Expand Down Expand Up @@ -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:
Expand All @@ -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
2 changes: 2 additions & 0 deletions Source/Core/InputCommon/ControllerEmu/StickGate.h
Expand Up @@ -110,6 +110,8 @@ class ReshapableInput : public ControlGroup
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;
Expand Down

0 comments on commit 78a9bdf

Please sign in to comment.