void Skeleton::RecursiveProcess(float time, Bone& bone, Animation& anim, MatrixBuffer& buffer, TrackBuffer& trackData, XMFLOAT4X4 parentTransform) { VQS vqs; anim.CalculateTransform(time, bone.BoneIndex, vqs, trackData[bone.BoneIndex]); XMFLOAT4X4 localTransform = vqs.GetMatrix(); XMFLOAT4X4 modelTransform; // = localTransform * parentTransform; XMStoreFloat4x4(&modelTransform, XMMatrixMultiply(XMLoadFloat4x4(&localTransform), XMLoadFloat4x4(&parentTransform))); buffer[bone.BoneIndex] = modelTransform; for (UINT i = 0; i < bone.Children.size(); ++i) { RecursiveProcess(time, *bone.Children[i], anim, buffer, trackData, modelTransform); } }
void Skeleton::ProcessAnimationGraph(float time, MatrixBuffer& buffer, Animation& anim, TrackBuffer& trackData) { //Linear Form This only works because the bone parent is always guaranteed to be in front //of its children (breath first order) XMFLOAT4X4 identity; XMStoreFloat4x4(&identity, XMMatrixIdentity()); for (UINT boneIndex = 0; boneIndex < m_Bones.size(); ++boneIndex) { Bone& bone = m_Bones[boneIndex]; VQS vqs; anim.CalculateTransform(time, boneIndex, vqs, trackData[boneIndex]); XMFLOAT4X4 parentTransform = bone.ParentBoneIndex != -1 ? buffer[bone.ParentBoneIndex] : identity; XMFLOAT4X4 localTransform = vqs.GetMatrix(); XMFLOAT4X4 modelTransform; // = localTransform * parentTransform; XMStoreFloat4x4(&modelTransform, XMMatrixMultiply(XMLoadFloat4x4(&localTransform), XMLoadFloat4x4(&parentTransform))); buffer[boneIndex] = modelTransform; } }