mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-04 18:41:51 +00:00
make entity skeleton optional
This commit is contained in:
parent
1186011dcf
commit
9fff79f8e2
3 changed files with 26 additions and 17 deletions
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue