void AnimationPlayer::GetBindPoseBottomUp(SceneNode& sceneNode) { XMMATRIX toRootTransform = sceneNode.TransformMatrix(); SceneNode* parentNode = sceneNode.GetParent(); while (parentNode != nullptr) { toRootTransform = toRootTransform * parentNode->TransformMatrix(); parentNode = parentNode->GetParent(); } Bone* bone = sceneNode.As<Bone>(); if (bone != nullptr) { XMStoreFloat4x4(&(mFinalTransforms[bone->Index()]), bone->OffsetTransformMatrix() * toRootTransform * XMLoadFloat4x4(&mInverseRootTransform)); } for (auto& childNode : sceneNode.Children()) { GetBindPoseBottomUp(*childNode); } }
void AnimationPlayer::GetBindPose(SceneNode& sceneNode) { XMMATRIX toParentTransform = sceneNode.TransformMatrix(); XMMATRIX toRootTransform = (sceneNode.GetParent() != nullptr ? toParentTransform * XMLoadFloat4x4(&(mToRootTransforms.at(sceneNode.GetParent()))) : toParentTransform); XMStoreFloat4x4(&(mToRootTransforms[&sceneNode]), toRootTransform); Bone* bone = sceneNode.As<Bone>(); if (bone != nullptr) { XMStoreFloat4x4(&(mFinalTransforms[bone->Index()]), bone->OffsetTransformMatrix() * toRootTransform * XMLoadFloat4x4(&mInverseRootTransform)); } for (auto& childNode : sceneNode.Children()) { GetBindPose(*childNode); } }