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 Model::Load(std::fstream& fileStream) { uint_t size; //read the material data first, since mesh is dependent on material ModelDeSerializer::ReadAsBytes(fileStream, size); mMaterials.reserve(size); for (int i = 0; i < size; i++) { mMaterials.push_back(new ModelMaterial(*this, fileStream)); } //read the mesh data ModelDeSerializer::ReadAsBytes(fileStream, size); mMeshes.reserve(size); for (int i = 0; i < size; i++) { mMeshes.push_back(new Mesh(*this, fileStream)); } bool hasSkeleton; ModelDeSerializer::ReadAsBytes(fileStream, hasSkeleton); if (hasSkeleton) { ModelDeSerializer::ReadAsBytes(fileStream, size); mBones.reserve(size); for (int i = 0; i < size; i++) { Bone* bone = new Bone(*this, fileStream); mBones.push_back(bone); mBoneIndexMapping[bone->Name()] = bone->Index(); } LoadSkeleton(fileStream, mRootNode); ModelDeSerializer::ReadAsBytes(fileStream, size); mAnimations.reserve(size); for (int i = 0; i < size; i++) { AnimationClip* clip = new AnimationClip(*this, fileStream); mAnimations.push_back(clip); mAnimationsByName.insert(std::pair<std::string, AnimationClip*>(clip->Name(), clip)); } } }
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 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); } }