summaryrefslogtreecommitdiffhomepage
path: root/src/rmodels.c
diff options
context:
space:
mode:
authorVitoTringolo <[email protected]>2024-06-28 09:53:29 +0200
committerGitHub <[email protected]>2024-06-28 09:53:29 +0200
commit05d76c74a61444f1daba82100a0b69e5d66520ed (patch)
tree6e6a3eed9df29b03e7948aa1189caf4e3d8f37e4 /src/rmodels.c
parent5e91444e3e6a96813a491070de88358403ab5a75 (diff)
downloadraylib-05d76c74a61444f1daba82100a0b69e5d66520ed.tar.gz
raylib-05d76c74a61444f1daba82100a0b69e5d66520ed.zip
Fix GLTF animations (#4107)
Co-authored-by: Vito Tringolo <[email protected]>
Diffstat (limited to 'src/rmodels.c')
-rw-r--r--src/rmodels.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/src/rmodels.c b/src/rmodels.c
index a323292c..f99ba514 100644
--- a/src/rmodels.c
+++ b/src/rmodels.c
@@ -4878,13 +4878,13 @@ static BoneInfo *LoadBoneInfoGLTF(cgltf_skin skin, int *boneCount)
}
// Find parent bone index
- unsigned int parentIndex = -1;
+ int parentIndex = -1;
for (unsigned int j = 0; j < skin.joints_count; j++)
{
if (skin.joints[j] == node.parent)
{
- parentIndex = j;
+ parentIndex = (int)j;
break;
}
}
@@ -5459,22 +5459,17 @@ static Model LoadGLTF(const char *fileName)
for (int i = 0; i < model.boneCount; i++)
{
- cgltf_node node = *skin.joints[i];
- model.bindPose[i].translation.x = node.translation[0];
- model.bindPose[i].translation.y = node.translation[1];
- model.bindPose[i].translation.z = node.translation[2];
-
- model.bindPose[i].rotation.x = node.rotation[0];
- model.bindPose[i].rotation.y = node.rotation[1];
- model.bindPose[i].rotation.z = node.rotation[2];
- model.bindPose[i].rotation.w = node.rotation[3];
-
- model.bindPose[i].scale.x = node.scale[0];
- model.bindPose[i].scale.y = node.scale[1];
- model.bindPose[i].scale.z = node.scale[2];
+ cgltf_node* node = skin.joints[i];
+ cgltf_float worldTransform[16];
+ cgltf_node_transform_world(node, worldTransform);
+ Matrix worldMatrix = {
+ worldTransform[0], worldTransform[4], worldTransform[8], worldTransform[12],
+ worldTransform[1], worldTransform[5], worldTransform[9], worldTransform[13],
+ worldTransform[2], worldTransform[6], worldTransform[10], worldTransform[14],
+ worldTransform[3], worldTransform[7], worldTransform[11], worldTransform[15]
+ };
+ MatrixDecompose(worldMatrix, &(model.bindPose[i].translation), &(model.bindPose[i].rotation), &(model.bindPose[i].scale));
}
-
- BuildPoseFromParentJoints(model.bones, model.boneCount, model.bindPose);
}
else if (data->skins_count > 1)
{
@@ -5651,6 +5646,9 @@ static bool GetPoseAtTimeGLTF(cgltf_interpolation_type interpolationType, cgltf_
}
}
+ // Constant animation, no need to interpolate
+ if (FloatEquals(tend, tstart)) return false;
+
float duration = fmaxf((tend - tstart), EPSILON);
float t = (time - tstart)/duration;
t = (t < 0.0f)? 0.0f : t;
@@ -5880,9 +5878,9 @@ static ModelAnimation *LoadModelAnimationsGLTF(const char *fileName, int *animCo
for (int k = 0; k < animations[i].boneCount; k++)
{
- Vector3 translation = {0, 0, 0};
- Quaternion rotation = {0, 0, 0, 1};
- Vector3 scale = {1, 1, 1};
+ Vector3 translation = {skin.joints[k]->translation[0], skin.joints[k]->translation[1], skin.joints[k]->translation[2]};
+ Quaternion rotation = {skin.joints[k]->rotation[0], skin.joints[k]->rotation[1], skin.joints[k]->rotation[2], skin.joints[k]->rotation[3]};
+ Vector3 scale = {skin.joints[k]->scale[0], skin.joints[k]->scale[1], skin.joints[k]->scale[2]};
if (boneChannels[k].translate)
{