make entity skeleton optional

This commit is contained in:
MihailRis 2026-08-19 20:51:40 +03:00
parent 1186011dcf
commit 9fff79f8e2
3 changed files with 26 additions and 17 deletions

View file

@ -41,12 +41,15 @@ void Bone::setModel(const std::string& name) {
Skeleton::Skeleton(std::shared_ptr<const SkeletonConfig> config)
: config(config),
pose(config->getBones().size()),
calculated(config->getBones().size()),
flags(config->getBones().size()),
pose(config ? config->getBones().size() : 0),
calculated(config ? config->getBones().size() : 0),
flags(config ? config->getBones().size() : 0),
textures(),
modelOverrides(config->getBones().size()),
modelOverrides(config ? config->getBones().size() : 0),
visible(true) {
if (config == nullptr) {
return;
}
const auto& bones = config->getBones();
for (size_t i = 0; i < bones.size(); i++) {
flags[i].visible = true;
@ -89,19 +92,15 @@ void Skeleton::deserialize(const dv::value& root) {
void Skeleton::setConfig(std::shared_ptr<const SkeletonConfig> rigConfig) {
config = std::move(rigConfig);
const auto& bones = config->getBones();
int bonesCount = config ? config->getBones().size() : 0;
pose.matrices.resize(bonesCount, glm::mat4(1.0f));
calculated.matrices.resize(bonesCount, glm::mat4(1.0f));
pose.matrices.resize(
bones.size(), glm::mat4(1.0f)
);
calculated.matrices.resize(
bones.size(), glm::mat4(1.0f)
);
modelOverrides.resize(bonesCount);
flags.resize(bonesCount);
modelOverrides.resize(bones.size());
flags.resize(bones.size());
for (size_t i = 0; i < bones.size(); i++) {
for (size_t i = 0; i < bonesCount; i++) {
flags[i].visible = true;
}
}

View file

@ -116,6 +116,10 @@ static int l_set_skeleton(lua::State* L) {
return 0;
}
if (auto entity = get_entity(L, 1)) {
if (lua::isnil(L, 2)) {
entity->setRig(nullptr);
return 0;
}
std::string skeletonName = lua::require_string(L, 2);
auto rigConfig = assets->getShared<rigging::SkeletonConfig>(skeletonName);
if (rigConfig == nullptr) {

View file

@ -59,7 +59,11 @@ entityid_t Entities::spawn(
if (assets) {
skeleton = assets->get<rigging::SkeletonConfig>(def.skeletonName);
if (skeleton == nullptr) {
throw std::runtime_error("skeleton " + def.skeletonName + " not found");
if (def.skeletonName == def.name) {
logger.warning() << "skeleton " + def.skeletonName + " not found";
} else {
throw std::runtime_error("skeleton " + def.skeletonName + " not found");
}
}
}
entityid_t id;
@ -100,7 +104,9 @@ entityid_t Entities::spawn(
auto& scripting = registry->emplace<ScriptComponents>(entity);
if (assets) {
registry->emplace<rigging::Skeleton>(entity, skeleton->instance());
registry->emplace<rigging::Skeleton>(
entity, skeleton ? skeleton->instance() : rigging::Skeleton(nullptr)
);
}
for (auto& instance : def.components) {