From 9d3a60328f7a44e0361a31e2e8c5b9079282810b Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 30 Jun 2026 22:53:22 +0300 Subject: [PATCH] fix dead skeleton model references --- src/logic/scripting/lua/libs/lib__skeleton.cpp | 6 +++--- src/objects/rigging.cpp | 12 +++++++----- src/objects/rigging.hpp | 4 ++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/logic/scripting/lua/libs/lib__skeleton.cpp b/src/logic/scripting/lua/libs/lib__skeleton.cpp index 2fb5d4fa0..f1f058b23 100644 --- a/src/logic/scripting/lua/libs/lib__skeleton.cpp +++ b/src/logic/scripting/lua/libs/lib__skeleton.cpp @@ -42,7 +42,7 @@ static int l_get_model(lua::State* L) { auto& rigConfig = *skeleton->config; auto index = index_range_check(*skeleton, lua::tointeger(L, 2)); const auto& modelOverride = skeleton->modelOverrides[index]; - if (!modelOverride.model) { + if (!modelOverride.model.expired()) { return lua::pushstring(L, modelOverride.name); } return lua::pushstring(L, rigConfig.getBones()[index]->model.name); @@ -55,9 +55,9 @@ static int l_set_model(lua::State* L) { auto index = index_range_check(*skeleton, lua::tointeger(L, 2)); auto& modelOverride = skeleton->modelOverrides[index]; if (lua::isnoneornil(L, 3)) { - modelOverride = {"", nullptr, true}; + modelOverride = {"", {}, true}; } else { - modelOverride = {lua::require_string(L, 3), nullptr, true}; + modelOverride = {lua::require_string(L, 3), {}, true}; } } return 0; diff --git a/src/objects/rigging.cpp b/src/objects/rigging.cpp index f686bfbcf..757ea090c 100644 --- a/src/objects/rigging.cpp +++ b/src/objects/rigging.cpp @@ -13,7 +13,7 @@ using namespace rigging; void ModelReference::refresh(const Assets& assets) { if (updateFlag) { - model = assets.get(name); + model = assets.getShared(name); updateFlag = false; } } @@ -29,14 +29,14 @@ Bone::Bone( name(std::move(name)), bones(std::move(bones)), offset(offset), - model({model, nullptr, true}) { + model({model, {}, true}) { } void Bone::setModel(const std::string& name) { if (model.name == name) { return; } - model = {name, nullptr, true}; + model = {name, {}, true}; } Skeleton::Skeleton(std::shared_ptr config) @@ -184,12 +184,14 @@ void SkeletonConfig::render( continue; } node->model.refresh(assets); - auto model = node->model.model; + auto model = node->model.model.lock().get(); // TODO: cache model pointer during frame auto& modelOverride = skeleton.modelOverrides.at(i); if (modelOverride.updateFlag) { modelOverride.refresh(assets); } - model = modelOverride.model ? modelOverride.model : model; + if (auto foundOverride = modelOverride.model.lock()) { + model = foundOverride.get(); + } if (model) { batch.draw( skeleton.calculated.matrices[i], diff --git a/src/objects/rigging.hpp b/src/objects/rigging.hpp index 9e7fc75f6..82066e132 100644 --- a/src/objects/rigging.hpp +++ b/src/objects/rigging.hpp @@ -33,8 +33,8 @@ namespace rigging { struct ModelReference { std::string name; - model::Model* model; - bool updateFlag; + std::weak_ptr model; + bool updateFlag = false; void refresh(const Assets& assets); };