blob: 6419ff78594874e6035761a7c18aaa5094f00589 [file]
#ifndef _RIVE_STATE_MACHINE_LAYER_HPP_
#define _RIVE_STATE_MACHINE_LAYER_HPP_
#include "rive/generated/animation/state_machine_layer_base.hpp"
#include <stdio.h>
#include <vector>
namespace rive
{
class LayerState;
class StateMachineLayerImporter;
class AnyState;
class EntryState;
class ExitState;
class StateMachineLayer : public StateMachineLayerBase
{
friend class StateMachineLayerImporter;
private:
std::vector<LayerState*> m_States;
AnyState* m_Any = nullptr;
EntryState* m_Entry = nullptr;
ExitState* m_Exit = nullptr;
void addState(LayerState* state);
public:
~StateMachineLayer() override;
StatusCode onAddedDirty(CoreContext* context) override;
StatusCode onAddedClean(CoreContext* context) override;
StatusCode import(ImportStack& importStack) override;
const AnyState* anyState() const { return m_Any; }
const EntryState* entryState() const { return m_Entry; }
const ExitState* exitState() const { return m_Exit; }
size_t stateCount() const
{
#ifdef WITH_RIVE_EDITOR
if (m_States.empty())
{
return m_editorStates.size();
}
#endif
return m_States.size();
}
LayerState* state(size_t index) const
{
if (index < m_States.size())
{
return m_States[index];
}
#ifdef WITH_RIVE_EDITOR
if (m_States.empty() && index < m_editorStates.size())
{
return m_editorStates[index];
}
#endif
return nullptr;
}
#ifdef WITH_RIVE_EDITOR
// Editor-only parallel non-owning state list. `m_States` is
// owned (see `StateMachineLayer::~StateMachineLayer`), so coop-
// hydrated LayerStates (owned by `EditorFile::m_arena`) cannot
// share that list. Special states (Any/Entry/Exit) are slotted
// into the corresponding pointer members during
// `addStateForEditor`, mirroring `onAddedDirty`.
void addStateForEditor(LayerState* state);
void clearEditorStates();
size_t editorStateCount() const { return m_editorStates.size(); }
#endif
private:
#ifdef WITH_RIVE_EDITOR
std::vector<LayerState*> m_editorStates;
#endif
};
} // namespace rive
#endif