Add async animations updating via Task Graph

This commit is contained in:
Wojtek Figat
2021-06-12 23:18:04 +02:00
parent 360f498e47
commit 4a92850d9a
4 changed files with 127 additions and 68 deletions

View File

@@ -113,16 +113,6 @@ void AnimatedModel::PreInitSkinningData()
UpdateSockets();
}
void AnimatedModel::UpdateSockets()
{
for (int32 i = 0; i < Children.Count(); i++)
{
auto socket = dynamic_cast<BoneSocket*>(Children[i]);
if (socket)
socket->UpdateTransformation();
}
}
void AnimatedModel::GetCurrentPose(Array<Matrix>& nodesTransformation, bool worldSpace) const
{
nodesTransformation = GraphInstance.NodesPose;
@@ -451,9 +441,19 @@ void AnimatedModel::UpdateBounds()
BoundingSphere::FromBox(_box, _sphere);
}
void AnimatedModel::OnAnimationUpdated()
void AnimatedModel::UpdateSockets()
{
ANIM_GRAPH_PROFILE_EVENT("OnAnimationUpdated");
for (int32 i = 0; i < Children.Count(); i++)
{
auto socket = dynamic_cast<BoneSocket*>(Children[i]);
if (socket)
socket->UpdateTransformation();
}
}
void AnimatedModel::OnAnimationUpdated_Async()
{
// Update asynchronous stuff
auto& skeleton = SkinnedModel->Skeleton;
// Copy pose from the master
@@ -482,12 +482,24 @@ void AnimatedModel::OnAnimationUpdated()
}
UpdateBounds();
_blendShapes.Update(SkinnedModel.Get());
}
void AnimatedModel::OnAnimationUpdated_Sync()
{
// Update synchronous stuff
UpdateSockets();
ApplyRootMotion(GraphInstance.RootMotion);
_blendShapes.Update(SkinnedModel.Get());
AnimationUpdated();
}
void AnimatedModel::OnAnimationUpdated()
{
ANIM_GRAPH_PROFILE_EVENT("OnAnimationUpdated");
OnAnimationUpdated_Async();
OnAnimationUpdated_Sync();
}
void AnimatedModel::OnSkinnedModelChanged()
{
Entries.Release();

View File

@@ -15,7 +15,7 @@
API_CLASS() class FLAXENGINE_API AnimatedModel : public ModelInstanceActor
{
DECLARE_SCENE_OBJECT(AnimatedModel);
friend class AnimationsService;
friend class AnimationsSystem;
public:
/// <summary>
@@ -306,6 +306,8 @@ private:
void UpdateLocalBounds();
void UpdateBounds();
void UpdateSockets();
void OnAnimationUpdated_Async();
void OnAnimationUpdated_Sync();
void OnAnimationUpdated();
void OnSkinnedModelChanged();