fix loaded tracks cache does not reset on assets reset

This commit is contained in:
MihailRis 2026-09-03 21:44:14 +03:00
parent bbdf31fc19
commit 8422349e45
5 changed files with 42 additions and 14 deletions

View file

@ -208,6 +208,7 @@ function this.compile_track(raw_track, track_name)
end end
local loaded_tracks = {} local loaded_tracks = {}
local backup_tracks = {}
function internals.store_animation(name, track) function internals.store_animation(name, track)
loaded_tracks[name] = track loaded_tracks[name] = track
@ -236,8 +237,16 @@ function internals.on_animation_frame()
end end
end end
function internals.stop_all_actions() function internals.stop_animation_actions()
running_actions = {} running_actions = {}
end 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 return this

View file

@ -168,7 +168,7 @@ gui_util.__reset_local = nil
stdcomp.reset = nil stdcomp.reset = nil
function internals.on_world_quit() function internals.on_world_quit()
internals.stop_all_actions() internals.stop_animation_actions()
__rules.clear() __rules.clear()
__gui_util_reset_local() __gui_util_reset_local()
__stdcomp_reset() __stdcomp_reset()

View file

@ -9,6 +9,7 @@
#include "graphics/core/Shader.hpp" #include "graphics/core/Shader.hpp"
#include "graphics/render/ModelsGenerator.hpp" #include "graphics/render/ModelsGenerator.hpp"
#include "graphics/ui/GUI.hpp" #include "graphics/ui/GUI.hpp"
#include "logic/scripting/scripting.hpp"
static debug::Logger logger("assets-management"); static debug::Logger logger("assets-management");
@ -49,6 +50,8 @@ AssetsLoader& AssetsManagement::acquireBackgroundLoader() {
void AssetsManagement::loadAssets(Content* content) { void AssetsManagement::loadAssets(Content* content) {
finishBackgroundLoader(); finishBackgroundLoader();
scripting::on_assets_loading();
const auto& paths = engine.getPaths(); const auto& paths = engine.getPaths();
logger.info() << "loading assets"; logger.info() << "loading assets";
Shader::preprocessor->setPaths(&paths.resPaths); Shader::preprocessor->setPaths(&paths.resPaths);
@ -59,19 +62,24 @@ void AssetsManagement::loadAssets(Content* content) {
AssetsLoader loader(engine, *newAssets, paths.resPaths); AssetsLoader loader(engine, *newAssets, paths.resPaths);
loader.addDefaults(content); loader.addDefaults(content);
// no need try {
// correct log messages order is more useful // no need
// todo: before setting to true, check if GLSLExtension thread safe // correct log messages order is more useful
bool threading = false; // look at three upper lines // todo: before setting to true, check if GLSLExtension thread safe
if (threading) { bool threading = false; // look at three upper lines
auto task = loader.startTask( if (threading) {
[=]() {}, 0 auto task = loader.startTask(
); [=]() {}, 0
task->waitForEnd(); );
} else { task->waitForEnd();
while (loader.hasNext()) { } else {
loader.loadNext(); while (loader.hasNext()) {
loader.loadNext();
}
} }
} catch (...) {
scripting::revert_assets_loading();
throw;
} }
assets = std::move(newAssets); assets = std::move(newAssets);
if (content) { if (content) {

View file

@ -260,6 +260,14 @@ static int push_properties_tables(
return 1; 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) { void scripting::on_content_load(Content* content) {
scripting::content = content; scripting::content = content;
scripting::indices = content->getIndices(); scripting::indices = content->getIndices();

View file

@ -50,6 +50,9 @@ namespace scripting {
void initialize(Engine& engine); void initialize(Engine& engine);
void on_assets_loading();
void revert_assets_loading();
void on_content_load(Content* content); void on_content_load(Content* content);
void on_content_reset(); void on_content_reset();