blob: 3aaec6813375090532e59f216c86d67c234717a5 [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;
}
// WOW -- we're handing off ownership of this!
stateMachineImporter->addLayer(std::unique_ptr<StateMachineLayer>(this));
return Super::import(importStack);
}