From 8422349e45d76bd3d53b03c1d7dc1b5df793ba9b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Thu, 3 Sep 2026 21:44:14 +0300 Subject: [PATCH] fix loaded tracks cache does not reset on assets reset --- res/modules/animation.lua | 11 +++++++- res/modules/internal/lifetime_events.lua | 2 +- src/engine/AssetsManagement.cpp | 32 +++++++++++++++--------- src/logic/scripting/scripting.cpp | 8 ++++++ src/logic/scripting/scripting.hpp | 3 +++ 5 files changed, 42 insertions(+), 14 deletions(-) diff --git a/res/modules/animation.lua b/res/modules/animation.lua index 302e23993..9bbc37343 100644 --- a/res/modules/animation.lua +++ b/res/modules/animation.lua @@ -208,6 +208,7 @@ function this.compile_track(raw_track, track_name) end local loaded_tracks = {} +local backup_tracks = {} function internals.store_animation(name, track) loaded_tracks[name] = track @@ -236,8 +237,16 @@ function internals.on_animation_frame() end end -function internals.stop_all_actions() +function internals.stop_animation_actions() running_actions = {} end +function internals.backup_and_clear_animation() + loaded_tracks, backup_tracks = backup_tracks, {} +end + +function internals.restore_animation_backup() + loaded_tracks, backup_tracks = backup_tracks, {} +end + return this diff --git a/res/modules/internal/lifetime_events.lua b/res/modules/internal/lifetime_events.lua index ced28eb99..d1750e4cb 100644 --- a/res/modules/internal/lifetime_events.lua +++ b/res/modules/internal/lifetime_events.lua @@ -168,7 +168,7 @@ gui_util.__reset_local = nil stdcomp.reset = nil function internals.on_world_quit() - internals.stop_all_actions() + internals.stop_animation_actions() __rules.clear() __gui_util_reset_local() __stdcomp_reset() diff --git a/src/engine/AssetsManagement.cpp b/src/engine/AssetsManagement.cpp index a71382835..2233b2d44 100644 --- a/src/engine/AssetsManagement.cpp +++ b/src/engine/AssetsManagement.cpp @@ -9,6 +9,7 @@ #include "graphics/core/Shader.hpp" #include "graphics/render/ModelsGenerator.hpp" #include "graphics/ui/GUI.hpp" +#include "logic/scripting/scripting.hpp" static debug::Logger logger("assets-management"); @@ -49,6 +50,8 @@ AssetsLoader& AssetsManagement::acquireBackgroundLoader() { void AssetsManagement::loadAssets(Content* content) { finishBackgroundLoader(); + scripting::on_assets_loading(); + const auto& paths = engine.getPaths(); logger.info() << "loading assets"; Shader::preprocessor->setPaths(&paths.resPaths); @@ -59,19 +62,24 @@ void AssetsManagement::loadAssets(Content* content) { AssetsLoader loader(engine, *newAssets, paths.resPaths); loader.addDefaults(content); - // no need - // correct log messages order is more useful - // todo: before setting to true, check if GLSLExtension thread safe - bool threading = false; // look at three upper lines - if (threading) { - auto task = loader.startTask( - [=]() {}, 0 - ); - task->waitForEnd(); - } else { - while (loader.hasNext()) { - loader.loadNext(); + try { + // no need + // correct log messages order is more useful + // todo: before setting to true, check if GLSLExtension thread safe + bool threading = false; // look at three upper lines + if (threading) { + auto task = loader.startTask( + [=]() {}, 0 + ); + task->waitForEnd(); + } else { + while (loader.hasNext()) { + loader.loadNext(); + } } + } catch (...) { + scripting::revert_assets_loading(); + throw; } assets = std::move(newAssets); if (content) { diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index 87c07caf4..071380a63 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -260,6 +260,14 @@ static int push_properties_tables( return 1; } +void scripting::on_assets_loading() { + lua::call_internal(lua::get_main_state(), "backup_and_clear_animation"); +} + +void scripting::revert_assets_loading() { + lua::call_internal(lua::get_main_state(), "restore_animation_backup"); +} + void scripting::on_content_load(Content* content) { scripting::content = content; scripting::indices = content->getIndices(); diff --git a/src/logic/scripting/scripting.hpp b/src/logic/scripting/scripting.hpp index a80a6681b..da04d7bab 100644 --- a/src/logic/scripting/scripting.hpp +++ b/src/logic/scripting/scripting.hpp @@ -50,6 +50,9 @@ namespace scripting { void initialize(Engine& engine); + void on_assets_loading(); + void revert_assets_loading(); + void on_content_load(Content* content); void on_content_reset();