Hi!
When starting the Editor, Layered Blend Per Bone nodes using Blend Masks inside dynamically linked Anim Layers completely ignore the blend pose (evaluating to 0.0 weight for all bones). Disconnecting/reconnecting and recompiling fixes it for the session, but it breaks again on the next Editor boot. This does not happen if s.AsyncLoadingThreadEnabled is disabled.
From what I’ve been able to find out, it seems there’s an issue related to the BlendProfile’s PostLoad. It might not be exactly that, but I’ll share my reasoning and how I managed to track down the bug, in case it’s of any help to you
By debugging the engine source code, we caught the exact moment of failure. During the asynchronous loading phase inside FAnimationRuntime::CreateMaskWeights(), the pointer to the UBlendProfile asset is not null, but we inspected its object flags:
BlendMask->HasAnyFlags(RF_NeedPostLoad) returns TRUE
BlendMask->HasAnyFlags(RF_LoadCompleted) returns TRUE
We have some ABPs that work and others that don’t; in the ones that work, RF_NeedPostLoad returns false, and in the ones that don’t, it returns true.
Because the UBlendProfile is still loading (I think) and hasn’t executed its PostLoad() yet, its internal FBoneReference entries have their BoneName populated correctly, but their BoneIndex is still uninitialized at -1.
The FAnimationRuntime::CreateMaskWeights() then caches the compiled weights as 0.0 for all bones due to those -1 indices, marks the node’s skeleton GUID as valid, and the node locks itself in a broken state for the rest of the session.
I’ve tried setting it up so that if the blendmask hasn’t run the postload, it sets the SkeletonGuid and VirtualBoneGuid to invalid values, so that they are created during the next rebuild, and it seems to work well.
It might not be exactly this, but it’s what we’ve reproduced; I understand that, as async loading is experimental, there may be minor bugs of this sort.
Thanks,
Javi
[Attachment Removed]