Use artboard properties as transition conditions Adding support for transition conditions based on artboard properties. transition_artboard_condition extends from transition_viewmodel_condition. It might be good to rename transition_viewmodel_condition to transition_property_condition at some point since it is extensible enough to support viewmodels, but also with other properties like here. Diffs= 93cc33b45 Use artboard properties as transition conditions (#7796) Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head index f62275e..7e901c4 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -c5fc07de9cc2d14a2d223397c8ea96d7393eb78e +93cc33b45086e528b22d1245a8f7855bac299a21
diff --git a/dev/defs/animation/transition_artboard_condition.json b/dev/defs/animation/transition_artboard_condition.json new file mode 100644 index 0000000..5a39c66 --- /dev/null +++ b/dev/defs/animation/transition_artboard_condition.json
@@ -0,0 +1,8 @@ +{ + "name": "TransitionArtboardCondition", + "key": { + "int": 497, + "string": "transitionartboardcondition" + }, + "extends": "animation/transition_viewmodel_condition.json" +} \ No newline at end of file
diff --git a/dev/defs/animation/transition_property_artboard_comparator.json b/dev/defs/animation/transition_property_artboard_comparator.json new file mode 100644 index 0000000..a9502eb --- /dev/null +++ b/dev/defs/animation/transition_property_artboard_comparator.json
@@ -0,0 +1,19 @@ +{ + "name": "TransitionPropertyArtboardComparator", + "key": { + "int": 496, + "string": "transitionpropertyartboardcomparator" + }, + "extends": "animation/transition_property_comparator.json", + "properties": { + "propertyType": { + "type": "uint", + "initialValue": "0", + "key": { + "int": 677, + "string": "propertytype" + }, + "description": "Integer representation of the artboard's property used for condition" + } + } +} \ No newline at end of file
diff --git a/include/rive/animation/artboard_property.hpp b/include/rive/animation/artboard_property.hpp new file mode 100644 index 0000000..0a4d606 --- /dev/null +++ b/include/rive/animation/artboard_property.hpp
@@ -0,0 +1,14 @@ +#ifndef _RIVE_ARTBOARD_PROPERTY_HPP_ +#define _RIVE_ARTBOARD_PROPERTY_HPP_ + +namespace rive +{ +enum class ArtboardProperty : int +{ + width = 0, + height = 1, + ratio = 2, +}; +} // namespace rive + +#endif \ No newline at end of file
diff --git a/include/rive/animation/transition_artboard_condition.hpp b/include/rive/animation/transition_artboard_condition.hpp new file mode 100644 index 0000000..7892537 --- /dev/null +++ b/include/rive/animation/transition_artboard_condition.hpp
@@ -0,0 +1,13 @@ +#ifndef _RIVE_TRANSITION_ARTBOARD_CONDITION_HPP_ +#define _RIVE_TRANSITION_ARTBOARD_CONDITION_HPP_ +#include "rive/generated/animation/transition_artboard_condition_base.hpp" +#include <stdio.h> +namespace rive +{ +class TransitionArtboardCondition : public TransitionArtboardConditionBase +{ +public: +}; +} // namespace rive + +#endif \ No newline at end of file
diff --git a/include/rive/animation/transition_property_artboard_comparator.hpp b/include/rive/animation/transition_property_artboard_comparator.hpp new file mode 100644 index 0000000..184b649 --- /dev/null +++ b/include/rive/animation/transition_property_artboard_comparator.hpp
@@ -0,0 +1,20 @@ +#ifndef _RIVE_TRANSITION_PROPERTY_ARTBOARD_COMPARATOR_HPP_ +#define _RIVE_TRANSITION_PROPERTY_ARTBOARD_COMPARATOR_HPP_ +#include "rive/generated/animation/transition_property_artboard_comparator_base.hpp" +#include <stdio.h> +namespace rive +{ +class Artboard; +class TransitionPropertyArtboardComparator : public TransitionPropertyArtboardComparatorBase +{ +public: + bool compare(TransitionComparator* comparand, + TransitionConditionOp operation, + const StateMachineInstance* stateMachineInstance) override; + +private: + float propertyValue(const StateMachineInstance* stateMachineInstance); +}; +} // namespace rive + +#endif \ No newline at end of file
diff --git a/include/rive/generated/animation/transition_artboard_condition_base.hpp b/include/rive/generated/animation/transition_artboard_condition_base.hpp new file mode 100644 index 0000000..5f079c4 --- /dev/null +++ b/include/rive/generated/animation/transition_artboard_condition_base.hpp
@@ -0,0 +1,37 @@ +#ifndef _RIVE_TRANSITION_ARTBOARD_CONDITION_BASE_HPP_ +#define _RIVE_TRANSITION_ARTBOARD_CONDITION_BASE_HPP_ +#include "rive/animation/transition_viewmodel_condition.hpp" +namespace rive +{ +class TransitionArtboardConditionBase : public TransitionViewModelCondition +{ +protected: + typedef TransitionViewModelCondition Super; + +public: + static const uint16_t typeKey = 497; + + /// Helper to quickly determine if a core object extends another without RTTI + /// at runtime. + bool isTypeOf(uint16_t typeKey) const override + { + switch (typeKey) + { + case TransitionArtboardConditionBase::typeKey: + case TransitionViewModelConditionBase::typeKey: + case TransitionConditionBase::typeKey: + return true; + default: + return false; + } + } + + uint16_t coreType() const override { return typeKey; } + + Core* clone() const override; + +protected: +}; +} // namespace rive + +#endif \ No newline at end of file
diff --git a/include/rive/generated/animation/transition_property_artboard_comparator_base.hpp b/include/rive/generated/animation/transition_property_artboard_comparator_base.hpp new file mode 100644 index 0000000..354087a --- /dev/null +++ b/include/rive/generated/animation/transition_property_artboard_comparator_base.hpp
@@ -0,0 +1,72 @@ +#ifndef _RIVE_TRANSITION_PROPERTY_ARTBOARD_COMPARATOR_BASE_HPP_ +#define _RIVE_TRANSITION_PROPERTY_ARTBOARD_COMPARATOR_BASE_HPP_ +#include "rive/animation/transition_property_comparator.hpp" +#include "rive/core/field_types/core_uint_type.hpp" +namespace rive +{ +class TransitionPropertyArtboardComparatorBase : public TransitionPropertyComparator +{ +protected: + typedef TransitionPropertyComparator Super; + +public: + static const uint16_t typeKey = 496; + + /// Helper to quickly determine if a core object extends another without RTTI + /// at runtime. + bool isTypeOf(uint16_t typeKey) const override + { + switch (typeKey) + { + case TransitionPropertyArtboardComparatorBase::typeKey: + case TransitionPropertyComparatorBase::typeKey: + case TransitionComparatorBase::typeKey: + return true; + default: + return false; + } + } + + uint16_t coreType() const override { return typeKey; } + + static const uint16_t propertyTypePropertyKey = 677; + +private: + uint32_t m_PropertyType = 0; + +public: + inline uint32_t propertyType() const { return m_PropertyType; } + void propertyType(uint32_t value) + { + if (m_PropertyType == value) + { + return; + } + m_PropertyType = value; + propertyTypeChanged(); + } + + Core* clone() const override; + void copy(const TransitionPropertyArtboardComparatorBase& object) + { + m_PropertyType = object.m_PropertyType; + TransitionPropertyComparator::copy(object); + } + + bool deserialize(uint16_t propertyKey, BinaryReader& reader) override + { + switch (propertyKey) + { + case propertyTypePropertyKey: + m_PropertyType = CoreUintType::deserialize(reader); + return true; + } + return TransitionPropertyComparator::deserialize(propertyKey, reader); + } + +protected: + virtual void propertyTypeChanged() {} +}; +} // namespace rive + +#endif \ No newline at end of file
diff --git a/include/rive/generated/core_registry.hpp b/include/rive/generated/core_registry.hpp index fd25b4c..77e4251 100644 --- a/include/rive/generated/core_registry.hpp +++ b/include/rive/generated/core_registry.hpp
@@ -59,11 +59,13 @@ #include "rive/animation/state_machine_number.hpp" #include "rive/animation/state_machine_trigger.hpp" #include "rive/animation/state_transition.hpp" +#include "rive/animation/transition_artboard_condition.hpp" #include "rive/animation/transition_bool_condition.hpp" #include "rive/animation/transition_comparator.hpp" #include "rive/animation/transition_condition.hpp" #include "rive/animation/transition_input_condition.hpp" #include "rive/animation/transition_number_condition.hpp" +#include "rive/animation/transition_property_artboard_comparator.hpp" #include "rive/animation/transition_property_comparator.hpp" #include "rive/animation/transition_property_viewmodel_comparator.hpp" #include "rive/animation/transition_trigger_condition.hpp" @@ -318,6 +320,8 @@ return new KeyedProperty(); case StateMachineListenerBase::typeKey: return new StateMachineListener(); + case TransitionPropertyArtboardComparatorBase::typeKey: + return new TransitionPropertyArtboardComparator(); case TransitionPropertyViewModelComparatorBase::typeKey: return new TransitionPropertyViewModelComparator(); case KeyFrameIdBase::typeKey: @@ -332,6 +336,10 @@ return new TransitionNumberCondition(); case TransitionValueBooleanComparatorBase::typeKey: return new TransitionValueBooleanComparator(); + case TransitionViewModelConditionBase::typeKey: + return new TransitionViewModelCondition(); + case TransitionArtboardConditionBase::typeKey: + return new TransitionArtboardCondition(); case AnyStateBase::typeKey: return new AnyState(); case CubicInterpolatorComponentBase::typeKey: @@ -342,8 +350,6 @@ return new KeyFrameString(); case ListenerNumberChangeBase::typeKey: return new ListenerNumberChange(); - case TransitionViewModelConditionBase::typeKey: - return new TransitionViewModelCondition(); case CubicEaseInterpolatorBase::typeKey: return new CubicEaseInterpolator(); case StateTransitionBase::typeKey: @@ -900,6 +906,9 @@ case StateMachineListenerBase::eventIdPropertyKey: object->as<StateMachineListenerBase>()->eventId(value); break; + case TransitionPropertyArtboardComparatorBase::propertyTypePropertyKey: + object->as<TransitionPropertyArtboardComparatorBase>()->propertyType(value); + break; case KeyFrameIdBase::valuePropertyKey: object->as<KeyFrameIdBase>()->value(value); break; @@ -1982,6 +1991,8 @@ return object->as<StateMachineListenerBase>()->listenerTypeValue(); case StateMachineListenerBase::eventIdPropertyKey: return object->as<StateMachineListenerBase>()->eventId(); + case TransitionPropertyArtboardComparatorBase::propertyTypePropertyKey: + return object->as<TransitionPropertyArtboardComparatorBase>()->propertyType(); case KeyFrameIdBase::valuePropertyKey: return object->as<KeyFrameIdBase>()->value(); case ListenerBoolChangeBase::valuePropertyKey: @@ -2664,6 +2675,7 @@ case StateMachineListenerBase::targetIdPropertyKey: case StateMachineListenerBase::listenerTypeValuePropertyKey: case StateMachineListenerBase::eventIdPropertyKey: + case TransitionPropertyArtboardComparatorBase::propertyTypePropertyKey: case KeyFrameIdBase::valuePropertyKey: case ListenerBoolChangeBase::valuePropertyKey: case ListenerAlignTargetBase::targetIdPropertyKey: @@ -3202,6 +3214,8 @@ return object->is<StateMachineListenerBase>(); case StateMachineListenerBase::eventIdPropertyKey: return object->is<StateMachineListenerBase>(); + case TransitionPropertyArtboardComparatorBase::propertyTypePropertyKey: + return object->is<TransitionPropertyArtboardComparatorBase>(); case KeyFrameIdBase::valuePropertyKey: return object->is<KeyFrameIdBase>(); case ListenerBoolChangeBase::valuePropertyKey:
diff --git a/src/animation/transition_property_artboard_comparator.cpp b/src/animation/transition_property_artboard_comparator.cpp new file mode 100644 index 0000000..a769c7e --- /dev/null +++ b/src/animation/transition_property_artboard_comparator.cpp
@@ -0,0 +1,54 @@ +#include "rive/animation/transition_property_artboard_comparator.hpp" +#include "rive/animation/transition_property_viewmodel_comparator.hpp" +#include "rive/animation/transition_value_number_comparator.hpp" +#include "rive/animation/artboard_property.hpp" +#include "rive/animation/state_machine_instance.hpp" +#include "rive/data_bind/bindable_property_number.hpp" + +using namespace rive; + +float TransitionPropertyArtboardComparator::propertyValue( + const StateMachineInstance* stateMachineInstance) +{ + auto artboard = stateMachineInstance->artboard(); + if (artboard != nullptr) + { + + auto property = static_cast<ArtboardProperty>(propertyType()); + switch (property) + { + case ArtboardProperty::width: + return artboard->layoutWidth(); + break; + case ArtboardProperty::height: + return artboard->layoutHeight(); + break; + case ArtboardProperty::ratio: + return artboard->layoutWidth() / artboard->layoutHeight(); + break; + + default: + break; + } + } + return 0; +} + +bool TransitionPropertyArtboardComparator::compare(TransitionComparator* comparand, + TransitionConditionOp operation, + const StateMachineInstance* stateMachineInstance) +{ + auto value = propertyValue(stateMachineInstance); + if (comparand->is<TransitionPropertyViewModelComparator>()) + { + auto rightValue = comparand->as<TransitionPropertyViewModelComparator>() + ->value<BindablePropertyNumber, float>(stateMachineInstance); + return compareNumbers(value, rightValue, operation); + } + else if (comparand->is<TransitionValueNumberComparator>()) + { + auto rightValue = comparand->as<TransitionValueNumberComparator>()->value(); + return compareNumbers(value, rightValue, operation); + } + return false; +} \ No newline at end of file
diff --git a/src/file.cpp b/src/file.cpp index 96da684..100969e 100644 --- a/src/file.cpp +++ b/src/file.cpp
@@ -375,6 +375,7 @@ stackType = ViewModelInstanceList::typeKey; break; case TransitionViewModelCondition::typeKey: + case TransitionArtboardCondition::typeKey: stackObject = rivestd::make_unique<TransitionViewModelConditionImporter>( object->as<TransitionViewModelCondition>()); stackType = TransitionViewModelCondition::typeKey;
diff --git a/src/generated/animation/transition_artboard_condition_base.cpp b/src/generated/animation/transition_artboard_condition_base.cpp new file mode 100644 index 0000000..4adb3c8 --- /dev/null +++ b/src/generated/animation/transition_artboard_condition_base.cpp
@@ -0,0 +1,11 @@ +#include "rive/generated/animation/transition_artboard_condition_base.hpp" +#include "rive/animation/transition_artboard_condition.hpp" + +using namespace rive; + +Core* TransitionArtboardConditionBase::clone() const +{ + auto cloned = new TransitionArtboardCondition(); + cloned->copy(*this); + return cloned; +}
diff --git a/src/generated/animation/transition_property_artboard_comparator_base.cpp b/src/generated/animation/transition_property_artboard_comparator_base.cpp new file mode 100644 index 0000000..31a068a --- /dev/null +++ b/src/generated/animation/transition_property_artboard_comparator_base.cpp
@@ -0,0 +1,11 @@ +#include "rive/generated/animation/transition_property_artboard_comparator_base.hpp" +#include "rive/animation/transition_property_artboard_comparator.hpp" + +using namespace rive; + +Core* TransitionPropertyArtboardComparatorBase::clone() const +{ + auto cloned = new TransitionPropertyArtboardComparator(); + cloned->copy(*this); + return cloned; +}