blob: 363c3f8e79fe7b10bf15c28f8a4d42f8e216edc4 [file] [log] [blame]
#include "rive/animation/state_machine_layer.hpp"
#include "rive/importers/import_stack.hpp"
#include "rive/importers/state_machine_importer.hpp"
#include "rive/generated/animation/state_machine_base.hpp"
#include "rive/animation/any_state.hpp"
#include "rive/animation/entry_state.hpp"
#include "rive/animation/exit_state.hpp"
using namespace rive;
StateMachineLayer::~StateMachineLayer() {
for (auto state : m_States) {
delete state;
}
}
StatusCode StateMachineLayer::onAddedDirty(CoreContext* context) {
StatusCode code;
for (auto state : m_States) {
if ((code = state->onAddedDirty(context)) != StatusCode::Ok) {
return code;
}
switch (state->coreType()) {
case AnyState::typeKey:
m_Any = state->as<AnyState>();
break;
case EntryState::typeKey:
m_Entry = state->as<EntryState>();
break;
case ExitState::typeKey:
m_Exit = state->as<ExitState>();
break;
}
}
if (m_Any == nullptr || m_Entry == nullptr || m_Exit == nullptr) {
// The layer is corrupt, we must have all three of these states.
return StatusCode::InvalidObject;
}
return StatusCode::Ok;
}
StatusCode StateMachineLayer::onAddedClean(CoreContext* context) {
StatusCode code;
for (auto state : m_States) {
if ((code = state->onAddedClean(context)) != StatusCode::Ok) {
return code;
}
}
return StatusCode::Ok;
}
void StateMachineLayer::addState(LayerState* state) { m_States.push_back(state); }
StatusCode StateMachineLayer::import(ImportStack& importStack) {
auto stateMachineImporter = importStack.latest<StateMachineImporter>(StateMachineBase::typeKey);
if (stateMachineImporter == nullptr) {
return StatusCode::MissingObject;
}
stateMachineImporter->addLayer(this);
return Super::import(importStack);
}