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);
		}
	}
Esempio n. 3
0
	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);
		}
	}