[5.8] Mutable + HairStrandsMutable — grooms in child/extension Customizable Objects render invisible (passthrough object fails to resolve)

Grooms authored via the HairStrandsMutable “Groom Constant” node render invisible at runtime in 5.8 when the node lives in a child / extension Customizable Object that attaches to a parent CO. The same node works when placed directly in the root CO.

The skeletal mesh builds correctly but the groom is dropped (invisible hair), with: LogMutableCore: Error: Unable to load Passthrough object: /Game/…/<RootCO>:CustomizableObjectGraph_0.CustomizableObjectNodeGroomConstant_0.GroomData

The same GroomAsset + GroomBindingAsset render correctly on a plain UGroomComponent / SkeletalMeshComponent in a Blueprint, so the assets and render path are fine. The failure is specific to Mutable passthrough resolution for child-CO grooms. Full environment and source-level analysis are in Steps to Reproduce.

Key questions:

  1. Is this the known 5.8 Mutable regression that is already fixed in UE5 Main? If so, which CL(s), and is a 5.8.x hotfix planned?
  2. Is there a supported way to take the fix on a Launcher / binary 5.8 engine short of a full source build? (Engine plugins can’t be recompiled on an installed build, and Mutable can’t move to project-plugin scope because engine plugins such as MetaHuman and TextureGraph depend on MutableRuntime.)
  3. Is authoring grooms in child / extension COs an intended / supported pattern, or should grooms be authored in the root CO?
    [Attachment Removed]

Steps to Reproduce

in this project there should be a beard, but it’s not visible.

[Attachment Removed]

Hey there,

I’ve just confirmed this on our end as well, in our most recent 5.8 candidates. The studio is about to go on a 2-week break, and I’ll try to see if there’s a resolution by tomorrow, but the dev team may not be in.

Dustin

[Attachment Removed]

Hi Matthias,

I checked the repro case and noticed a few things.

The main issue is with the backward compatibility code for the Groom Constant node. Fix already committed, I’ll share the CL with you when it gets to main. Change is simple, add a PostLoad to the UCustomizableObjectNodeGroomConstant class in the HairStrandsMutable plugin.

void UCustomizableObjectNodeGroomConstant::PostLoad()
{
	Super::PostLoad();
 
	CopyCompiledData();
}

Workaround: Modify a property from the Groom constant node, save the CO and recompile the root CO.

Another issue I found is that the head section’s order does not match the source mesh’s, which breaks the groom mapping. To fix it, the ‘Face_Skin’ section must be the first in the generated mesh.

[Image Removed]The following setup will fix that mapping.

[Image Removed]

The last issue is duplicated geometry in LODs 6 and 7. Notice that I have disconnected the LOD 6 and 7 pins of the base head in the image above. Mutable will automatically propagate sections across LODs when they point to the same material slot. This means the face skin section connected to LOD 5 will be propagated to LOD 6 and 7.

Regards,

Pere

[Attachment Removed]

Is this the known 5.8 Mutable regression that is already fixed in UE5 Main? If so, which CL(s), and is a 5.8.x hotfix planned?

  • I’ll prepare a hotfix for 5.8.x.

Is there a supported way to take the fix on a Launcher / binary 5.8 engine short of a full source build? (Engine plugins can’t be recompiled on an installed build, and Mutable can’t move to project-plugin scope because engine plugins such as MetaHuman and TextureGraph depend on MutableRuntime.)

  • Not that I know of.

Is authoring grooms in child / extension COs an intended / supported pattern, or should grooms be authored in the root CO?

  • Yes, authoring grooms in child COs is the current pattern we support.
    [Attachment Removed]