| #include "rive/animation/transition_property_viewmodel_comparator.hpp" |
| #include "rive/animation/transition_self_comparator.hpp" |
| #include "rive/animation/transition_value_number_comparator.hpp" |
| #include "rive/animation/transition_value_string_comparator.hpp" |
| #include "rive/animation/transition_value_color_comparator.hpp" |
| #include "rive/animation/transition_value_boolean_comparator.hpp" |
| #include "rive/animation/transition_value_asset_comparator.hpp" |
| #include "rive/animation/transition_value_enum_comparator.hpp" |
| #include "rive/animation/transition_value_trigger_comparator.hpp" |
| #include "rive/animation/state_machine_instance.hpp" |
| #include "rive/importers/bindable_property_importer.hpp" |
| #include "rive/data_bind/bindable_property_asset.hpp" |
| #include "rive/data_bind/bindable_property_number.hpp" |
| #include "rive/data_bind/bindable_property_string.hpp" |
| #include "rive/data_bind/bindable_property_color.hpp" |
| #include "rive/data_bind/bindable_property_enum.hpp" |
| #include "rive/data_bind/bindable_property_integer.hpp" |
| #include "rive/data_bind/bindable_property_boolean.hpp" |
| #include "rive/data_bind/bindable_property_trigger.hpp" |
| #include "rive/viewmodel/viewmodel_instance_trigger.hpp" |
| |
| using namespace rive; |
| |
| TransitionPropertyViewModelComparator::~TransitionPropertyViewModelComparator() |
| { |
| if (m_bindableProperty != nullptr) |
| { |
| delete m_bindableProperty; |
| m_bindableProperty = nullptr; |
| } |
| } |
| |
| StatusCode TransitionPropertyViewModelComparator::import( |
| ImportStack& importStack) |
| { |
| auto bindablePropertyImporter = |
| importStack.latest<BindablePropertyImporter>( |
| BindablePropertyBase::typeKey); |
| if (bindablePropertyImporter == nullptr) |
| { |
| return StatusCode::MissingObject; |
| } |
| m_bindableProperty = bindablePropertyImporter->bindableProperty(); |
| |
| return Super::import(importStack); |
| } |
| |
| float TransitionPropertyViewModelComparator::valueToFloat( |
| const StateMachineInstance* stateMachineInstance) |
| { |
| auto bindableInstance = |
| stateMachineInstance->bindablePropertyInstance(m_bindableProperty); |
| if (bindableInstance != nullptr) |
| { |
| if (bindableInstance->is<BindablePropertyInteger>()) |
| { |
| return (float)this->value<BindablePropertyInteger, uint32_t>( |
| stateMachineInstance); |
| } |
| else if (bindableInstance->is<BindablePropertyNumber>()) |
| { |
| return this->value<BindablePropertyNumber, float>( |
| stateMachineInstance); |
| } |
| } |
| return 0; |
| } |
| |
| bool TransitionPropertyViewModelComparator::compare( |
| TransitionComparator* comparand, |
| TransitionConditionOp operation, |
| const StateMachineInstance* stateMachineInstance, |
| StateMachineLayerInstance* layerInstance) |
| { |
| if (comparand->is<TransitionSelfComparator>()) |
| { |
| auto bindableInstance = |
| stateMachineInstance->bindablePropertyInstance(m_bindableProperty); |
| auto dataBind = |
| stateMachineInstance->bindableDataBindToTarget(bindableInstance); |
| if (dataBind != nullptr) |
| { |
| auto source = dataBind->source(); |
| if (source != nullptr && source->hasChanged()) |
| { |
| if (source->isUsedInLayer(layerInstance)) |
| { |
| |
| return false; |
| } |
| return true; |
| } |
| } |
| return false; |
| } |
| switch (m_bindableProperty->coreType()) |
| { |
| case BindablePropertyNumber::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| auto rightValue = |
| comparand->as<TransitionPropertyViewModelComparator>() |
| ->valueToFloat(stateMachineInstance); |
| return compareNumbers(valueToFloat(stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| else if (comparand->is<TransitionValueNumberComparator>()) |
| { |
| auto rightValue = |
| comparand->as<TransitionValueNumberComparator>()->value(); |
| return compareNumbers(valueToFloat(stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| break; |
| case BindablePropertyString::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| auto rightValue = |
| 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( |
| value<BindablePropertyString, std::string>( |
| stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| break; |
| case BindablePropertyColor::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| 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( |
| value<BindablePropertyColor, int>(stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| break; |
| case BindablePropertyBoolean::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| 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( |
| value<BindablePropertyBoolean, bool>(stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| break; |
| case BindablePropertyEnum::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| 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( |
| value<BindablePropertyEnum, uint16_t>(stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| break; |
| case BindablePropertyTrigger::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| auto rightValue = |
| comparand->as<TransitionPropertyViewModelComparator>() |
| ->value<BindablePropertyTrigger, uint32_t>( |
| stateMachineInstance); |
| return compareTriggers(value<BindablePropertyTrigger, uint32_t>( |
| stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| else if (comparand->is<TransitionValueTriggerComparator>()) |
| { |
| auto bindableInstance = |
| stateMachineInstance->bindablePropertyInstance( |
| m_bindableProperty); |
| auto dataBind = stateMachineInstance->bindableDataBindToTarget( |
| bindableInstance); |
| if (dataBind != nullptr) |
| { |
| auto source = dataBind->source(); |
| if (source != nullptr && |
| source->is<ViewModelInstanceTrigger>()) |
| { |
| if (source->as<ViewModelInstanceTrigger>() |
| ->isUsedInLayer(layerInstance)) |
| { |
| |
| return false; |
| } |
| } |
| } |
| auto leftValue = value<BindablePropertyTrigger, uint32_t>( |
| stateMachineInstance); |
| if (leftValue != 0) |
| { |
| return true; |
| } |
| } |
| break; |
| case BindablePropertyInteger::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| auto rightValue = |
| comparand->as<TransitionPropertyViewModelComparator>() |
| ->valueToFloat(stateMachineInstance); |
| return compareNumbers(valueToFloat(stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| else if (comparand->is<TransitionValueNumberComparator>()) |
| { |
| auto rightValue = |
| comparand->as<TransitionValueNumberComparator>()->value(); |
| switch (instanceDataType(stateMachineInstance)) |
| { |
| case DataType::number: |
| return compareNumbers( |
| valueToFloat(stateMachineInstance), |
| rightValue, |
| operation); |
| case DataType::integer: |
| { |
| |
| auto val = value<BindablePropertyInteger, uint32_t>( |
| stateMachineInstance); |
| return compareNumbers((float)val, |
| rightValue, |
| operation); |
| } |
| default: |
| break; |
| } |
| } |
| break; |
| case BindablePropertyAsset::typeKey: |
| if (comparand->is<TransitionPropertyViewModelComparator>()) |
| { |
| auto rightValue = |
| comparand->as<TransitionPropertyViewModelComparator>() |
| ->value<BindablePropertyAsset, uint32_t>( |
| stateMachineInstance); |
| return compareIds(value<BindablePropertyAsset, uint32_t>( |
| stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| else if (comparand->is<TransitionValueAssetComparator>()) |
| { |
| auto rightValue = |
| comparand->as<TransitionValueAssetComparator>()->value(); |
| return compareIds(value<BindablePropertyAsset, uint32_t>( |
| stateMachineInstance), |
| rightValue, |
| operation); |
| } |
| break; |
| } |
| return false; |
| } |
| |
| void TransitionPropertyViewModelComparator::useInLayer( |
| const StateMachineInstance* stateMachineInstance, |
| StateMachineLayerInstance* layerInstance) const |
| { |
| |
| auto bindableInstance = |
| stateMachineInstance->bindablePropertyInstance(m_bindableProperty); |
| if (bindableInstance == nullptr) |
| { |
| return; |
| } |
| auto dataBind = |
| stateMachineInstance->bindableDataBindToTarget(bindableInstance); |
| auto source = dataBind->source(); |
| if (source != nullptr) |
| { |
| source->useInLayer(layerInstance); |
| } |
| } |
| |
| DataType TransitionPropertyViewModelComparator::instanceDataType( |
| const StateMachineInstance* stateMachineInstance) |
| { |
| auto bindableInstance = |
| stateMachineInstance->bindablePropertyInstance(m_bindableProperty); |
| if (bindableInstance != nullptr) |
| { |
| |
| switch (bindableInstance->coreType()) |
| { |
| case BindablePropertyNumberBase::typeKey: |
| |
| return DataType::number; |
| case BindablePropertyBooleanBase::typeKey: |
| return DataType::boolean; |
| case BindablePropertyColorBase::typeKey: |
| return DataType::color; |
| case BindablePropertyStringBase::typeKey: |
| return DataType::string; |
| case BindablePropertyEnumBase::typeKey: |
| return DataType::enumType; |
| case BindablePropertyTriggerBase::typeKey: |
| return DataType::trigger; |
| case BindablePropertyIntegerBase::typeKey: |
| return DataType::integer; |
| } |
| } |
| return DataType::none; |
| } |