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 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);
		}
	}