Fix missing call to OnAnimationUpdated when using custom skeleton pose
This commit is contained in:
@@ -70,22 +70,8 @@ void AnimationManagerService::Update()
|
|||||||
|
|
||||||
// Evaluate animated nodes pose
|
// Evaluate animated nodes pose
|
||||||
graph->GraphExecutor.Update(animatedModel->GraphInstance, dt);
|
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
|
// Update gameplay
|
||||||
const bool usePrevFrameBones = animatedModel->PerBoneMotionBlur;
|
|
||||||
animatedModel->_skinningData.SetData(UpdateBones.Get(), !usePrevFrameBones);
|
|
||||||
animatedModel->OnAnimationUpdated();
|
animatedModel->OnAnimationUpdated();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
#include "Engine/Level/SceneObjectsFactory.h"
|
#include "Engine/Level/SceneObjectsFactory.h"
|
||||||
#include "Engine/Serialization/Serialization.h"
|
#include "Engine/Serialization/Serialization.h"
|
||||||
|
|
||||||
|
extern Array<Matrix> UpdateBones;
|
||||||
|
|
||||||
AnimatedModel::AnimatedModel(const SpawnParams& params)
|
AnimatedModel::AnimatedModel(const SpawnParams& params)
|
||||||
: ModelInstanceActor(params)
|
: ModelInstanceActor(params)
|
||||||
, _actualMode(AnimationUpdateMode::Never)
|
, _actualMode(AnimationUpdateMode::Never)
|
||||||
@@ -145,6 +147,7 @@ void AnimatedModel::SetCurrentPose(const Array<Matrix>& nodesTransformation, boo
|
|||||||
for (auto& m : GraphInstance.NodesPose)
|
for (auto& m : GraphInstance.NodesPose)
|
||||||
m = invWorld * m;
|
m = invWorld * m;
|
||||||
}
|
}
|
||||||
|
OnAnimationUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AnimatedModel::GetNodeTransformation(int32 nodeIndex, Matrix& nodeTransformation, bool worldSpace) const
|
void AnimatedModel::GetNodeTransformation(int32 nodeIndex, Matrix& nodeTransformation, bool worldSpace) const
|
||||||
@@ -439,6 +442,21 @@ void AnimatedModel::UpdateBounds()
|
|||||||
|
|
||||||
void AnimatedModel::OnAnimationUpdated()
|
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();
|
UpdateBounds();
|
||||||
UpdateSockets();
|
UpdateSockets();
|
||||||
ApplyRootMotion(GraphInstance.RootMotion);
|
ApplyRootMotion(GraphInstance.RootMotion);
|
||||||
|
|||||||
Reference in New Issue
Block a user