summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerEmu/ControlGroup
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2018-12-29 13:56:35 -0600
committerJordan Woyak <jordan.woyak@gmail.com>2018-12-29 13:56:35 -0600
commit6a6195f53c0a369782599b56cdbcc803bcb4203e (patch)
treee0dfb4dbe70c100627665823f27abb38d04a58ef /Source/Core/InputCommon/ControllerEmu/ControlGroup
parentdef5c6e5736d24ca48ee8b4a2b104fa55cec6166 (diff)
ControllerEmu: Implement dead zone setting for triggers.
Diffstat (limited to 'Source/Core/InputCommon/ControllerEmu/ControlGroup')
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp51
-rw-r--r--Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.h11
2 files changed, 51 insertions, 11 deletions
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp b/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp
index 8f26fde6fc..4928127604 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.cpp
@@ -4,6 +4,7 @@
#include "InputCommon/ControllerEmu/ControlGroup/MixedTriggers.h"
+#include <algorithm>
#include <cstddef>
#include <memory>
#include <string>
@@ -21,23 +22,53 @@ MixedTriggers::MixedTriggers(const std::string& name_)
: ControlGroup(name_, GroupType::MixedTriggers)
{
numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Threshold"), 0.9));
+ numeric_settings.emplace_back(std::make_unique<NumericSetting>(_trans("Dead Zone"), 0.0, 0, 25));
}
-void MixedTriggers::GetState(u16* const digital, const u16* bitmasks, ControlState* analog)
+void MixedTriggers::GetState(u16* const digital, const u16* bitmasks, ControlState* analog,
+ bool adjusted)
{
- const size_t trigger_count = controls.size() / 2;
+ const ControlState threshold = numeric_settings[SETTING_THRESHOLD]->GetValue();
+ ControlState deadzone = numeric_settings[SETTING_DEADZONE]->GetValue();
- for (size_t i = 0; i < trigger_count; ++i, ++bitmasks, ++analog)
+ // Return raw values. (used in UI)
+ if (!adjusted)
{
- if (controls[i]->control_ref->State() > numeric_settings[0]->GetValue()) // threshold
- {
- *analog = 1.0;
- *digital |= *bitmasks;
- }
- else
+ deadzone = 0.0;
+ }
+
+ const int trigger_count = int(controls.size() / 2);
+ for (int i = 0; i != trigger_count; ++i)
+ {
+ ControlState button_value = controls[i]->control_ref->State();
+ ControlState analog_value = controls[trigger_count + i]->control_ref->State();
+
+ // Apply deadzone:
+ analog_value = std::max(0.0, analog_value - deadzone) / (1.0 - deadzone);
+ button_value = std::max(0.0, button_value - deadzone) / (1.0 - deadzone);
+
+ // Apply threshold:
+ if (button_value > threshold)
{
- *analog = controls[i + trigger_count]->control_ref->State();
+ // Fully activate analog:
+ analog_value = 1.0;
+
+ // Activate button:
+ *digital |= bitmasks[i];
}
+
+ analog[i] = analog_value;
}
}
+
+ControlState MixedTriggers::GetDeadzone() const
+{
+ return numeric_settings[SETTING_DEADZONE]->GetValue();
+}
+
+ControlState MixedTriggers::GetThreshold() const
+{
+ return numeric_settings[SETTING_THRESHOLD]->GetValue();
+}
+
} // namespace ControllerEmu
diff --git a/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.h b/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.h
index cf85ffdc52..1733394223 100644
--- a/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.h
+++ b/Source/Core/InputCommon/ControllerEmu/ControlGroup/MixedTriggers.h
@@ -13,8 +13,17 @@ namespace ControllerEmu
class MixedTriggers : public ControlGroup
{
public:
+ enum
+ {
+ SETTING_THRESHOLD,
+ SETTING_DEADZONE,
+ };
+
explicit MixedTriggers(const std::string& name);
- void GetState(u16* digital, const u16* bitmasks, ControlState* analog);
+ void GetState(u16* digital, const u16* bitmasks, ControlState* analog, bool adjusted = true);
+
+ ControlState GetDeadzone() const;
+ ControlState GetThreshold() const;
};
} // namespace ControllerEmu