Skip to content

Commit fbb6d6e

Browse files
committed
Default scene API idea
1 parent 9e6a9a3 commit fbb6d6e

File tree

4 files changed

+80
-9
lines changed

4 files changed

+80
-9
lines changed

include/rive/scene.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ namespace rive {
5151
virtual SMIBool* getBool(const std::string&) const;
5252
virtual SMINumber* getNumber(const std::string&) const;
5353
virtual SMITrigger* getTrigger(const std::string&) const;
54+
55+
static std::unique_ptr<Scene> importDefault(Span<uint8_t>, Factory*);
5456
};
5557

5658
} // namespace rive

src/scene_default.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
#include "rive/artboard.hpp"
2+
#include "rive/file.hpp"
3+
#include "rive/scene.hpp"
4+
5+
using namespace rive;
6+
7+
class SelfContainedScene : public Scene {
8+
std::unique_ptr<File> m_File;
9+
std::unique_ptr<ArtboardInstance> m_ABI;
10+
std::unique_ptr<Scene> m_Scene;
11+
12+
public:
13+
SelfContainedScene(std::unique_ptr<File> file,
14+
std::unique_ptr<ArtboardInstance> abi,
15+
std::unique_ptr<Scene> scene)
16+
: Scene(abi.get())
17+
, m_File(std::move(file))
18+
, m_ABI(std::move(abi))
19+
, m_Scene(std::move(scene)) {}
20+
21+
~SelfContainedScene() = default;
22+
23+
// Forward to our m_Scene
24+
25+
std::string name() const { return m_Scene->name(); }
26+
Loop loop() const { return m_Scene->loop(); }
27+
bool isTranslucent() const { return m_Scene->isTranslucent(); }
28+
float durationSeconds() const { return m_Scene->durationSeconds(); }
29+
bool advanceAndApply(float seconds) { return m_Scene->advanceAndApply(seconds); }
30+
31+
void draw(Renderer* renderer) { return m_Scene->draw(renderer); }
32+
void pointerDown(Vec2D pos) { return m_Scene->pointerDown(pos); }
33+
void pointerMove(Vec2D pos) { return m_Scene->pointerMove(pos); }
34+
void pointerUp(Vec2D pos) { return m_Scene->pointerUp(pos); }
35+
36+
size_t inputCount() const { return m_Scene->inputCount(); }
37+
SMIInput* input(size_t index) const { return m_Scene->input(index); }
38+
SMIBool* getBool(const std::string& name) const { return m_Scene->getBool(name); }
39+
SMINumber* getNumber(const std::string& name) const { return m_Scene->getNumber(name); }
40+
SMITrigger* getTrigger(const std::string& name) const { return m_Scene->getTrigger(name); }
41+
};
42+
43+
std::unique_ptr<Scene> Scene::importDefault(Span<uint8_t> span, Factory* factory) {
44+
auto file = File::import(span, factory);
45+
if (file) {
46+
auto abi = file->artboardDefault();
47+
if (abi) {
48+
auto scene = abi->defaultScene();
49+
if (scene) {
50+
return std::make_unique<SelfContainedScene>(std::move(file),
51+
std::move(abi),
52+
std::move(scene));
53+
}
54+
}
55+
}
56+
return nullptr;
57+
}

test/default_state_machine_test.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,9 @@ TEST_CASE("default state machine is detected at load", "[file]") {
2929
REQUIRE(scene != nullptr);
3030
REQUIRE(scene->name() == smi->name());
3131
}
32+
33+
TEST_CASE("load default scene", "[file]") {
34+
auto bytes = ReadFile("../../test/assets/entry.riv");
35+
auto scene = rive::Scene::importDefault(rive::toSpan(bytes), &rive::gNoOpFactory);
36+
REQUIRE(scene.get());
37+
}

test/rive_file_reader.hpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,9 @@
55
#include "rive_testing.hpp"
66
#include "no_op_factory.hpp"
77

8-
static inline std::unique_ptr<rive::File>
9-
ReadRiveFile(const char path[],
10-
rive::Factory* factory = nullptr,
11-
rive::FileAssetResolver* resolver = nullptr) {
12-
if (!factory) {
13-
factory = &rive::gNoOpFactory;
14-
}
15-
8+
static inline std::vector<uint8_t> ReadFile(const char path[]) {
169
FILE* fp = fopen(path, "rb");
17-
REQUIRE(fp != nullptr);
10+
REQUIRE(fp);
1811

1912
fseek(fp, 0, SEEK_END);
2013
const size_t length = ftell(fp);
@@ -23,6 +16,19 @@ ReadRiveFile(const char path[],
2316
REQUIRE(fread(bytes.data(), 1, length, fp) == length);
2417
fclose(fp);
2518

19+
return bytes;
20+
}
21+
22+
static inline std::unique_ptr<rive::File>
23+
ReadRiveFile(const char path[],
24+
rive::Factory* factory = nullptr,
25+
rive::FileAssetResolver* resolver = nullptr) {
26+
if (!factory) {
27+
factory = &rive::gNoOpFactory;
28+
}
29+
30+
auto bytes = ReadFile(path);
31+
2632
rive::ImportResult result;
2733
auto file = rive::File::import(rive::toSpan(bytes), factory, &result, resolver);
2834
REQUIRE(result == rive::ImportResult::success);

0 commit comments

Comments
 (0)