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

View file

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

View file

@ -59,7 +59,11 @@ entityid_t Entities::spawn(
if (assets) { if (assets) {
skeleton = assets->get<rigging::SkeletonConfig>(def.skeletonName); skeleton = assets->get<rigging::SkeletonConfig>(def.skeletonName);
if (skeleton == nullptr) { 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; entityid_t id;
@ -100,7 +104,9 @@ entityid_t Entities::spawn(
auto& scripting = registry->emplace<ScriptComponents>(entity); auto& scripting = registry->emplace<ScriptComponents>(entity);
if (assets) { 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) { for (auto& instance : def.components) {