69 lines
1.9 KiB
C++
69 lines
1.9 KiB
C++
#include "Rendering/BoneAttachmentSystem.h"
|
|
|
|
void BoneAttachmentSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& BoneAttachmentComponent, double dt)
|
|
{
|
|
|
|
|
|
if(!entity.HasComponent("Transform")) {
|
|
return;
|
|
}
|
|
|
|
auto parent = entity.FirstParentWithComponent("Model");
|
|
|
|
if(!parent.Valid()) {
|
|
return;
|
|
}
|
|
|
|
|
|
Model* model;
|
|
try {
|
|
model = ResourceManager::Load<::Model, true>(parent["Model"]["Resource"]);
|
|
} catch (const std::exception&) {
|
|
return;
|
|
}
|
|
|
|
if (!model->IsSkinned()) {
|
|
return;
|
|
}
|
|
|
|
Skeleton* skeleton = model->m_Skeleton;
|
|
|
|
if(skeleton == nullptr) {
|
|
return;
|
|
}
|
|
|
|
int id = skeleton->GetBoneID(entity["BoneAttachment"]["BoneName"]);
|
|
|
|
if (id == -1) {
|
|
return;
|
|
}
|
|
|
|
if (skeleton->BlendTrees.find(parent) != skeleton->BlendTrees.end()) {
|
|
|
|
|
|
glm::mat4 boneTransform = skeleton->BlendTrees.at(parent)->GetBoneTransform(id);
|
|
|
|
glm::vec3 scale;
|
|
glm::quat rotation;
|
|
glm::vec3 translation;
|
|
glm::vec3 skew;
|
|
glm::vec4 perspective;
|
|
glm::decompose(boneTransform, scale, rotation, translation, skew, perspective);
|
|
|
|
rotation = glm::quat((glm::vec3)entity["BoneAttachment"]["OrientationOffset"]) * rotation;
|
|
rotation = glm::inverse(rotation);
|
|
glm::vec3 angles = glm::eulerAngles(rotation);
|
|
|
|
if ((bool)entity["BoneAttachment"]["InheritPosition"]) {
|
|
entity["Transform"]["Position"] = translation + (glm::vec3)entity["BoneAttachment"]["PositionOffset"];
|
|
}
|
|
if ((bool)entity["BoneAttachment"]["InheritOrientation"]) {
|
|
entity["Transform"]["Orientation"] = angles;
|
|
}
|
|
if ((bool)entity["BoneAttachment"]["InheritScale"]) {
|
|
entity["Transform"]["Scale"] = scale * (glm::vec3)entity["BoneAttachment"]["ScaleOffset"];
|
|
}
|
|
}
|
|
|
|
}
|