| #include "rive/animation/scripted_transition_condition.hpp" | |
| #include "rive/animation/state_machine_instance.hpp" | |
| #include "rive/importers/state_machine_importer.hpp" | |
| using namespace rive; | |
| ScriptedTransitionCondition::~ScriptedTransitionCondition() | |
| { | |
| disposeScriptInputs(); | |
| } | |
| void ScriptedTransitionCondition::disposeScriptInputs() | |
| { | |
| auto props = m_customProperties; | |
| ScriptedObject::disposeScriptInputs(); | |
| for (auto prop : props) | |
| { | |
| auto scriptInput = ScriptInput::from(prop); | |
| if (scriptInput != nullptr) | |
| { | |
| // ScriptedDataConverters need to delete their own inputs | |
| // because they are not components | |
| delete scriptInput; | |
| } | |
| } | |
| } | |
| // Note: evaluateStateful is the actual instance of the | |
| // ScriptedTransitionCondition that will run the script. evaluate itself will | |
| // look for the map between the stateless and the stateful instances of this | |
| // class. | |
| bool ScriptedTransitionCondition::evaluateStateful( | |
| const StateMachineInstance* stateMachineInstance, | |
| StateMachineLayerInstance* layerInstance) const | |
| { | |
| bool result = false; | |
| #ifdef WITH_RIVE_SCRIPTING | |
| if (m_vm != nullptr && m_vm->valid()) | |
| { | |
| result = m_vm->callBooleanMethod( | |
| const_cast<ScriptedTransitionCondition*>(this), | |
| m_self, | |
| "evaluate"); | |
| } | |
| #endif | |
| return result; | |
| } | |
| bool ScriptedTransitionCondition::evaluate( | |
| const StateMachineInstance* stateMachineInstance, | |
| StateMachineLayerInstance* layerInstance) const | |
| { | |
| #ifdef WITH_RIVE_SCRIPTING | |
| auto scriptedObject = stateMachineInstance->scriptedObject(this); | |
| if (scriptedObject != nullptr) | |
| { | |
| auto statefulListenerAction = | |
| static_cast<ScriptedTransitionCondition*>(scriptedObject); | |
| return statefulListenerAction->evaluateStateful(stateMachineInstance, | |
| layerInstance); | |
| } | |
| #endif | |
| return false; | |
| } | |
| StatusCode ScriptedTransitionCondition::import(ImportStack& importStack) | |
| { | |
| auto result = registerReferencer(importStack); | |
| if (result != StatusCode::Ok) | |
| { | |
| return result; | |
| } | |
| auto stateMachineImporter = | |
| importStack.latest<StateMachineImporter>(StateMachine::typeKey); | |
| if (stateMachineImporter == nullptr) | |
| { | |
| return StatusCode::MissingObject; | |
| } | |
| stateMachineImporter->addScriptedObject(this); | |
| return Super::import(importStack); | |
| } | |
| Core* ScriptedTransitionCondition::clone() const | |
| { | |
| ScriptedTransitionCondition* twin = ScriptedTransitionConditionBase::clone() | |
| ->as<ScriptedTransitionCondition>(); | |
| if (m_fileAsset != nullptr) | |
| { | |
| twin->setAsset(m_fileAsset); | |
| } | |
| return twin; | |
| } | |
| ScriptedObject* ScriptedTransitionCondition::cloneScriptedObject( | |
| DataBindContainer* dataBindContainer) const | |
| { | |
| auto clonedScriptedObject = clone()->as<ScriptedTransitionCondition>(); | |
| cloneProperties(clonedScriptedObject, dataBindContainer); | |
| clonedScriptedObject->reinit(); | |
| return clonedScriptedObject; | |
| } | |
| void ScriptedTransitionCondition::addProperty(CustomProperty* prop) | |
| { | |
| auto scriptInput = ScriptInput::from(prop); | |
| if (scriptInput != nullptr) | |
| { | |
| scriptInput->scriptedObject(this); | |
| } | |
| CustomPropertyContainer::addProperty(prop); | |
| } |