AnimationPlayer::AnimationPlayer(Game::GameBase& game, Model& model, bool interpolationEnabled)
        : GameComponent(game),
		mModel(&model), mCurrentClip(nullptr), mCurrentTime(0.0f), mCurrentKeyframe(0U), mToRootTransforms(), mFinalTransforms(),
		  mInverseRootTransform(MatrixHelper::Identity), mInterpolationEnabled(interpolationEnabled), mIsPlayingClip(false), mIsClipLooped(true)
	{
		mFinalTransforms.resize(model.Bones().size());
	}
	BoneAnimation::BoneAnimation(Model& model, aiNodeAnim& nodeAnim)		
		: mModel(&model), mBone(nullptr), mKeyframes(), mBoneIndex()
    {
		mBoneIndex = model.BoneIndexMapping().at(nodeAnim.mNodeName.C_Str());
		mBone = model.Bones().at(mBoneIndex);

		assert(nodeAnim.mNumPositionKeys == nodeAnim.mNumRotationKeys);
		assert(nodeAnim.mNumPositionKeys == nodeAnim.mNumScalingKeys);

		for (UINT i = 0; i < nodeAnim.mNumPositionKeys; i++)
		{
			aiVectorKey positionKey = nodeAnim.mPositionKeys[i];
			aiQuatKey rotationKey = nodeAnim.mRotationKeys[i];
			aiVectorKey scaleKey = nodeAnim.mScalingKeys[i];

			assert(positionKey.mTime == rotationKey.mTime);
			assert(positionKey.mTime == scaleKey.mTime);
			
			Keyframe* keyframe = new Keyframe(static_cast<float>(positionKey.mTime), XMFLOAT3(positionKey.mValue.x, positionKey.mValue.y, positionKey.mValue.z),
				XMFLOAT4(rotationKey.mValue.x, rotationKey.mValue.y, rotationKey.mValue.z, rotationKey.mValue.w), XMFLOAT3(scaleKey.mValue.x, scaleKey.mValue.y, scaleKey.mValue.z));
			mKeyframes.push_back(keyframe);
		}
    }