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