blob: bd17743e1e6d8aeec56cd9d5284fd497e93138d6 [file] [log] [blame]
#include "rive/animation/state_machine_event.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/event_input_change.hpp"
using namespace rive;
void StateMachineEvent::addInputChange(EventInputChange* inputChange) {
m_InputChanges.push_back(inputChange);
}
StatusCode StateMachineEvent::import(ImportStack& importStack) {
auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachineBase::typeKey);
if (stateMachineImporter == nullptr) {
return StatusCode::MissingObject;
}
// Handing off ownership of this!
stateMachineImporter->addEvent(std::unique_ptr<StateMachineEvent>(this));
return Super::import(importStack);
}
const EventInputChange* StateMachineEvent::inputChange(size_t index) const {
if (index < m_InputChanges.size()) {
return m_InputChanges[index];
}
return nullptr;
}
StatusCode StateMachineEvent::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 StateMachineEvent::performChanges(StateMachineInstance* stateMachineInstance) const {
for (auto inputChange : m_InputChanges) {
inputChange->perform(stateMachineInstance);
}
}