refactor conditions refactor code: - adds template for comparing view models - unifies evaluate method for view model and input conditions Diffs= 1131f30e6 refactor conditions (#7747) Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head index db3938f..2edbc19 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -35a52873cf0adabbda2670673762a36c91822e96 +1131f30e6a45bee5c0561de3a35b19985bf46820
diff --git a/include/rive/animation/state_machine_instance.hpp b/include/rive/animation/state_machine_instance.hpp index ce34a03..5921adf 100644 --- a/include/rive/animation/state_machine_instance.hpp +++ b/include/rive/animation/state_machine_instance.hpp
@@ -115,7 +115,7 @@ /// Allow anything referencing a concrete StateMachineInstace access to /// the backing artboard (explicitly not allowed on Scenes). - Artboard* artboard() { return m_artboardInstance; } + Artboard* artboard() const { return m_artboardInstance; } void setParentStateMachineInstance(StateMachineInstance* instance) { @@ -136,7 +136,7 @@ /// Gets a reported event at an index < reportedEventCount(). const EventReport reportedEventAt(std::size_t index) const; bool playsAudio() override { return true; } - BindableProperty* bindablePropertyInstance(BindableProperty* bindableProperty); + BindableProperty* bindablePropertyInstance(BindableProperty* bindableProperty) const; DataBind* bindableDataBind(BindableProperty* bindableProperty); #ifdef TESTING size_t hitComponentsCount() { return m_hitComponents.size(); };
diff --git a/include/rive/animation/transition_bool_condition.hpp b/include/rive/animation/transition_bool_condition.hpp index 3a41a16..fa5a03e 100644 --- a/include/rive/animation/transition_bool_condition.hpp +++ b/include/rive/animation/transition_bool_condition.hpp
@@ -7,7 +7,7 @@ class TransitionBoolCondition : public TransitionBoolConditionBase { public: - bool evaluate(const SMIInput* inputInstance) const override; + bool evaluate(const StateMachineInstance* stateMachineInstance) const override; protected: bool validateInputType(const StateMachineInput* input) const override;
diff --git a/include/rive/animation/transition_comparator.hpp b/include/rive/animation/transition_comparator.hpp index 5757ad2..38aab79 100644 --- a/include/rive/animation/transition_comparator.hpp +++ b/include/rive/animation/transition_comparator.hpp
@@ -14,7 +14,7 @@ StatusCode import(ImportStack& importStack) override; virtual bool compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance); + const StateMachineInstance* stateMachineInstance); protected: bool compareNumbers(float left, float right, TransitionConditionOp op);
diff --git a/include/rive/animation/transition_condition.hpp b/include/rive/animation/transition_condition.hpp index 5336f4d..9fc8db6 100644 --- a/include/rive/animation/transition_condition.hpp +++ b/include/rive/animation/transition_condition.hpp
@@ -1,6 +1,7 @@ #ifndef _RIVE_TRANSITION_CONDITION_HPP_ #define _RIVE_TRANSITION_CONDITION_HPP_ #include "rive/generated/animation/transition_condition_base.hpp" +#include "rive/animation/state_machine_instance.hpp" namespace rive { @@ -15,6 +16,8 @@ StatusCode import(ImportStack& importStack) override; + virtual bool evaluate(const StateMachineInstance* stateMachineInstance) const { return true; } + protected: virtual bool validateInputType(const StateMachineInput* input) const { return true; } };
diff --git a/include/rive/animation/transition_input_condition.hpp b/include/rive/animation/transition_input_condition.hpp index b6c6517..90ab05a 100644 --- a/include/rive/animation/transition_input_condition.hpp +++ b/include/rive/animation/transition_input_condition.hpp
@@ -7,8 +7,6 @@ class TransitionInputCondition : public TransitionInputConditionBase { public: - virtual bool evaluate(const SMIInput* inputInstance) const { return true; } - StatusCode import(ImportStack& importStack) override; }; } // namespace rive
diff --git a/include/rive/animation/transition_number_condition.hpp b/include/rive/animation/transition_number_condition.hpp index e8c88d9..d794097 100644 --- a/include/rive/animation/transition_number_condition.hpp +++ b/include/rive/animation/transition_number_condition.hpp
@@ -10,7 +10,7 @@ bool validateInputType(const StateMachineInput* input) const override; public: - bool evaluate(const SMIInput* inputInstance) const override; + bool evaluate(const StateMachineInstance* stateMachineInstance) const override; }; } // namespace rive
diff --git a/include/rive/animation/transition_property_viewmodel_comparator.hpp b/include/rive/animation/transition_property_viewmodel_comparator.hpp index 6dec8ed..6c5bd87 100644 --- a/include/rive/animation/transition_property_viewmodel_comparator.hpp +++ b/include/rive/animation/transition_property_viewmodel_comparator.hpp
@@ -2,6 +2,7 @@ #define _RIVE_TRANSITION_PROPERTY_VIEW_MODEL_COMPARATOR_HPP_ #include "rive/generated/animation/transition_property_viewmodel_comparator_base.hpp" #include "rive/data_bind/bindable_property.hpp" +#include "rive/animation/state_machine_instance.hpp" #include <stdio.h> namespace rive { @@ -11,12 +12,18 @@ StatusCode import(ImportStack& importStack) override; bool compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) override; - float propertyValueNumber(StateMachineInstance* stateMachineInstance); - std::string propertyValueString(StateMachineInstance* stateMachineInstance); - int propertyValueColor(StateMachineInstance* stateMachineInstance); - bool propertyValueBoolean(StateMachineInstance* stateMachineInstance); - uint16_t propertyValueEnum(StateMachineInstance* stateMachineInstance); + const StateMachineInstance* stateMachineInstance) override; + template <typename T = BindableProperty, typename U> + U value(const StateMachineInstance* stateMachineInstance) + { + if (m_bindableProperty->is<T>()) + { + auto bindableInstance = + stateMachineInstance->bindablePropertyInstance(m_bindableProperty); + return bindableInstance->as<T>()->propertyValue(); + } + return (new T())->propertyValue(); + }; protected: BindableProperty* m_bindableProperty;
diff --git a/include/rive/animation/transition_trigger_condition.hpp b/include/rive/animation/transition_trigger_condition.hpp index cb53566..7ad999f 100644 --- a/include/rive/animation/transition_trigger_condition.hpp +++ b/include/rive/animation/transition_trigger_condition.hpp
@@ -7,7 +7,7 @@ class TransitionTriggerCondition : public TransitionTriggerConditionBase { public: - bool evaluate(const SMIInput* inputInstance) const override; + bool evaluate(const StateMachineInstance* stateMachineInstance) const override; protected: bool validateInputType(const StateMachineInput* input) const override;
diff --git a/include/rive/animation/transition_value_boolean_comparator.hpp b/include/rive/animation/transition_value_boolean_comparator.hpp index de5590b..fc8b51c 100644 --- a/include/rive/animation/transition_value_boolean_comparator.hpp +++ b/include/rive/animation/transition_value_boolean_comparator.hpp
@@ -9,7 +9,7 @@ public: bool compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) override; + const StateMachineInstance* stateMachineInstance) override; }; } // namespace rive
diff --git a/include/rive/animation/transition_value_color_comparator.hpp b/include/rive/animation/transition_value_color_comparator.hpp index 6e13bb1..c75c062 100644 --- a/include/rive/animation/transition_value_color_comparator.hpp +++ b/include/rive/animation/transition_value_color_comparator.hpp
@@ -9,7 +9,7 @@ public: bool compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) override; + const StateMachineInstance* stateMachineInstance) override; }; } // namespace rive
diff --git a/include/rive/animation/transition_value_number_comparator.hpp b/include/rive/animation/transition_value_number_comparator.hpp index cd88207..daf644c 100644 --- a/include/rive/animation/transition_value_number_comparator.hpp +++ b/include/rive/animation/transition_value_number_comparator.hpp
@@ -9,7 +9,7 @@ public: bool compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) override; + const StateMachineInstance* stateMachineInstance) override; }; } // namespace rive
diff --git a/include/rive/animation/transition_value_string_comparator.hpp b/include/rive/animation/transition_value_string_comparator.hpp index ac0136d..c634db8 100644 --- a/include/rive/animation/transition_value_string_comparator.hpp +++ b/include/rive/animation/transition_value_string_comparator.hpp
@@ -9,7 +9,7 @@ public: bool compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) override; + const StateMachineInstance* stateMachineInstance) override; }; } // namespace rive
diff --git a/include/rive/animation/transition_viewmodel_condition.hpp b/include/rive/animation/transition_viewmodel_condition.hpp index 2d5efb9..508807d 100644 --- a/include/rive/animation/transition_viewmodel_condition.hpp +++ b/include/rive/animation/transition_viewmodel_condition.hpp
@@ -14,9 +14,9 @@ TransitionComparator* m_rightComparator; public: - bool evaluateCondition(StateMachineInstance* stateMachineInstance); - TransitionComparator* leftComparator() { return m_leftComparator; }; - TransitionComparator* rightComparator() { return m_rightComparator; }; + bool evaluate(const StateMachineInstance* stateMachineInstance) const override; + TransitionComparator* leftComparator() const { return m_leftComparator; }; + TransitionComparator* rightComparator() const { return m_rightComparator; }; void comparator(TransitionComparator* value) { if (m_leftComparator == nullptr)
diff --git a/src/animation/state_machine_instance.cpp b/src/animation/state_machine_instance.cpp index c49745f..dcc6ff6 100644 --- a/src/animation/state_machine_instance.cpp +++ b/src/animation/state_machine_instance.cpp
@@ -1258,7 +1258,8 @@ } } -BindableProperty* StateMachineInstance::bindablePropertyInstance(BindableProperty* bindableProperty) +BindableProperty* StateMachineInstance::bindablePropertyInstance( + BindableProperty* bindableProperty) const { auto bindablePropertyInstance = m_bindablePropertyInstances.find(bindableProperty); if (bindablePropertyInstance == m_bindablePropertyInstances.end())
diff --git a/src/animation/state_transition.cpp b/src/animation/state_transition.cpp index 560f82c..f419c4b 100644 --- a/src/animation/state_transition.cpp +++ b/src/animation/state_transition.cpp
@@ -150,26 +150,10 @@ for (auto condition : m_Conditions) { - if (condition->is<TransitionInputCondition>()) + if ((ignoreTriggers && condition->is<TransitionTriggerCondition>()) || + !condition->evaluate(stateMachineInstance)) { - auto inputCondition = condition->as<TransitionInputCondition>(); - // N.B. state machine instance sanitizes these for us... - auto input = stateMachineInstance->input(inputCondition->inputId()); - - if ((ignoreTriggers && inputCondition->is<TransitionTriggerCondition>()) || - !inputCondition->evaluate(input)) - { - return AllowTransition::no; - } - } - else if (condition->is<TransitionViewModelCondition>()) - { - auto transitionViewModelCondition = condition->as<TransitionViewModelCondition>(); - - if (!transitionViewModelCondition->evaluateCondition(stateMachineInstance)) - { - return AllowTransition::no; - } + return AllowTransition::no; } }
diff --git a/src/animation/transition_bool_condition.cpp b/src/animation/transition_bool_condition.cpp index 14eb732..f50a84e 100644 --- a/src/animation/transition_bool_condition.cpp +++ b/src/animation/transition_bool_condition.cpp
@@ -13,8 +13,9 @@ return input == nullptr || input->is<StateMachineBool>(); } -bool TransitionBoolCondition::evaluate(const SMIInput* inputInstance) const +bool TransitionBoolCondition::evaluate(const StateMachineInstance* stateMachineInstance) const { + auto inputInstance = stateMachineInstance->input(inputId()); if (inputInstance == nullptr) { return true;
diff --git a/src/animation/transition_comparator.cpp b/src/animation/transition_comparator.cpp index 73b9db9..b14254a 100644 --- a/src/animation/transition_comparator.cpp +++ b/src/animation/transition_comparator.cpp
@@ -95,7 +95,7 @@ bool TransitionComparator::compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) + const StateMachineInstance* stateMachineInstance) { return false; } \ No newline at end of file
diff --git a/src/animation/transition_condition.cpp b/src/animation/transition_condition.cpp index 6385f28..9486516 100644 --- a/src/animation/transition_condition.cpp +++ b/src/animation/transition_condition.cpp
@@ -1,4 +1,4 @@ -#include "rive/animation/transition_bool_condition.hpp" +#include "rive/animation/transition_condition.hpp" #include "rive/animation/state_transition.hpp" #include "rive/importers/state_transition_importer.hpp" @@ -10,7 +10,6 @@ StatusCode TransitionCondition::import(ImportStack& importStack) { - auto transitionImporter = importStack.latest<StateTransitionImporter>(StateTransition::typeKey); if (transitionImporter == nullptr) {
diff --git a/src/animation/transition_number_condition.cpp b/src/animation/transition_number_condition.cpp index 102d631..da820e3 100644 --- a/src/animation/transition_number_condition.cpp +++ b/src/animation/transition_number_condition.cpp
@@ -13,8 +13,9 @@ return input == nullptr || input->is<StateMachineNumber>(); } -bool TransitionNumberCondition::evaluate(const SMIInput* inputInstance) const +bool TransitionNumberCondition::evaluate(const StateMachineInstance* stateMachineInstance) const { + auto inputInstance = stateMachineInstance->input(inputId()); if (inputInstance == nullptr) { return true;
diff --git a/src/animation/transition_property_viewmodel_comparator.cpp b/src/animation/transition_property_viewmodel_comparator.cpp index 8d93152..80f92ec 100644 --- a/src/animation/transition_property_viewmodel_comparator.cpp +++ b/src/animation/transition_property_viewmodel_comparator.cpp
@@ -27,61 +27,26 @@ return Super::import(importStack); } -float TransitionPropertyViewModelComparator::propertyValueNumber( - StateMachineInstance* stateMachineInstance) -{ - auto bindableInstance = stateMachineInstance->bindablePropertyInstance(m_bindableProperty); - return bindableInstance->as<BindablePropertyNumber>()->propertyValue(); -} - -std::string TransitionPropertyViewModelComparator::propertyValueString( - StateMachineInstance* stateMachineInstance) -{ - auto bindableInstance = stateMachineInstance->bindablePropertyInstance(m_bindableProperty); - return bindableInstance->as<BindablePropertyString>()->propertyValue(); -} - -int TransitionPropertyViewModelComparator::propertyValueColor( - StateMachineInstance* stateMachineInstance) -{ - auto bindableInstance = stateMachineInstance->bindablePropertyInstance(m_bindableProperty); - return bindableInstance->as<BindablePropertyColor>()->propertyValue(); -} - -bool TransitionPropertyViewModelComparator::propertyValueBoolean( - StateMachineInstance* stateMachineInstance) -{ - auto bindableInstance = stateMachineInstance->bindablePropertyInstance(m_bindableProperty); - return bindableInstance->as<BindablePropertyBoolean>()->propertyValue(); -} - -uint16_t TransitionPropertyViewModelComparator::propertyValueEnum( - StateMachineInstance* stateMachineInstance) -{ - auto bindableInstance = stateMachineInstance->bindablePropertyInstance(m_bindableProperty); - return bindableInstance->as<BindablePropertyEnum>()->propertyValue(); -} - -bool TransitionPropertyViewModelComparator::compare(TransitionComparator* comparand, - TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) +bool TransitionPropertyViewModelComparator::compare( + TransitionComparator* comparand, + TransitionConditionOp operation, + const StateMachineInstance* stateMachineInstance) { switch (m_bindableProperty->coreType()) { case BindablePropertyNumber::typeKey: if (comparand->is<TransitionPropertyViewModelComparator>()) { - auto rightValue = - comparand->as<TransitionPropertyViewModelComparator>()->propertyValueNumber( - stateMachineInstance); - return compareNumbers(propertyValueNumber(stateMachineInstance), + auto rightValue = comparand->as<TransitionPropertyViewModelComparator>() + ->value<BindablePropertyNumber, float>(stateMachineInstance); + return compareNumbers(value<BindablePropertyNumber, float>(stateMachineInstance), rightValue, operation); } else if (comparand->is<TransitionValueNumberComparator>()) { auto rightValue = comparand->as<TransitionValueNumberComparator>()->value(); - return compareNumbers(propertyValueNumber(stateMachineInstance), + return compareNumbers(value<BindablePropertyNumber, float>(stateMachineInstance), rightValue, operation); } @@ -90,34 +55,35 @@ if (comparand->is<TransitionPropertyViewModelComparator>()) { auto rightValue = - comparand->as<TransitionPropertyViewModelComparator>()->propertyValueString( - stateMachineInstance); - return compareStrings(propertyValueString(stateMachineInstance), - rightValue, - operation); + comparand->as<TransitionPropertyViewModelComparator>() + ->value<BindablePropertyString, std::string>(stateMachineInstance); + return compareStrings( + value<BindablePropertyString, std::string>(stateMachineInstance), + rightValue, + operation); } else if (comparand->is<TransitionValueStringComparator>()) { auto rightValue = comparand->as<TransitionValueStringComparator>()->value(); - return compareStrings(propertyValueString(stateMachineInstance), - rightValue, - operation); + return compareStrings( + value<BindablePropertyString, std::string>(stateMachineInstance), + rightValue, + operation); } break; case BindablePropertyColor::typeKey: if (comparand->is<TransitionPropertyViewModelComparator>()) { - auto rightValue = - comparand->as<TransitionPropertyViewModelComparator>()->propertyValueColor( - stateMachineInstance); - return compareColors(propertyValueColor(stateMachineInstance), + auto rightValue = comparand->as<TransitionPropertyViewModelComparator>() + ->value<BindablePropertyColor, int>(stateMachineInstance); + return compareColors(value<BindablePropertyColor, int>(stateMachineInstance), rightValue, operation); } else if (comparand->is<TransitionValueColorComparator>()) { auto rightValue = comparand->as<TransitionValueColorComparator>()->value(); - return compareColors(propertyValueColor(stateMachineInstance), + return compareColors(value<BindablePropertyColor, int>(stateMachineInstance), rightValue, operation); } @@ -125,17 +91,16 @@ case BindablePropertyBoolean::typeKey: if (comparand->is<TransitionPropertyViewModelComparator>()) { - auto rightValue = - comparand->as<TransitionPropertyViewModelComparator>()->propertyValueBoolean( - stateMachineInstance); - return compareBooleans(propertyValueBoolean(stateMachineInstance), + auto rightValue = comparand->as<TransitionPropertyViewModelComparator>() + ->value<BindablePropertyBoolean, bool>(stateMachineInstance); + return compareBooleans(value<BindablePropertyBoolean, bool>(stateMachineInstance), rightValue, operation); } else if (comparand->is<TransitionValueBooleanComparator>()) { auto rightValue = comparand->as<TransitionValueBooleanComparator>()->value(); - return compareBooleans(propertyValueBoolean(stateMachineInstance), + return compareBooleans(value<BindablePropertyBoolean, bool>(stateMachineInstance), rightValue, operation); } @@ -143,15 +108,18 @@ case BindablePropertyEnum::typeKey: if (comparand->is<TransitionPropertyViewModelComparator>()) { - auto rightValue = - comparand->as<TransitionPropertyViewModelComparator>()->propertyValueEnum( - stateMachineInstance); - return compareEnums(propertyValueEnum(stateMachineInstance), rightValue, operation); + auto rightValue = comparand->as<TransitionPropertyViewModelComparator>() + ->value<BindablePropertyEnum, uint16_t>(stateMachineInstance); + return compareEnums(value<BindablePropertyEnum, uint16_t>(stateMachineInstance), + rightValue, + operation); } else if (comparand->is<TransitionValueEnumComparator>()) { auto rightValue = comparand->as<TransitionValueEnumComparator>()->value(); - return compareEnums(propertyValueEnum(stateMachineInstance), rightValue, operation); + return compareEnums(value<BindablePropertyEnum, uint16_t>(stateMachineInstance), + rightValue, + operation); } break; }
diff --git a/src/animation/transition_trigger_condition.cpp b/src/animation/transition_trigger_condition.cpp index 86391fe..15be1a6 100644 --- a/src/animation/transition_trigger_condition.cpp +++ b/src/animation/transition_trigger_condition.cpp
@@ -13,8 +13,9 @@ return input == nullptr || input->is<StateMachineTrigger>(); } -bool TransitionTriggerCondition::evaluate(const SMIInput* inputInstance) const +bool TransitionTriggerCondition::evaluate(const StateMachineInstance* stateMachineInstance) const { + auto inputInstance = stateMachineInstance->input(inputId()); if (inputInstance == nullptr) { return true;
diff --git a/src/animation/transition_value_boolean_comparator.cpp b/src/animation/transition_value_boolean_comparator.cpp index e26f868..7477828 100644 --- a/src/animation/transition_value_boolean_comparator.cpp +++ b/src/animation/transition_value_boolean_comparator.cpp
@@ -4,7 +4,7 @@ bool TransitionValueBooleanComparator::compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) + const StateMachineInstance* stateMachineInstance) { if (comparand->is<TransitionValueBooleanComparator>()) {
diff --git a/src/animation/transition_value_color_comparator.cpp b/src/animation/transition_value_color_comparator.cpp index c4fe60e..9e29e26 100644 --- a/src/animation/transition_value_color_comparator.cpp +++ b/src/animation/transition_value_color_comparator.cpp
@@ -4,7 +4,7 @@ bool TransitionValueColorComparator::compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) + const StateMachineInstance* stateMachineInstance) { if (comparand->is<TransitionValueColorComparator>()) {
diff --git a/src/animation/transition_value_number_comparator.cpp b/src/animation/transition_value_number_comparator.cpp index c4f05d5..5c88856 100644 --- a/src/animation/transition_value_number_comparator.cpp +++ b/src/animation/transition_value_number_comparator.cpp
@@ -4,7 +4,7 @@ bool TransitionValueNumberComparator::compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) + const StateMachineInstance* stateMachineInstance) { if (comparand->is<TransitionValueNumberComparator>()) {
diff --git a/src/animation/transition_value_string_comparator.cpp b/src/animation/transition_value_string_comparator.cpp index d62a1a3..fe6ac06 100644 --- a/src/animation/transition_value_string_comparator.cpp +++ b/src/animation/transition_value_string_comparator.cpp
@@ -4,7 +4,7 @@ bool TransitionValueStringComparator::compare(TransitionComparator* comparand, TransitionConditionOp operation, - StateMachineInstance* stateMachineInstance) + const StateMachineInstance* stateMachineInstance) { if (comparand->is<TransitionValueStringComparator>()) {
diff --git a/src/animation/transition_viewmodel_condition.cpp b/src/animation/transition_viewmodel_condition.cpp index 40d2a07..5c6ebbf 100644 --- a/src/animation/transition_viewmodel_condition.cpp +++ b/src/animation/transition_viewmodel_condition.cpp
@@ -8,7 +8,7 @@ using namespace rive; -bool TransitionViewModelCondition::evaluateCondition(StateMachineInstance* stateMachineInstance) +bool TransitionViewModelCondition::evaluate(const StateMachineInstance* stateMachineInstance) const { if (leftComparator() != nullptr && rightComparator() != nullptr) {