blob: 294143d4f32059074185fa1b715ec22a38f4083e [file] [log] [blame]
#include "rive/animation/state_machine_listener.hpp"
#include "rive/importers/import_stack.hpp"
#include "rive/importers/state_machine_importer.hpp"
#include "rive/generated/animation/state_machine_base.hpp"
#include "rive/artboard.hpp"
#include "rive/shapes/shape.hpp"
#include "rive/animation/state_machine_instance.hpp"
#include "rive/animation/listener_input_change.hpp"
using namespace rive;
void StateMachineListener::addAction(ListenerAction* action) { m_Actions.push_back(action); }
StatusCode StateMachineListener::import(ImportStack& importStack) {
auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachineBase::typeKey);
if (stateMachineImporter == nullptr) {
return StatusCode::MissingObject;
}
// Handing off ownership of this!
stateMachineImporter->addListener(std::unique_ptr<StateMachineListener>(this));
return Super::import(importStack);
}
const ListenerAction* StateMachineListener::action(size_t index) const {
if (index < m_Actions.size()) {
return m_Actions[index];
}
return nullptr;
}
StatusCode StateMachineListener::onAddedClean(CoreContext* context) {
auto artboard = static_cast<Artboard*>(context);
auto target = artboard->resolve(targetId());
for (auto core : artboard->objects()) {
if (core == nullptr) {
continue;
}
// Iterate artboard to find Shapes that are parented to the target
if (core->is<Shape>()) {
auto shape = core->as<Shape>();
for (ContainerComponent* component = shape; component != nullptr;
component = component->parent()) {
if (component == target) {
auto index = artboard->idOf(shape);
if (index != 0) {
m_HitShapesIds.push_back(index);
}
break;
}
}
}
}
return Super::onAddedClean(context);
}
void StateMachineListener::performChanges(StateMachineInstance* stateMachineInstance,
Vec2D position) const {
for (auto action : m_Actions) {
action->perform(stateMachineInstance, position);
}
}