add support for rendering static scene

This is part of the work to allow users to record the stage instead of recording animations or state machines. It's mostly useful for pngs and svgs.
It introduces the class StaticScene that extends Scene to expose the same interface as LinearAnimationInstance and StateMachineInstance

Diffs=
3927ea695 add support for rendering static scene (#6192)

Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head
index a791ccf..7f2db16 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-1506b069c01a049034052e5de1cbc6a9cf029c2e
+3927ea695d20b79956788268b6938efcb6ab0efe
diff --git a/include/rive/artboard.hpp b/include/rive/artboard.hpp
index e21e34a..d284253 100644
--- a/include/rive/artboard.hpp
+++ b/include/rive/artboard.hpp
@@ -120,6 +120,7 @@
     AABB bounds() const;
 
     // Can we hide these from the public? (they use playable)
+    bool isTranslucent() const;
     bool isTranslucent(const LinearAnimation*) const;
     bool isTranslucent(const LinearAnimationInstance*) const;
 
diff --git a/include/rive/static_scene.hpp b/include/rive/static_scene.hpp
new file mode 100644
index 0000000..63147f8
--- /dev/null
+++ b/include/rive/static_scene.hpp
@@ -0,0 +1,26 @@
+#ifndef _RIVE_STATIC_SCENE_HPP_
+#define _RIVE_STATIC_SCENE_HPP_
+
+#include "rive/artboard.hpp"
+#include "rive/scene.hpp"
+
+namespace rive
+{
+class StaticScene : public Scene
+{
+public:
+    StaticScene(ArtboardInstance*);
+    ~StaticScene() override;
+
+    bool isTranslucent() const override;
+
+    std::string name() const override;
+
+    Loop loop() const override;
+
+    float durationSeconds() const override;
+
+    bool advanceAndApply(float seconds) override;
+};
+} // namespace rive
+#endif
diff --git a/src/artboard.cpp b/src/artboard.cpp
index 86dcfd7..bc22b8a 100644
--- a/src/artboard.cpp
+++ b/src/artboard.cpp
@@ -617,6 +617,18 @@
                : AABB::fromLTWH(-width() * originX(), -height() * originY(), width(), height());
 }
 
+bool Artboard::isTranslucent() const
+{
+    for (const auto sp : m_ShapePaints)
+    {
+        if (!sp->isTranslucent())
+        {
+            return false; // one opaque fill is sufficient to be opaque
+        }
+    }
+    return true;
+}
+
 bool Artboard::isTranslucent(const LinearAnimation* anim) const
 {
     // For now we're conservative/lazy -- if we see that any of our paints are
@@ -635,15 +647,7 @@
 
     // If we get here, we have no animations, so just check our paints for
     // opacity
-
-    for (const auto sp : m_ShapePaints)
-    {
-        if (!sp->isTranslucent())
-        {
-            return false; // one opaque fill is sufficient to be opaque
-        }
-    }
-    return true;
+    return this->isTranslucent();
 }
 
 bool Artboard::isTranslucent(const LinearAnimationInstance* inst) const
diff --git a/src/static_scene.cpp b/src/static_scene.cpp
new file mode 100644
index 0000000..97b0286
--- /dev/null
+++ b/src/static_scene.cpp
@@ -0,0 +1,23 @@
+#include "rive/static_scene.hpp"
+#include "rive/artboard.hpp"
+
+using namespace rive;
+
+StaticScene::StaticScene(ArtboardInstance* instance) : Scene(instance) {}
+
+StaticScene::~StaticScene() {}
+
+bool StaticScene::isTranslucent() const { return m_artboardInstance->isTranslucent(); };
+
+std::string StaticScene::name() const { return m_artboardInstance->name(); };
+
+Loop StaticScene::loop() const { return Loop::oneShot; };
+
+float StaticScene::durationSeconds() const { return 0; }
+
+bool StaticScene::advanceAndApply(float seconds)
+{
+    // We ignore the 'seconds' argument because it's not an animated scene
+    m_artboardInstance->advance(0);
+    return true;
+};
\ No newline at end of file