fix dead skeleton model references

This commit is contained in:
MihailRis 2026-06-30 22:53:22 +03:00
parent b2b889bd7c
commit 9d3a60328f
3 changed files with 12 additions and 10 deletions

View file

@ -42,7 +42,7 @@ static int l_get_model(lua::State* L) {
auto& rigConfig = *skeleton->config; auto& rigConfig = *skeleton->config;
auto index = index_range_check(*skeleton, lua::tointeger(L, 2)); auto index = index_range_check(*skeleton, lua::tointeger(L, 2));
const auto& modelOverride = skeleton->modelOverrides[index]; const auto& modelOverride = skeleton->modelOverrides[index];
if (!modelOverride.model) { if (!modelOverride.model.expired()) {
return lua::pushstring(L, modelOverride.name); return lua::pushstring(L, modelOverride.name);
} }
return lua::pushstring(L, rigConfig.getBones()[index]->model.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 index = index_range_check(*skeleton, lua::tointeger(L, 2));
auto& modelOverride = skeleton->modelOverrides[index]; auto& modelOverride = skeleton->modelOverrides[index];
if (lua::isnoneornil(L, 3)) { if (lua::isnoneornil(L, 3)) {
modelOverride = {"", nullptr, true}; modelOverride = {"", {}, true};
} else { } else {
modelOverride = {lua::require_string(L, 3), nullptr, true}; modelOverride = {lua::require_string(L, 3), {}, true};
} }
} }
return 0; return 0;

View file

@ -13,7 +13,7 @@ using namespace rigging;
void ModelReference::refresh(const Assets& assets) { void ModelReference::refresh(const Assets& assets) {
if (updateFlag) { if (updateFlag) {
model = assets.get<model::Model>(name); model = assets.getShared<model::Model>(name);
updateFlag = false; updateFlag = false;
} }
} }
@ -29,14 +29,14 @@ Bone::Bone(
name(std::move(name)), name(std::move(name)),
bones(std::move(bones)), bones(std::move(bones)),
offset(offset), offset(offset),
model({model, nullptr, true}) { model({model, {}, true}) {
} }
void Bone::setModel(const std::string& name) { void Bone::setModel(const std::string& name) {
if (model.name == name) { if (model.name == name) {
return; return;
} }
model = {name, nullptr, true}; model = {name, {}, true};
} }
Skeleton::Skeleton(std::shared_ptr<const SkeletonConfig> config) Skeleton::Skeleton(std::shared_ptr<const SkeletonConfig> config)
@ -184,12 +184,14 @@ void SkeletonConfig::render(
continue; continue;
} }
node->model.refresh(assets); 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); auto& modelOverride = skeleton.modelOverrides.at(i);
if (modelOverride.updateFlag) { if (modelOverride.updateFlag) {
modelOverride.refresh(assets); modelOverride.refresh(assets);
} }
model = modelOverride.model ? modelOverride.model : model; if (auto foundOverride = modelOverride.model.lock()) {
model = foundOverride.get();
}
if (model) { if (model) {
batch.draw( batch.draw(
skeleton.calculated.matrices[i], skeleton.calculated.matrices[i],

View file

@ -33,8 +33,8 @@ namespace rigging {
struct ModelReference { struct ModelReference {
std::string name; std::string name;
model::Model* model; std::weak_ptr<model::Model> model;
bool updateFlag; bool updateFlag = false;
void refresh(const Assets& assets); void refresh(const Assets& assets);
}; };