Skip to content

Commit ba00f65

Browse files
committed
Default scene API idea
1 parent 2ca07f5 commit ba00f65

File tree

4 files changed

+81
-9
lines changed

4 files changed

+81
-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: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
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+
30+
bool advanceAndApply(float seconds) { return m_Scene->advanceAndApply(seconds); }
31+
void draw(Renderer* renderer) { return m_Scene->draw(renderer); }
32+
33+
void pointerDown(Vec2D pos) { return m_Scene->pointerDown(pos); }
34+
void pointerMove(Vec2D pos) { return m_Scene->pointerMove(pos); }
35+
void pointerUp(Vec2D pos) { return m_Scene->pointerUp(pos); }
36+
37+
size_t inputCount() const { return m_Scene->inputCount(); }
38+
SMIInput* input(size_t index) const { return m_Scene->input(index); }
39+
SMIBool* getBool(const std::string& name) const { return m_Scene->getBool(name); }
40+
SMINumber* getNumber(const std::string& name) const { return m_Scene->getNumber(name); }
41+
SMITrigger* getTrigger(const std::string& name) const { return m_Scene->getTrigger(name); }
42+
};
43+
44+
std::unique_ptr<Scene> Scene::importDefault(Span<uint8_t> span, Factory* factory) {
45+
auto file = File::import(span, factory);
46+
if (file) {
47+
auto abi = file->artboardDefault();
48+
if (abi) {
49+
auto scene = abi->defaultScene();
50+
if (scene) {
51+
return std::make_unique<SelfContainedScene>(std::move(file),
52+
std::move(abi),
53+
std::move(scene));
54+
}
55+
}
56+
}
57+
return nullptr;
58+
}

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
@@ -6,16 +6,9 @@
66
#include "no_op_factory.hpp"
77
#include "../src/render_counter.hpp"
88

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

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

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

0 commit comments

Comments
 (0)