Skip to content

Commit 9048339

Browse files
committed
Workaround for material generation crash on one particular material
1 parent e40606b commit 9048339

1 file changed

Lines changed: 24 additions & 7 deletions

File tree

AssetGenerator/Source/AssetGenerator/Private/Toolkit/AssetTypeGenerator/MaterialGenerator.cpp

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -411,27 +411,44 @@ void UMaterialGenerator::ApplyMaterialParameterValueChanges(UMaterial* Material,
411411
}
412412
}
413413

414+
// TODO: Was previously using FindChecked, but one particular material has a font expression present in CachedExpresisonData
415+
// but the parameter doesn't actually exist. Not sure how to handle this properly, but for now just logging it is fine.
414416
for (const TParameterValueChange<float>& ScalarParameter : LayoutChangeInfo.ScalarParameterValueChanges) {
415-
UMaterialExpressionScalarParameter* Parameter = ScalarParameters.FindChecked(ScalarParameter.ParameterName);
417+
UMaterialExpressionScalarParameter** ParameterPtr = ScalarParameters.Find(ScalarParameter.ParameterName);
418+
if (!ensureMsgf(ParameterPtr, TEXT("Material %s has a scalar parameter '%s' that was not found"), *Material->GetPathName(), *ScalarParameter.ParameterName.ToString()))
419+
continue;
420+
UMaterialExpressionScalarParameter* Parameter = *ParameterPtr;
416421
Parameter->DefaultValue = ScalarParameter.NewValue;
417422
}
418423

419424
for (const TParameterValueChange<FLinearColor>& VectorParameter : LayoutChangeInfo.VectorParameterValueChanges) {
420-
UMaterialExpressionVectorParameter* Parameter = VectorParameters.FindChecked(VectorParameter.ParameterName);
425+
UMaterialExpressionVectorParameter** ParameterPtr = VectorParameters.Find(VectorParameter.ParameterName);
426+
if (!ensureMsgf(ParameterPtr, TEXT("Material %s has a vector parameter '%s' that was not found"), *Material->GetPathName(), *VectorParameter.ParameterName.ToString()))
427+
continue;
428+
UMaterialExpressionVectorParameter* Parameter = *ParameterPtr;
421429
Parameter->DefaultValue = VectorParameter.NewValue;
422430
}
423-
for (const TParameterValueChange<TSoftObjectPtr<UTexture>> TextureParameter : LayoutChangeInfo.TextureParameterValueChanges) {
424-
UMaterialExpressionTextureSampleParameter* Parameter = TextureParameters.FindChecked(TextureParameter.ParameterName);
431+
for (const TParameterValueChange<TSoftObjectPtr<UTexture>>& TextureParameter : LayoutChangeInfo.TextureParameterValueChanges) {
432+
UMaterialExpressionTextureSampleParameter** ParameterPtr = TextureParameters.Find(TextureParameter.ParameterName);
433+
if (!ensureMsgf(ParameterPtr, TEXT("Material %s has a texture parameter '%s' that was not found"), *Material->GetPathName(), *TextureParameter.ParameterName.ToString()))
434+
continue;
435+
UMaterialExpressionTextureSampleParameter* Parameter = *ParameterPtr;
425436
Parameter->Texture = TextureParameter.NewValue.Get();
426437
Parameter->AutoSetSampleType();
427438
}
428439
for (const TParameterValueChange<FSimpleFontParameterValue>& FontParameter : LayoutChangeInfo.FontParameterValueChanges) {
429-
UMaterialExpressionFontSampleParameter* Parameter = FontParameters.FindChecked(FontParameter.ParameterName);
440+
UMaterialExpressionFontSampleParameter** ParameterPtr = FontParameters.Find(FontParameter.ParameterName);
441+
if (!ensureMsgf(ParameterPtr, TEXT("Material %s has a font parameter '%s' that was not found"), *Material->GetPathName(), *FontParameter.ParameterName.ToString()))
442+
continue;
443+
UMaterialExpressionFontSampleParameter* Parameter = *ParameterPtr;
430444
Parameter->Font = FontParameter.NewValue.Font.Get();
431445
Parameter->FontTexturePage = FontParameter.NewValue.FontPage;
432446
}
433-
for (const TParameterValueChange<TSoftObjectPtr<URuntimeVirtualTexture>> TextureParameter : LayoutChangeInfo.VirtualTextureParameterValueChanges) {
434-
UMaterialExpressionRuntimeVirtualTextureSampleParameter* Parameter = VirtualTextureParameters.FindChecked(TextureParameter.ParameterName);
447+
for (const TParameterValueChange<TSoftObjectPtr<URuntimeVirtualTexture>>& TextureParameter : LayoutChangeInfo.VirtualTextureParameterValueChanges) {
448+
UMaterialExpressionRuntimeVirtualTextureSampleParameter** ParameterPtr = VirtualTextureParameters.Find(TextureParameter.ParameterName);
449+
if (!ensureMsgf(ParameterPtr, TEXT("Material %s has a virtual texture parameter '%s' that was not found"), *Material->GetPathName(), *TextureParameter.ParameterName.ToString()))
450+
continue;
451+
UMaterialExpressionRuntimeVirtualTextureSampleParameter* Parameter = *ParameterPtr;
435452
Parameter->VirtualTexture = TextureParameter.NewValue.Get();
436453
}
437454
}

0 commit comments

Comments
 (0)