Load the entry state machine and access it via the public artboard api.
diff --git a/dev/defs/artboard.json b/dev/defs/artboard.json
index 05782ba..935d8d0 100644
--- a/dev/defs/artboard.json
+++ b/dev/defs/artboard.json
@@ -79,6 +79,17 @@
"description": "Id of the last open animation.",
"runtime": false,
"coop": false
+ },
+ "defaultStateMachineId": {
+ "type": "Id",
+ "typeRuntime": "uint",
+ "initialValue": "Core.missingId",
+ "initialValueRuntime": "-1",
+ "key": {
+ "int": 236,
+ "string": "defaultStateMachineId"
+ },
+ "description": "The default StateMachine attached to this artboard automatically when it is initialized."
}
}
}
\ No newline at end of file
diff --git a/include/rive/artboard.hpp b/include/rive/artboard.hpp
index 68effa7..3c52a68 100644
--- a/include/rive/artboard.hpp
+++ b/include/rive/artboard.hpp
@@ -68,7 +68,6 @@
Core* resolve(uint32_t id) const override;
-
/// Find the id of a component in the artboard the object in the artboard. The artboard
/// itself has id 0 so we use that as a flag for not found.
uint32_t idOf(Core* object) const;
@@ -129,6 +128,10 @@
StateMachine* stateMachine(const std::string& name) const;
StateMachine* stateMachine(size_t index) const;
+ /// When provided, the designer has specified that this artboard should
+ /// always autoplay this StateMachine.
+ StateMachine* defaultStateMachine() const;
+
/// Make an instance of this artboard, must be explictly deleted when no
/// longer needed.
// Deprecated...
diff --git a/include/rive/generated/artboard_base.hpp b/include/rive/generated/artboard_base.hpp
index 786b5df..f548975 100644
--- a/include/rive/generated/artboard_base.hpp
+++ b/include/rive/generated/artboard_base.hpp
@@ -2,6 +2,7 @@
#define _RIVE_ARTBOARD_BASE_HPP_
#include "rive/core/field_types/core_bool_type.hpp"
#include "rive/core/field_types/core_double_type.hpp"
+#include "rive/core/field_types/core_uint_type.hpp"
#include "rive/world_transform_component.hpp"
namespace rive {
class ArtboardBase : public WorldTransformComponent {
@@ -34,6 +35,7 @@
static const uint16_t yPropertyKey = 10;
static const uint16_t originXPropertyKey = 11;
static const uint16_t originYPropertyKey = 12;
+ static const uint16_t defaultStateMachineIdPropertyKey = 236;
private:
bool m_Clip = true;
@@ -43,6 +45,7 @@
float m_Y = 0.0f;
float m_OriginX = 0.0f;
float m_OriginY = 0.0f;
+ uint32_t m_DefaultStateMachineId = -1;
public:
inline bool clip() const { return m_Clip; }
@@ -108,6 +111,15 @@
originYChanged();
}
+ inline uint32_t defaultStateMachineId() const { return m_DefaultStateMachineId; }
+ void defaultStateMachineId(uint32_t value) {
+ if (m_DefaultStateMachineId == value) {
+ return;
+ }
+ m_DefaultStateMachineId = value;
+ defaultStateMachineIdChanged();
+ }
+
Core* clone() const override;
void copy(const ArtboardBase& object) {
m_Clip = object.m_Clip;
@@ -117,6 +129,7 @@
m_Y = object.m_Y;
m_OriginX = object.m_OriginX;
m_OriginY = object.m_OriginY;
+ m_DefaultStateMachineId = object.m_DefaultStateMachineId;
WorldTransformComponent::copy(object);
}
@@ -143,6 +156,9 @@
case originYPropertyKey:
m_OriginY = CoreDoubleType::deserialize(reader);
return true;
+ case defaultStateMachineIdPropertyKey:
+ m_DefaultStateMachineId = CoreUintType::deserialize(reader);
+ return true;
}
return WorldTransformComponent::deserialize(propertyKey, reader);
}
@@ -155,6 +171,7 @@
virtual void yChanged() {}
virtual void originXChanged() {}
virtual void originYChanged() {}
+ virtual void defaultStateMachineIdChanged() {}
};
} // namespace rive
diff --git a/include/rive/generated/core_registry.hpp b/include/rive/generated/core_registry.hpp
index 918498f..bf06626 100644
--- a/include/rive/generated/core_registry.hpp
+++ b/include/rive/generated/core_registry.hpp
@@ -439,6 +439,9 @@
case DrawRulesBase::drawTargetIdPropertyKey:
object->as<DrawRulesBase>()->drawTargetId(value);
break;
+ case ArtboardBase::defaultStateMachineIdPropertyKey:
+ object->as<ArtboardBase>()->defaultStateMachineId(value);
+ break;
case WeightBase::valuesPropertyKey:
object->as<WeightBase>()->values(value);
break;
@@ -905,6 +908,8 @@
return object->as<ImageBase>()->assetId();
case DrawRulesBase::drawTargetIdPropertyKey:
return object->as<DrawRulesBase>()->drawTargetId();
+ case ArtboardBase::defaultStateMachineIdPropertyKey:
+ return object->as<ArtboardBase>()->defaultStateMachineId();
case WeightBase::valuesPropertyKey:
return object->as<WeightBase>()->values();
case WeightBase::indicesPropertyKey:
@@ -1205,6 +1210,7 @@
case PolygonBase::pointsPropertyKey:
case ImageBase::assetIdPropertyKey:
case DrawRulesBase::drawTargetIdPropertyKey:
+ case ArtboardBase::defaultStateMachineIdPropertyKey:
case WeightBase::valuesPropertyKey:
case WeightBase::indicesPropertyKey:
case TendonBase::boneIdPropertyKey:
diff --git a/src/artboard.cpp b/src/artboard.cpp
index 56f1e6d..1d862b7 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -527,6 +527,13 @@
return m_StateMachines[index];
}
+StateMachine* Artboard::defaultStateMachine() const {
+ if (defaultStateMachineId() > m_StateMachines.size()) {
+ return nullptr;
+ }
+ return m_StateMachines[defaultStateMachineId()];
+}
+
std::unique_ptr<ArtboardInstance> Artboard::instance() const {
std::unique_ptr<ArtboardInstance> artboardClone(new ArtboardInstance);
artboardClone->copy(*this);