mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-14 07:21:51 +00:00
fix dead skeleton model references
This commit is contained in:
parent
b2b889bd7c
commit
9d3a60328f
3 changed files with 12 additions and 10 deletions
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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],
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue