diff --git a/Source/Engine/Animations/AnimationManager.cpp b/Source/Engine/Animations/AnimationManager.cpp index 9b3231e25..6614c611a 100644 --- a/Source/Engine/Animations/AnimationManager.cpp +++ b/Source/Engine/Animations/AnimationManager.cpp @@ -70,22 +70,8 @@ void AnimationManagerService::Update() // Evaluate animated nodes pose graph->GraphExecutor.Update(animatedModel->GraphInstance, dt); - - // Calculate the final bones transformations - { - ANIM_GRAPH_PROFILE_EVENT("Final Pose"); - auto& skeleton = animatedModel->SkinnedModel->Skeleton; - UpdateBones.Resize(skeleton.Bones.Count(), false); - for (int32 boneIndex = 0; boneIndex < skeleton.Bones.Count(); boneIndex++) - { - auto& bone = skeleton.Bones[boneIndex]; - UpdateBones[boneIndex] = bone.OffsetMatrix * animatedModel->GraphInstance.NodesPose[bone.NodeIndex]; - } - } // Update gameplay - const bool usePrevFrameBones = animatedModel->PerBoneMotionBlur; - animatedModel->_skinningData.SetData(UpdateBones.Get(), !usePrevFrameBones); animatedModel->OnAnimationUpdated(); } } diff --git a/Source/Engine/Level/Actors/AnimatedModel.cpp b/Source/Engine/Level/Actors/AnimatedModel.cpp index 73e72ea38..a1a9d6db6 100644 --- a/Source/Engine/Level/Actors/AnimatedModel.cpp +++ b/Source/Engine/Level/Actors/AnimatedModel.cpp @@ -13,6 +13,8 @@ #include "Engine/Level/SceneObjectsFactory.h" #include "Engine/Serialization/Serialization.h" +extern Array UpdateBones; + AnimatedModel::AnimatedModel(const SpawnParams& params) : ModelInstanceActor(params) , _actualMode(AnimationUpdateMode::Never) @@ -145,6 +147,7 @@ void AnimatedModel::SetCurrentPose(const Array& nodesTransformation, boo for (auto& m : GraphInstance.NodesPose) m = invWorld * m; } + OnAnimationUpdated(); } void AnimatedModel::GetNodeTransformation(int32 nodeIndex, Matrix& nodeTransformation, bool worldSpace) const @@ -439,6 +442,21 @@ void AnimatedModel::UpdateBounds() void AnimatedModel::OnAnimationUpdated() { + ANIM_GRAPH_PROFILE_EVENT("OnAnimationUpdated"); + + // Calculate the final bones transformations and update skinning + { + ANIM_GRAPH_PROFILE_EVENT("Final Pose"); + auto& skeleton = SkinnedModel->Skeleton; + UpdateBones.Resize(skeleton.Bones.Count(), false); + for (int32 boneIndex = 0; boneIndex < skeleton.Bones.Count(); boneIndex++) + { + auto& bone = skeleton.Bones[boneIndex]; + UpdateBones[boneIndex] = bone.OffsetMatrix * GraphInstance.NodesPose[bone.NodeIndex]; + } + } + _skinningData.SetData(UpdateBones.Get(), !PerBoneMotionBlur); + UpdateBounds(); UpdateSockets(); ApplyRootMotion(GraphInstance.RootMotion);