diff --git a/libraries/controllers/src/controllers/ScriptingInterface.cpp b/libraries/controllers/src/controllers/ScriptingInterface.cpp index 78e9378c18..d32acb3d82 100644 --- a/libraries/controllers/src/controllers/ScriptingInterface.cpp +++ b/libraries/controllers/src/controllers/ScriptingInterface.cpp @@ -95,6 +95,11 @@ namespace controller { return getValue(Input(device, source, ChannelType::BUTTON).getID()); } + float ScriptingInterface::getAxisValue(int source) const { + auto userInputMapper = DependencyManager::get(); + return userInputMapper->getValue(Input((uint32_t)source)); + } + float ScriptingInterface::getAxisValue(StandardAxisChannel source, uint16_t device) const { return getValue(Input(device, source, ChannelType::AXIS).getID()); } diff --git a/libraries/controllers/src/controllers/ScriptingInterface.h b/libraries/controllers/src/controllers/ScriptingInterface.h index 713e864561..b47a6fea31 100644 --- a/libraries/controllers/src/controllers/ScriptingInterface.h +++ b/libraries/controllers/src/controllers/ScriptingInterface.h @@ -81,6 +81,7 @@ namespace controller { Q_INVOKABLE float getValue(const int& source) const; Q_INVOKABLE float getButtonValue(StandardButtonChannel source, uint16_t device = 0) const; Q_INVOKABLE float getAxisValue(StandardAxisChannel source, uint16_t device = 0) const; + Q_INVOKABLE float getAxisValue(int source) const; Q_INVOKABLE Pose getPoseValue(const int& source) const; Q_INVOKABLE Pose getPoseValue(StandardPoseChannel source, uint16_t device = 0) const; diff --git a/libraries/controllers/src/controllers/impl/endpoints/AnyEndpoint.cpp b/libraries/controllers/src/controllers/impl/endpoints/AnyEndpoint.cpp index a3b719b2c1..598dfb6ee8 100644 --- a/libraries/controllers/src/controllers/impl/endpoints/AnyEndpoint.cpp +++ b/libraries/controllers/src/controllers/impl/endpoints/AnyEndpoint.cpp @@ -27,19 +27,27 @@ AnyEndpoint::AnyEndpoint(Endpoint::List children) : Endpoint(Input::INVALID_INPU } } +// The value of an any-point is considered to be the maxiumum absolute value, +// this handles any's of multiple axis values as well as single values as well float AnyEndpoint::peek() const { - float result = 0; + float result = 0.0f; for (auto& child : _children) { - result = std::max(result, child->peek()); + auto childValue = child->peek(); + if (std::abs(childValue) > std::abs(result)) { + result = childValue; + } } return result; } // Fetching the value must trigger any necessary side effects of value() on ALL the children. float AnyEndpoint::value() { - float result = 0; + float result = 0.0f; for (auto& child : _children) { - result = std::max(result, child->value()); + auto childValue = child->value(); + if (std::abs(childValue) > std::abs(result)) { + result = childValue; + } } return result; }