First attempt at defaulting to statemachine
diff --git a/include/rive/artboard.hpp b/include/rive/artboard.hpp index 2dfc2f5..34def2f 100644 --- a/include/rive/artboard.hpp +++ b/include/rive/artboard.hpp
@@ -23,6 +23,7 @@ class NestedArtboard; class ArtboardInstance; class LinearAnimationInstance; + class Scene; class StateMachineInstance; class Artboard : public ArtboardBase, public CoreContext, public ShapePaintContainer { @@ -120,17 +121,18 @@ size_t stateMachineCount() const { return m_StateMachines.size(); } std::string stateMachineNameAt(size_t index) const; - LinearAnimation* firstAnimation() const; + LinearAnimation* firstAnimation() const { return animation(0); } LinearAnimation* animation(const std::string& name) const; LinearAnimation* animation(size_t index) const; - StateMachine* firstStateMachine() const; + StateMachine* firstStateMachine() const { return stateMachine(0); } 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; + /// always autoplay this StateMachine. Returns -1 if it was not + // provided. + int defaultStateMachineIndex() const; /// Make an instance of this artboard, must be explictly deleted when no /// longer needed. @@ -164,7 +166,18 @@ std::unique_ptr<StateMachineInstance> stateMachineAt(size_t index); std::unique_ptr<StateMachineInstance> stateMachineNamed(const std::string& name); - std::unique_ptr<StateMachineInstance> defaultStateMachineInstance(); + + /// When provided, the designer has specified that this artboard should + /// always autoplay this StateMachine instance. If it was not specified, + /// this returns nullptr. + std::unique_ptr<StateMachineInstance> defaultStateMachine(); + + // This attemps to always return *something*, in this search order: + // 1. default statemachine instance + // 2. first statemachine instance + // 3. first animation instance + // 4. nullptr + std::unique_ptr<Scene> defaultScene(); }; } // namespace rive
diff --git a/skia/viewer/src/main.cpp b/skia/viewer/src/main.cpp index 2818f58..16d1096 100644 --- a/skia/viewer/src/main.cpp +++ b/skia/viewer/src/main.cpp
@@ -45,6 +45,8 @@ std::vector<std::string> animationNames; std::vector<std::string> stateMachineNames; +constexpr int REQUEST_DEFAULT_SCENE = -1; + #include <time.h> double GetSecondsToday() { time_t m_time; @@ -89,8 +91,6 @@ } void initStateMachine(int index) { - stateMachineIndex = index; - animationIndex = -1; assert(fileBytes.size() != 0); auto file = rive::File::import(rive::toSpan(fileBytes), &skiaFactory); if (!file) { @@ -98,6 +98,9 @@ fprintf(stderr, "failed to import file\n"); return; } + + stateMachineIndex = -1; + animationIndex = -1; currentScene = nullptr; artboardInstance = nullptr; @@ -106,8 +109,24 @@ artboardInstance->advance(0.0f); loadNames(artboardInstance.get()); - if (index >= 0 && index < artboardInstance->stateMachineCount()) { + if (index < 0) { + currentScene = artboardInstance->defaultStateMachine(); + index = artboardInstance->defaultStateMachineIndex(); + } + if (!currentScene) { + if (index >= artboardInstance->stateMachineCount()) { + index = 0; + } currentScene = artboardInstance->stateMachineAt(index); + } + if (!currentScene) { + index = -1; + currentScene = artboardInstance->animationAt(0); + animationIndex = 0; + } + stateMachineIndex = index; + + if (currentScene) { currentScene->inputCount(); } } @@ -175,7 +194,7 @@ fprintf(stderr, "failed to read all of %s\n", filename.c_str()); return; } - initAnimation(0); + initStateMachine(REQUEST_DEFAULT_SCENE); } int main() {
diff --git a/src/artboard.cpp b/src/artboard.cpp index 58e9cae..349e81e 100644 --- a/src/artboard.cpp +++ b/src/artboard.cpp
@@ -481,13 +481,6 @@ return sm ? sm->name() : nullptr; } -LinearAnimation* Artboard::firstAnimation() const { - if (m_Animations.empty()) { - return nullptr; - } - return m_Animations.front(); -} - LinearAnimation* Artboard::animation(const std::string& name) const { for (auto animation : m_Animations) { if (animation->name() == name) { @@ -504,13 +497,6 @@ return m_Animations[index]; } -StateMachine* Artboard::firstStateMachine() const { - if (m_StateMachines.empty()) { - return nullptr; - } - return m_StateMachines.front(); -} - StateMachine* Artboard::stateMachine(const std::string& name) const { for (auto machine : m_StateMachines) { if (machine->name() == name) { @@ -527,11 +513,12 @@ return m_StateMachines[index]; } -StateMachine* Artboard::defaultStateMachine() const { - if (defaultStateMachineId() >= m_StateMachines.size()) { - return nullptr; +int Artboard::defaultStateMachineIndex() const { + int index = defaultStateMachineId(); + if ((size_t)index >= m_StateMachines.size()) { + index = -1; } - return m_StateMachines[defaultStateMachineId()]; + return index; } std::unique_ptr<ArtboardInstance> Artboard::instance() const { @@ -617,7 +604,18 @@ return sm ? std::make_unique<StateMachineInstance>(sm, this) : nullptr; } -std::unique_ptr<StateMachineInstance> ArtboardInstance::defaultStateMachineInstance() { - auto sm = this->defaultStateMachine(); - return sm ? std::make_unique<StateMachineInstance>(sm, this) : nullptr; +std::unique_ptr<StateMachineInstance> ArtboardInstance::defaultStateMachine() { + const int index = this->defaultStateMachineIndex(); + return index >= 0 ? this->stateMachineAt(index) : nullptr; +} + +std::unique_ptr<Scene> ArtboardInstance::defaultScene() { + std::unique_ptr<Scene> scene = this->defaultStateMachine(); + if (!scene) { + scene = this->stateMachineAt(0); + } + if (!scene) { + scene = this->animationAt(0); + } + return scene; } \ No newline at end of file