diff --git a/Source/Core/Core/HW/GCPadEmu.cpp b/Source/Core/Core/HW/GCPadEmu.cpp index c2f2108edc..1b53b8124c 100644 --- a/Source/Core/Core/HW/GCPadEmu.cpp +++ b/Source/Core/Core/HW/GCPadEmu.cpp @@ -261,5 +261,5 @@ void GCPad::LoadDefaults(const ControllerInterface& ciface) bool GCPad::GetMicButton() const { const auto lock = GetStateLock(); - return (0.0f != m_mic->controls.back()->control_ref->State()); + return m_mic->controls.back()->GetState(); } diff --git a/Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp b/Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp index dbecadb1d8..9c4fdb0d8f 100644 --- a/Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp +++ b/Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp @@ -330,7 +330,7 @@ void EmulateIMUCursor(IMUCursorState* state, ControllerEmu::IMUCursor* imu_ir_gr auto target_yaw = std::clamp(yaw, -max_yaw, max_yaw); // Handle the "Recenter" button being pressed. - if (imu_ir_group->controls[0]->control_ref->GetState()) + if (imu_ir_group->controls[0]->GetState()) { state->recentered_pitch = std::asin((inv_rotation * Common::Vec3{0, 1, 0}).z); target_yaw = 0; diff --git a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h index 0a5ea3c040..df0cd05878 100644 --- a/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h +++ b/Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.h @@ -145,8 +145,6 @@ private: // This is the region exposed over bluetooth: static constexpr int EEPROM_FREE_SIZE = 0x1700; - static constexpr double BUTTON_THRESHOLD = 0.5; - void UpdateButtonsStatus(); // Returns simulated accelerometer data in m/s^2. diff --git a/Source/Core/InputCommon/ControlReference/ControlReference.h b/Source/Core/InputCommon/ControlReference/ControlReference.h index 80c4a65d51..de289ba265 100644 --- a/Source/Core/InputCommon/ControlReference/ControlReference.h +++ b/Source/Core/InputCommon/ControlReference/ControlReference.h @@ -4,10 +4,10 @@ #pragma once +#include #include #include "InputCommon/ControlReference/ExpressionParser.h" -#include "InputCommon/ControlReference/FunctionExpression.h" #include "InputCommon/ControllerInterface/Device.h" // ControlReference @@ -52,11 +52,18 @@ protected: template <> inline bool ControlReference::GetState() { - return State() > ciface::ExpressionParser::CONDITION_THRESHOLD; + // Round to nearest of 0 or 1. + return std::lround(State()) > 0; } -template -T ControlReference::GetState() +template <> +inline int ControlReference::GetState() +{ + return std::lround(State()); +} + +template <> +inline ControlState ControlReference::GetState() { return State(); } diff --git a/Source/Core/InputCommon/ControllerEmu/Control/Control.h b/Source/Core/InputCommon/ControllerEmu/Control/Control.h index e005431873..18aa529a6c 100644 --- a/Source/Core/InputCommon/ControllerEmu/Control/Control.h +++ b/Source/Core/InputCommon/ControllerEmu/Control/Control.h @@ -7,7 +7,7 @@ #include #include -class ControlReference; +#include "InputCommon/ControlReference/ControlReference.h" namespace ControllerEmu { @@ -22,6 +22,12 @@ class Control public: virtual ~Control(); + template + T GetState() + { + return control_ref->GetState(); + } + std::unique_ptr const control_ref; const Translatability translate; const std::string name; @@ -33,4 +39,5 @@ protected: Control(std::unique_ptr ref, Translatability translate, const std::string& name); }; + } // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp index 45d178ed17..df67930f9d 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/AnalogStick.cpp @@ -34,14 +34,14 @@ AnalogStick::AnalogStick(const char* const name_, const char* const ui_name_, AnalogStick::ReshapeData AnalogStick::GetReshapableState(bool adjusted) { - const ControlState y = controls[0]->control_ref->State() - controls[1]->control_ref->State(); - const ControlState x = controls[3]->control_ref->State() - controls[2]->control_ref->State(); + const ControlState y = controls[0]->GetState() - controls[1]->GetState(); + const ControlState x = controls[3]->GetState() - controls[2]->GetState(); // Return raw values. (used in UI) if (!adjusted) return {x, y}; - const ControlState modifier = controls[4]->control_ref->State(); + const ControlState modifier = controls[4]->GetState(); return Reshape(x, y, modifier); } diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h index 9560a37843..b10677a615 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Buttons.h @@ -23,12 +23,7 @@ public: void GetState(C* const buttons, const C* bitmasks) { for (auto& control : controls) - { - if (control->control_ref->GetState()) - *buttons |= *bitmasks; - - bitmasks++; - } + *buttons |= *(bitmasks++) * control->GetState(); } }; } // namespace ControllerEmu diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.cpp index 93a6f4391a..bee3be80fe 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.cpp @@ -67,8 +67,8 @@ Cursor::Cursor(std::string name, std::string ui_name) Cursor::ReshapeData Cursor::GetReshapableState(bool adjusted) { - const ControlState y = controls[0]->control_ref->State() - controls[1]->control_ref->State(); - const ControlState x = controls[3]->control_ref->State() - controls[2]->control_ref->State(); + const ControlState y = controls[0]->GetState() - controls[1]->GetState(); + const ControlState x = controls[3]->GetState() - controls[2]->GetState(); // Return raw values. (used in UI) if (!adjusted) @@ -103,10 +103,10 @@ Cursor::StateData Cursor::GetState(const bool adjusted) const double max_step = STEP_PER_SEC / 1000.0 * ms_since_update; // Relative input: - if (m_relative_setting.GetValue() ^ (controls[6]->control_ref->State() > BUTTON_THRESHOLD)) + if (m_relative_setting.GetValue() ^ (controls[6]->GetState())) { // Recenter: - if (controls[5]->control_ref->State() > BUTTON_THRESHOLD) + if (controls[5]->GetState()) { m_state.x = 0.0; m_state.y = 0.0; @@ -143,7 +143,7 @@ Cursor::StateData Cursor::GetState(const bool adjusted) m_prev_result = result; // If auto-hide time is up or hide button is held: - if (!m_auto_hide_timer || controls[4]->control_ref->State() > BUTTON_THRESHOLD) + if (!m_auto_hide_timer || controls[4]->GetState()) { result.x = std::numeric_limits::quiet_NaN(); result.y = 0; diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.h index 7c72120dba..a5a6a95cd0 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.h +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Cursor.h @@ -47,8 +47,6 @@ private: static constexpr int AUTO_HIDE_MS = 2500; static constexpr double AUTO_HIDE_DEADZONE = 0.001; - static constexpr double BUTTON_THRESHOLD = 0.5; - // Not adjusted by width/height/center: StateData m_state; diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Force.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Force.cpp index 7ddbeba335..f4bc62361a 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Force.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Force.cpp @@ -67,8 +67,8 @@ Force::Force(const std::string& name_) : ReshapableInput(name_, name_, GroupType Force::ReshapeData Force::GetReshapableState(bool adjusted) { - const ControlState y = controls[0]->control_ref->State() - controls[1]->control_ref->State(); - const ControlState x = controls[3]->control_ref->State() - controls[2]->control_ref->State(); + const ControlState y = controls[0]->GetState() - controls[1]->GetState(); + const ControlState x = controls[3]->GetState() - controls[2]->GetState(); // Return raw values. (used in UI) if (!adjusted) @@ -80,7 +80,7 @@ Force::ReshapeData Force::GetReshapableState(bool adjusted) Force::StateData Force::GetState(bool adjusted) { const auto state = GetReshapableState(adjusted); - ControlState z = controls[4]->control_ref->State() - controls[5]->control_ref->State(); + ControlState z = controls[4]->GetState() - controls[5]->GetState(); if (adjusted) { @@ -159,9 +159,9 @@ Shake::Shake(const std::string& name_, ControlState default_intensity_scale) Shake::StateData Shake::GetState(bool adjusted) const { - const float x = controls[0]->control_ref->State(); - const float y = controls[1]->control_ref->State(); - const float z = controls[2]->control_ref->State(); + const float x = controls[0]->GetState(); + const float y = controls[1]->GetState(); + const float z = controls[2]->GetState(); StateData result = {x, y, z}; diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp index 9b680af20f..0a866db220 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUAccelerometer.cpp @@ -31,9 +31,9 @@ std::optional IMUAccelerometer::GetState() const return std::nullopt; StateData state; - state.x = (controls[2]->control_ref->State() - controls[3]->control_ref->State()); - state.y = (controls[5]->control_ref->State() - controls[4]->control_ref->State()); - state.z = (controls[0]->control_ref->State() - controls[1]->control_ref->State()); + state.x = (controls[2]->GetState() - controls[3]->GetState()); + state.y = (controls[5]->GetState() - controls[4]->GetState()); + state.z = (controls[0]->GetState() - controls[1]->GetState()); return state; } diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp index 922f7a0d43..049114e1d0 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/IMUGyroscope.cpp @@ -31,9 +31,9 @@ std::optional IMUGyroscope::GetState() const return std::nullopt; StateData state; - state.x = (controls[1]->control_ref->State() - controls[0]->control_ref->State()); - state.y = (controls[2]->control_ref->State() - controls[3]->control_ref->State()); - state.z = (controls[4]->control_ref->State() - controls[5]->control_ref->State()); + state.x = (controls[1]->GetState() - controls[0]->GetState()); + state.y = (controls[2]->GetState() - controls[3]->GetState()); + state.z = (controls[4]->GetState() - controls[5]->GetState()); return state; } diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp index 4cd8df7874..50a787b41d 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp @@ -46,9 +46,9 @@ void MixedTriggers::GetState(u16* const digital, const u16* bitmasks, ControlSta const int trigger_count = int(controls.size() / 2); for (int i = 0; i != trigger_count; ++i) { - const ControlState button_value = ApplyDeadzone(controls[i]->control_ref->State(), deadzone); + const ControlState button_value = ApplyDeadzone(controls[i]->GetState(), deadzone); ControlState analog_value = - std::min(ApplyDeadzone(controls[trigger_count + i]->control_ref->State(), deadzone), 1.0); + std::min(ApplyDeadzone(controls[trigger_count + i]->GetState(), deadzone), 1.0); // Apply threshold: if (button_value > threshold) diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp index a902034795..b6f9c5c55e 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/ModifySettingsButton.cpp @@ -35,7 +35,7 @@ void ModifySettingsButton::GetState() { for (size_t i = 0; i < controls.size(); ++i) { - const bool state = controls[i]->control_ref->GetState(); + const bool state = controls[i]->GetState(); if (!associated_settings_toggle[i]) { diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.cpp index 0b702b6657..912f18b1a6 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Slider.cpp @@ -32,7 +32,7 @@ Slider::Slider(const std::string& name_) : Slider(name_, name_) Slider::StateData Slider::GetState() { const ControlState deadzone = m_deadzone_setting.GetValue() / 100; - const ControlState state = controls[1]->control_ref->State() - controls[0]->control_ref->State(); + const ControlState state = controls[1]->GetState() - controls[0]->GetState(); return {std::clamp(ApplyDeadzone(state, deadzone), -1.0, 1.0)}; } diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp index 07c8972b54..81fa31c1a3 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Tilt.cpp @@ -44,14 +44,14 @@ Tilt::Tilt(const std::string& name_) : ReshapableInput(name_, name_, GroupType:: Tilt::ReshapeData Tilt::GetReshapableState(bool adjusted) { - const ControlState y = controls[0]->control_ref->State() - controls[1]->control_ref->State(); - const ControlState x = controls[3]->control_ref->State() - controls[2]->control_ref->State(); + const ControlState y = controls[0]->GetState() - controls[1]->GetState(); + const ControlState x = controls[3]->GetState() - controls[2]->GetState(); // Return raw values. (used in UI) if (!adjusted) return {x, y}; - const ControlState modifier = controls[4]->control_ref->State(); + const ControlState modifier = controls[4]->GetState(); return Reshape(x, y, modifier); } diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Triggers.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Triggers.cpp index abc74915e5..bdfec69808 100644 --- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/Triggers.cpp +++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/Triggers.cpp @@ -28,7 +28,7 @@ Triggers::StateData Triggers::GetState() StateData result(trigger_count); for (size_t i = 0; i < trigger_count; ++i) - result.data[i] = std::min(ApplyDeadzone(controls[i]->control_ref->State(), deadzone), 1.0); + result.data[i] = std::min(ApplyDeadzone(controls[i]->GetState(), deadzone), 1.0); return result; }