blob: 63618843c13f73abbdd32ecb8ee9472b0d1eae0c [file] [log] [blame]
#include "rive/importers/state_machine_layer_importer.hpp"
#include "rive/importers/artboard_importer.hpp"
#include "rive/animation/state_machine_layer.hpp"
#include "rive/animation/animation_state.hpp"
#include "rive/animation/state_transition.hpp"
#include "rive/artboard.hpp"
using namespace rive;
StateMachineLayerImporter::StateMachineLayerImporter(StateMachineLayer* layer,
const Artboard* artboard) :
m_Layer(layer), m_Artboard(artboard) {}
void StateMachineLayerImporter::addState(LayerState* state) { m_Layer->addState(state); }
StatusCode StateMachineLayerImporter::resolve() {
for (auto state : m_Layer->m_States) {
if (state->is<AnimationState>()) {
auto animationState = state->as<AnimationState>();
if (animationState->animationId() < m_Artboard->animationCount()) {
animationState->m_Animation = m_Artboard->animation(animationState->animationId());
if (animationState->m_Animation == nullptr) {
return StatusCode::MissingObject;
}
}
}
for (auto transition : state->m_Transitions) {
if ((size_t)transition->stateToId() < m_Layer->m_States.size()) {
transition->m_StateTo = m_Layer->m_States[transition->stateToId()];
} else {
return StatusCode::InvalidObject;
}
}
}
return StatusCode::Ok;
}
bool StateMachineLayerImporter::readNullObject() {
// Add an 'empty' generic state that can be transitioned to/from but doesn't
// effectively do anything. This allows us to deal with unexpected new state
// types the runtime won't be able to understand. It'll still be able to
// make use of the state but it won't do anything visually.
addState(new LayerState());
return true;
}