| #include "rive_mgr.hpp" | |
| #include "rive/animation/linear_animation_instance.hpp" | |
| #include "rive/animation/state_machine_instance.hpp" | |
| #include "rive/artboard.hpp" | |
| #include "rive/factory.hpp" | |
| #include "rive/file.hpp" | |
| #include "rive/refcnt.hpp" | |
| struct AutoClose | |
| { | |
| FILE* m_File; | |
| AutoClose(FILE* file) : m_File(file) {} | |
| ~AutoClose() { this->close(); } | |
| void close() | |
| { | |
| if (m_File) | |
| { | |
| fclose(m_File); | |
| m_File = nullptr; | |
| } | |
| } | |
| }; | |
| RiveMgr::RiveMgr(rive::Factory* factory) : m_Factory(factory) {} | |
| RiveMgr::~RiveMgr() {} | |
| bool RiveMgr::loadArtboard(const char filename[], const char artboard[]) | |
| { | |
| m_File = nullptr; | |
| m_Artboard = nullptr; | |
| m_Scene = nullptr; | |
| m_File = RiveMgr::loadFile(filename, m_Factory); | |
| if (m_File) | |
| { | |
| m_Artboard = (artboard && artboard[0]) ? m_File->artboardNamed(artboard) | |
| : m_File->artboardDefault(); | |
| } | |
| return m_Artboard != nullptr; | |
| } | |
| bool RiveMgr::loadAnimation(const char filename[], | |
| const char artboard[], | |
| const char animation[]) | |
| { | |
| if (this->loadArtboard(filename, artboard)) | |
| { | |
| m_Scene = (animation && animation[0]) | |
| ? m_Artboard->animationNamed(animation) | |
| : m_Artboard->animationAt(0); | |
| } | |
| return m_Scene != nullptr; | |
| } | |
| bool RiveMgr::loadMachine(const char filename[], | |
| const char artboard[], | |
| const char machine[]) | |
| { | |
| if (this->loadArtboard(filename, artboard)) | |
| { | |
| m_Scene = (machine && machine[0]) | |
| ? m_Artboard->stateMachineNamed(machine) | |
| : m_Artboard->stateMachineAt(0); | |
| } | |
| return m_Scene != nullptr; | |
| } | |
| static void log(const char msg[], const char arg[] = nullptr) | |
| { | |
| std::string err(msg); | |
| if (arg) | |
| { | |
| err = err + std::string(arg); | |
| } | |
| fprintf(stderr, "%s\n", err.c_str()); | |
| } | |
| rive::rcp<rive::File> RiveMgr::loadFile(const char filename[], | |
| rive::Factory* factory) | |
| { | |
| AutoClose afc(fopen(filename, "rb")); | |
| FILE* fp = afc.m_File; | |
| if (fp == nullptr) | |
| { | |
| log("Failed to open file ", filename); | |
| return nullptr; | |
| } | |
| fseek(fp, 0, SEEK_END); | |
| auto length = ftell(fp); | |
| fseek(fp, 0, SEEK_SET); | |
| std::vector<uint8_t> bytes(length); | |
| if (fread(bytes.data(), 1, length, fp) != length) | |
| { | |
| log("Failed to read file into bytes array ", filename); | |
| return nullptr; | |
| } | |
| auto file = rive::File::import(bytes, factory); | |
| if (!file) | |
| { | |
| log("Failed to read bytes into Rive file ", filename); | |
| } | |
| return file; | |
| } |