void AnimationPlayer::GetInterpolatedPose(float time, SceneNode& sceneNode) { XMFLOAT4X4 toParentTransform; Bone* bone = sceneNode.As<Bone>(); if (bone != nullptr) { mCurrentClip->GetInteropolatedTransform(time, *bone, toParentTransform); } else { toParentTransform = sceneNode.Transform(); } XMMATRIX toRootTransform = (sceneNode.GetParent() != nullptr ? XMLoadFloat4x4(&toParentTransform) * XMLoadFloat4x4(&(mToRootTransforms.at(sceneNode.GetParent()))) : XMLoadFloat4x4(&toParentTransform)); XMStoreFloat4x4(&(mToRootTransforms[&sceneNode]), toRootTransform); if (bone != nullptr) { XMStoreFloat4x4(&(mFinalTransforms[bone->Index()]), bone->OffsetTransformMatrix() * toRootTransform * XMLoadFloat4x4(&mInverseRootTransform)); } for (auto& childNode : sceneNode.Children()) { GetInterpolatedPose(time, *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); } }
void Model::LoadSkeleton(std::fstream& fileStream, SceneNode* parentNode) { bool isSceneNode; ModelDeSerializer::ReadAsBytes(fileStream, isSceneNode); SceneNode* node; if (isSceneNode) { node = new SceneNode(*this, fileStream); } else { std::string name; ModelDeSerializer::ReadAsBytes(fileStream, name); //find bone and do fixup UINT boneIndex = mBoneIndexMapping[name]; node = mBones[boneIndex]; } node->SetParent(parentNode); if (parentNode != nullptr) { parentNode->Children().push_back(node); } else { mRootNode = node; } uint_t childCount; ModelDeSerializer::ReadAsBytes(fileStream, childCount); node->Children().reserve(childCount); for (int i = 0; i < childCount; i++) { LoadSkeleton(fileStream, node); } }
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); } }