private void ApplyBoneMatricesInternal(SkeletonAnimRigNode node, MeshEntity entity, Matrix4x4[] boneMatrices, float timeStamp, Matrix4x4 parentTransform) { string name = node.Name; Matrix4x4 nodeTransform = node.LocalTransform; SkeletonAnimChannel animChannel = GetMeshAnimBone(name); if (animChannel != null) { nodeTransform = animChannel.GetMatrixAtTimestamp(timeStamp); } Matrix4x4 globalTransform = nodeTransform * parentTransform; MeshBone bone = BoneIndexFromEntity(entity, name); if (bone != null) { boneMatrices[bone.BoneIndex] = bone.OffsetMatrix * globalTransform; } if (node.Children == null) { return; } for (var i = 0; i < node.Children.Length; i++) { SkeletonAnimRigNode child = node.Children[i]; ApplyBoneMatricesInternal(child, entity, boneMatrices, timeStamp, globalTransform); } }
// For debugging purposes. private SkeletonAnimRigNode FindInRig(SkeletonAnimRigNode node, string name) { if (node.Name == name) { return(node); } for (var i = 0; i < node.Children.Length; i++) { SkeletonAnimRigNode child = node.Children[i]; SkeletonAnimRigNode found = FindInRig(child, name); if (found != null) { return(found); } } return(null); }