Mutable Metahuman Workflow Questions

Hello!

I appreciate UE5.5 has just released, and Mutable is experimental, however I wanted to start looking into this plugin to see how viable it will be for our use case. What it says on the tin is exactly what we’re looking for.

Anyway, I’m having a number of issues, and perhaps this is the best place to begin that dialogue.

Firstly, I have built a modular system of Clothing objects and a Body object which references them.
As you can see, this asset creates a combined clothing set and masks out the skin (or clothing) on areas that are covered by higher layers.

Mutable preview:

However, for whatever reason, when implementing this Mutable asset within our custom Metahuman actor class, the only thing we see is the removal of the skin vertices. We don’t get the clothing being added at all:

Just to share how this is set up. Here is the graph for the “Character” (body + clothing + masks):

F

Fairly straight-forward, each clothing item outputs it’s mesh, gets morphed based on body morphs (of which we don’t have connected right now, as we felt this might be part of the issue), and then masks each other and the body based on which meshes are active in each clothing object.

Here is an example of a clothing object:

As you can see, everything is set up in a fairly simple way, and the preview shows how I would expect, so all should be well.

Here is the setup in the Blueprint Actor:

So, I noticed that the child objects didn’t have the Enable 16Bit Bone Weights variable enabled like the main “Character” asset did. However, when I try to enable these, the engine crashes immediately after recompiling the main “Character” asset.

I can’t for the life of me figure out why this is happening, but perhaps it’s a Plugin bug.

Additionally, I noticed when playing in editor, I get this warning:
{CCF2E336-DA03-452A-8B45-80D6C4C67E1B}

In the output log it displays as such (no warning or explanation):

Any help with these two issues would be massively appreciated. I feel like I’m a couple of changes away from having a fully working system, but perhaps I’ve missed something obvious or the plugin just simply isn’t ready yet.

Edit: Just to confirm, I followed both of these documentation pages to ensure everything is as it should be:

2 Likes

Another little experiment.

I attempted to add the Metahuman head to the Character mutable asset, and that immediately causes an engine crash as well.

This is the crash I receive with either the head added, or the checkboxes for 16-bit bone weights enabled on the child objects:

[2024.10.02-06.22.34:733][333]OBJ SavePackage: Generating thumbnails for [0] asset(s) in package [/Game/_AHOY/CHARACTERS/MUTABLE/MU_Character] ([1] browsable assets)...
[2024.10.02-06.22.34:733][333]OBJ SavePackage: Finished generating thumbnails for package [/Game/_AHOY/CHARACTERS/MUTABLE/MU_Character]
[2024.10.02-06.22.34:733][333]Cmd: OBJ SAVEPACKAGE PACKAGE="/Game/_AHOY/CHARACTERS/MUTABLE/MU_Character" FILE="D:/AhoyMH/AhoyMH/Content/_AHOY/CHARACTERS/MUTABLE/MU_Character.uasset" SILENT=true
[2024.10.02-06.22.34:765][333]LogSavePackage: Moving output files for package: /Game/_AHOY/CHARACTERS/MUTABLE/MU_Character
[2024.10.02-06.22.34:765][333]LogSavePackage: Moving 'D:/AhoyMH/AhoyMH/Saved/MU_Character0A825BFF455285945616DF8731BFC792.tmp' to 'D:/AhoyMH/AhoyMH/Content/_AHOY/CHARACTERS/MUTABLE/MU_Character.uasset'
[2024.10.02-06.22.34:776][333]LogFileHelpers: InternalPromptForCheckoutAndSave took 79.262 ms (total: 405.400 ms)
[2024.10.02-06.22.34:816][333]LogContentValidation: Display: Starting to validate 1 assets
[2024.10.02-06.22.34:816][333]LogContentValidation: Enabled validators:
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.DirtyFilesChangelistValidator
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.EditorValidator_Localization
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.PackageFileValidator
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.WorldPartitionChangelistValidator
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/InputBlueprintNodes.EnhancedInputUserWidgetValidator
[2024.10.02-06.22.34:817][333]LogContentValidation: 	/Script/MutableValidation.AssetValidator_CustomizableObjects
[2024.10.02-06.22.34:817][333]LogContentValidation: 	/Script/MutableValidation.AssetValidator_ReferencedCustomizableObjects
[2024.10.02-06.22.34:817][333]AssetCheck: /Game/_AHOY/CHARACTERS/MUTABLE/MU_Character Validating asset
[2024.10.02-06.22.35:482][383]LogMutable: Display: Compiling Customizable Object MU_Character for platform WindowsEditor.
[2024.10.02-06.22.35:498][383]Mutable: Compiling MU_Character. Loading assets
[2024.10.02-06.22.37:908][383]Mutable: Compiling MU_Character. Compiling
[2024.10.02-06.22.37:946][383]LogAutomationController: Ignoring very large delta of 2.47 seconds in calls to FAutomationControllerManager::Tick() and not penalizing unresponsive tests
[2024.10.02-06.22.38:045][384]LogMutableCore: Generated roms: 0 (0 KB) are embedded, 43 (18453 KB) are streamed of which 0 (0 KB) are high-res.
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache Files Written : 0
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache Files Read    : 0
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache MB Written    : 0
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache MB Read       : 0
[2024.10.02-06.22.38:054][385]Mutable: Compiling MU_Character. Saving Data
[2024.10.02-06.22.38:108][388]LogMutable: Enqueue UpdateSkeletalMesh Async. Instance=68890, Frame=12389, Priority=0, dist=18446742974197923840.000000, bIsPlayerOrNearIt=0
[2024.10.02-06.22.38:108][388]LogMutable: Display: Finished compiling Customizable Object MU_Character. Compilation took 2.625 seconds to complete.
[2024.10.02-06.22.38:108][388]Mutable: MU_Character finished compiling.
[2024.10.02-06.22.38:110][388]LogMutable: Enqueue UpdateSkeletalMesh Async. Instance=68890, Frame=12390, Priority=1, dist=18446742974197923840.000000, bIsPlayerOrNearIt=0
[2024.10.02-06.22.38:110][388]LogMutable: Finished UpdateSkeletalMesh Async. Instance=68890, Frame=12390, QueueTime=0.000000, UpdateTime=0.000000
[2024.10.02-06.22.38:110][388]LogMutable: Started UpdateSkeletalMesh Async. Instance=68890, Frame=12390
[2024.10.02-06.22.38:249][391]LogMutable: Warning: Attaching Customizable Skeletal Component to Skeletal Mesh Component with overriden materials! Deleting overrides.
[2024.10.02-06.22.38:256][391]LogMutable: Finished UpdateSkeletalMesh Async. Instance=68890, Frame=12393, QueueTime=0.002362, UpdateTime=0.146207
[2024.10.02-06.22.38:283][392]LogMutable: Started UpdateSkeletalMesh Async. Instance=71616, Frame=12394
[2024.10.02-06.22.38:315][394]LogOutputDevice: Warning: 

Script Stack (0 frames) :

[2024.10.02-06.22.38:325][394]LogWindows: Error: appError called: Assertion failed: (Index >= 0) & (Index < ArrayNum) [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Containers\Array.h] [Line: 783] 
Array index out of bounds: 6 into an array of size 6

[2024.10.02-06.22.38:325][394]LogWindows: Windows GetLastError: The operation completed successfully. (0)

And one last thing.

I’ve been using the Enum switches in the Mutable graphs to determine which mesh to use, or whether to show a mesh at all. You can see that here:

But in Blueprint, there is no “Set Enum Parameter Option”. My assumption was to go with setting an Int parameter anyway, like this:

Obviously it’s hard to verify whether this is working or not, due to the clothing not displaying at all, but perhaps someone could let me know if this is the correct method for a parameter change like this?

I did think to just go back to the Mutable graph and swap the enum parameters for int parameters or even float parameters, but you can “Switch” on either int or float parameter values, so that’s not a solution either.

Documenting my trial and error as I go in case this thread becomes useful for others in the future.

Just figured out that when making parameter changes in Blueprint, you have to run “UpdateSkeletalMeshAsync”, after:
{31981BBD-2CAC-4DB3-AF53-C41E097B6356}

However, when trying to actually change these parameters from the defaults… The same crash as I’ve shared above returns.

Some warnings/errors I get when reloading the engine after these crashes:

1 Like

Managed to get some of the parameters to ‘work’ without crashing. Here you can see the clipping of the arms changes based on which shirt mesh (A, B, or C) I select using the int parameter set:

However doing the same on Enum switches to determine if a mesh component should be added or not seems to cause a crash still. I’m wondering if that’s because having empty mesh components is bad, or if there are some references that the other objects are pointing at (like masking) that no longer exist if certain components aren’t active…

Edit: Disabling the masking entirely still resulted in a crash, so it is perhaps the ‘empty’ mesh components being switching in that is causing the issue. I’ll try some things…

Edit 2: Okay, yes, don’t leave empty mesh components! This is a crash cause.

Bad, causes crash:
{C1F9606B-F2A3-4933-8E58-F93E2C8192F6}

Fine, doesn’t crash:
{363C9CD3-3193-4717-8FB4-73EB42D41232}

Still no clothing actually displaying though. I can just see the masking of the skin updating.

Turns out the “Enable 16-bit Bone Weights” checkbox on the child objects no longer crashes the editor. It was the empty mesh component switches causing that.

However, with those enabled, the meshes still don’t display.

Additionally, I noticed when playing in editor, I get this warning:
{CCF2E336-DA03-452A-8B45-80D6C4C67E1B}

Solved this issue. The warning was seemingly not related at all, but it turns out my body and clothing meshes had a different assigned skeleton. The skeletons were identical, but for whatever reason that was an issue.

I was really hopeful that this would also solve the issue of clothing not rendering at all, but sadly that still remains a problem.

Continued to get errors with the empty mesh switcher (merging skeletons error, as the ‘empty’ mesh doesn’t have a valid skeleton), so had to create a skeletal mesh using the same skeleton as everything else, but with an invisible cube as it’s render mesh. Bit of a hacky solution, but until I hear more about best practices it’ll have to do.

Sadly, still no clothing being rendered, even if the parameter setting works perfectly now.

… Okay, so I essentially solved this.

Originally, I was using the Child components (or separate Base components) input for each of the clothing parts, but I’ve found that I can get the clothing to render by combining them all into one component before outputting:

This feels… Wrong? I’m pretty sure the morph targets on these combined mesh sections are not being correctly calculated as a result of this change, and while the meshes are rendering this way, I have to wonder if this is the correct way to go about this, because if so - Why are there “child object” inputs to begin with.

This unlocks my path forward for now, but I won’t mark this as resolved until I can be sure this is either the intentional workflow, or I’ve managed to ensure all of the morphs and other aspects work as necessary.

Hi @AhoyGame thanks for your interest in Mutable. Unfortunately, the team does not have bandwith to provide support to the community via the forum. But we’re working on samples and documentation that will be released alongside with UE5.5 release and the following weeks.
In the meantime, there’s a public wiki with legacy Mutable documentation here. Hope this helps and good luck with your interesting project!

2 Likes

very helpful. I have just begun my journey into this feature, also. You helped me find the documentation to this important new feature. (which is not in the Official Unreal Editor)

1 Like