From 9fff79f8e293b37630fd7b3017fb8614369520b6 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 19 Aug 2026 20:51:40 +0300 Subject: [PATCH] make entity skeleton optional --- src/animation/rigging.cpp | 29 +++++++++++----------- src/logic/scripting/lua/libs/libentity.cpp | 4 +++ src/objects/Entities.cpp | 10 ++++++-- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/animation/rigging.cpp b/src/animation/rigging.cpp index 075cd8680..ceaed3365 100644 --- a/src/animation/rigging.cpp +++ b/src/animation/rigging.cpp @@ -41,12 +41,15 @@ void Bone::setModel(const std::string& name) { Skeleton::Skeleton(std::shared_ptr 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 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; } } diff --git a/src/logic/scripting/lua/libs/libentity.cpp b/src/logic/scripting/lua/libs/libentity.cpp index dd4e3dfaa..2d3eeecea 100644 --- a/src/logic/scripting/lua/libs/libentity.cpp +++ b/src/logic/scripting/lua/libs/libentity.cpp @@ -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(skeletonName); if (rigConfig == nullptr) { diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index fd7cc0b92..c0146552a 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -59,7 +59,11 @@ entityid_t Entities::spawn( if (assets) { skeleton = assets->get(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(entity); if (assets) { - registry->emplace(entity, skeleton->instance()); + registry->emplace( + entity, skeleton ? skeleton->instance() : rigging::Skeleton(nullptr) + ); } for (auto& instance : def.components) {