diff options
| author | VitoTringolo <[email protected]> | 2024-06-28 09:53:29 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-06-28 09:53:29 +0200 |
| commit | 05d76c74a61444f1daba82100a0b69e5d66520ed (patch) | |
| tree | 6e6a3eed9df29b03e7948aa1189caf4e3d8f37e4 /src/rmodels.c | |
| parent | 5e91444e3e6a96813a491070de88358403ab5a75 (diff) | |
| download | raylib-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.c | 38 |
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) { |
