Adding ability to use a specific instance of an artboard.
diff --git a/include/rive/artboard.hpp b/include/rive/artboard.hpp index a7ec00c..e59518f 100644 --- a/include/rive/artboard.hpp +++ b/include/rive/artboard.hpp
@@ -97,6 +97,10 @@ /// longer needed. Artboard* instance() const; + /// Make an instance of this artboard using a concrete object, allowing + /// for inheriting from Artboard to add runtime specific functionality. + Artboard* instance(Artboard* instanceObject) const; + /// Returns true if the artboard is an instance of another bool isInstance() const { return m_IsInstance; } };
diff --git a/src/artboard.cpp b/src/artboard.cpp index 8840a03..340dc7a 100644 --- a/src/artboard.cpp +++ b/src/artboard.cpp
@@ -512,11 +512,12 @@ return m_StateMachines[index]; } -Artboard* Artboard::instance() const +Artboard* Artboard::instance(Artboard* instanceObject) const { - auto artboardClone = clone()->as<Artboard>(); + // Must be a fresh instance. + assert(instanceObject->m_Objects.empty()); - artboardClone->m_Objects.push_back(artboardClone); + instanceObject->m_Objects.push_back(instanceObject); // Skip first object (artboard). auto itr = m_Objects.begin(); @@ -524,26 +525,32 @@ { auto object = *itr; - artboardClone->m_Objects.push_back(object == nullptr ? nullptr - : object->clone()); + instanceObject->m_Objects.push_back( + object == nullptr ? nullptr : object->clone()); } for (auto animation : m_Animations) { - artboardClone->m_Animations.push_back(animation); + instanceObject->m_Animations.push_back(animation); } for (auto stateMachine : m_StateMachines) { - artboardClone->m_StateMachines.push_back(stateMachine); + instanceObject->m_StateMachines.push_back(stateMachine); } - if (artboardClone->initialize() != StatusCode::Ok) + if (instanceObject->initialize() != StatusCode::Ok) { - delete artboardClone; - artboardClone = nullptr; + delete instanceObject; + instanceObject = nullptr; } - artboardClone->m_IsInstance = true; + instanceObject->m_IsInstance = true; - return artboardClone; + return instanceObject; +} + +Artboard* Artboard::instance() const +{ + auto artboardClone = clone()->as<Artboard>(); + return instance(artboardClone); } \ No newline at end of file