mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-13 15:01:49 +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)
|
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(bonesCount, glm::mat4(1.0f));
|
||||||
|
calculated.matrices.resize(bonesCount, glm::mat4(1.0f));
|
||||||
|
|
||||||
pose.matrices.resize(
|
modelOverrides.resize(bonesCount);
|
||||||
bones.size(), glm::mat4(1.0f)
|
flags.resize(bonesCount);
|
||||||
);
|
|
||||||
calculated.matrices.resize(
|
|
||||||
bones.size(), glm::mat4(1.0f)
|
|
||||||
);
|
|
||||||
|
|
||||||
modelOverrides.resize(bones.size());
|
for (size_t i = 0; i < bonesCount; i++) {
|
||||||
flags.resize(bones.size());
|
|
||||||
|
|
||||||
for (size_t i = 0; i < bones.size(); i++) {
|
|
||||||
flags[i].visible = true;
|
flags[i].visible = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue