From 86d2e6a6148eb000d269add0eded9ca79fd14727 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 8 Sep 2026 19:38:25 +0300 Subject: [PATCH] add assets.parse_animation --- res/modules/internal/formats/vca.lua | 7 +++---- src/assets/assetload_funcs.cpp | 2 +- src/logic/scripting/lua/libs/libassets.cpp | 16 ++++++++++++++++ src/logic/scripting/scripting.cpp | 8 +++++++- src/logic/scripting/scripting.hpp | 1 + 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/res/modules/internal/formats/vca.lua b/res/modules/internal/formats/vca.lua index 1cc48f0e3..ec63772b4 100644 --- a/res/modules/internal/formats/vca.lua +++ b/res/modules/internal/formats/vca.lua @@ -97,14 +97,13 @@ local function parse_track(root) return raw_track end -local function load_vca(filepath) - local source = file.read(filepath) +local function load_vca(source, filepath) local raw_track = parse_track(xml.parse_vcd(source, "track")) debug.print(raw_track) return animation.compile_track(raw_track, filepath) end -function internals.load_vca_animation(filepath, identifier) - local track = load_vca(filepath) +function internals.load_vca_animation(filepath, source, identifier) + local track = load_vca(source or file.read(filepath), filepath) internals.store_animation(identifier, track) end diff --git a/src/assets/assetload_funcs.cpp b/src/assets/assetload_funcs.cpp index 7b231fecf..f6080cd1c 100644 --- a/src/assets/assetload_funcs.cpp +++ b/src/assets/assetload_funcs.cpp @@ -55,7 +55,7 @@ assetload::postfunc assetload::animation( loader.attachToFile(path, {name, AssetType::ANIMATION}); if (io::is_regular_file(path)) { - scripting::load_vca_animation(path, name); + scripting::load_vca_animation(path, nullptr, name); } return [](auto&) {}; } diff --git a/src/logic/scripting/lua/libs/libassets.cpp b/src/logic/scripting/lua/libs/libassets.cpp index a9691038e..9a61ce9a8 100644 --- a/src/logic/scripting/lua/libs/libassets.cpp +++ b/src/logic/scripting/lua/libs/libassets.cpp @@ -11,6 +11,7 @@ #include "graphics/commons/Model.hpp" #include "graphics/core/Atlas.hpp" #include "graphics/core/Texture.hpp" +#include "io/io.hpp" #include "util/Buffer.hpp" using namespace scripting; @@ -66,6 +67,20 @@ static int l_load_texture(lua::State* L) { return 0; } +static int l_parse_animation(lua::State* L) { + auto format = lua::require_lstring(L, 1); + auto string = lua::require_lstring(L, 2); + std::string name = lua::require_string(L, 3); + + if (format != "vca") { + throw std::runtime_error( + "unknown format " + util::quote(std::string(format)) + ); + } + scripting::load_vca_animation(name, &string, name); + return 0; +} + static int l_parse_model(lua::State* L) { auto& assets = engine->requireAssets(); @@ -161,6 +176,7 @@ static int l_to_canvas(lua::State* L) { const luaL_Reg assetslib[] = { {"request_texture", lua::wrap}, {"load_texture", lua::wrap}, + {"parse_animation", lua::wrap}, {"parse_model", lua::wrap}, {"to_canvas", lua::wrap}, {nullptr, nullptr} diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 071380a63..efaf32866 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -844,13 +844,19 @@ void scripting::load_layout_script( void scripting::load_vca_animation( const io::path& file, + const std::string_view* content, const std::string& identifier ) { auto L = lua::get_main_state(); if (lua::get_from_registry(L, lua::INTERNALS_TABLE, "load_vca_animation", true)) { lua::pushlstring(L, file.string()); + if (content) { + lua::pushlstring(L, *content); + } else { + lua::pushnil(L); + } lua::pushlstring(L, identifier); - if (lua::call(L, 2, 0)) { + if (lua::call(L, 3, 0)) { lua::pop(L); } lua::pop(L); diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index da04d7bab..116226aff 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -257,6 +257,7 @@ namespace scripting { void load_vca_animation( const io::path& file, + const std::string_view* content, const std::string& identifier );