Skip to content

Commit 3e497c4

Browse files
committed
Improve domain-specific material generation
Signed-off-by: Angel Pons <[email protected]>
1 parent 38d3783 commit 3e497c4

File tree

1 file changed

+41
-5
lines changed

1 file changed

+41
-5
lines changed

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

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "Engine/Texture.h"
55
#include "Engine/Texture2DArray.h"
66
#include "Kismet2/BlueprintEditorUtils.h"
7+
#include "MaterialDomain.h"
78
#include "MaterialEditor/Public/MaterialEditingLibrary.h"
89
#include "MaterialGraph/MaterialGraphNode_Comment.h"
910
#include "Materials/Material.h"
@@ -681,20 +682,55 @@ void DisconnectIfExpressionMissing(FExpressionInput& Input, UMaterial* Material)
681682
}
682683
}
683684

685+
static bool PreferEmissiveColor(EMaterialDomain Domain) {
686+
return Domain == EMaterialDomain::MD_PostProcess || Domain == EMaterialDomain::MD_UI;
687+
}
688+
684689
void UMaterialGenerator::TryConnectBasicMaterialPins(UMaterial* Material) {
685690
FExpressionInput& BaseColorInput = Material->GetEditorOnlyData()->BaseColor;
686691
FExpressionInput& NormalInput = Material->GetEditorOnlyData()->Normal;
692+
FExpressionInput& EmissiveColorInput = Material->GetEditorOnlyData()->EmissiveColor;
687693

688694
DisconnectIfExpressionMissing(BaseColorInput, Material);
689695
DisconnectIfExpressionMissing(NormalInput, Material);
696+
DisconnectIfExpressionMissing(EmissiveColorInput, Material);
697+
698+
if (Material->MaterialDomain == EMaterialDomain::MD_PostProcess) {
699+
const FVector2D NodePos = FVector2D(Material->EditorX - 384, Material->EditorY);
700+
// This terribleness is necessary because UMaterialExpressionSceneTexture
701+
// is not exported at all, so there is no way to use the type directly...
702+
UPackage* EngineScriptPackage = UEngine::StaticClass()->GetOuterUPackage();
703+
TSubclassOf<UMaterialExpression> SceneTextureExpressionClass = FindObjectChecked<UClass>(EngineScriptPackage, TEXT("MaterialExpressionSceneTexture"));
704+
UMaterialExpression* SceneTextureExpression = SpawnMaterialExpression<UMaterialExpression>(Material, NodePos, SceneTextureExpressionClass);
705+
if (FByteProperty* Prop = CastField<FByteProperty>(SceneTextureExpressionClass->FindPropertyByName(TEXT("SceneTextureId")))) {
706+
if (uint8* ValuePtr = Prop->ContainerPtrToValuePtr<uint8>(SceneTextureExpression)) {
707+
*ValuePtr = PPI_PostProcessInput0;
708+
} else {
709+
fgcheckf(0, TEXT("bad ValuePtr"));
710+
}
711+
} else {
712+
fgcheckf(0, TEXT("bad Prop"));
713+
}
714+
EmissiveColorInput.Connect(0, SceneTextureExpression);
715+
return;
716+
}
717+
718+
FExpressionInput& ColorInput = PreferEmissiveColor(Material->MaterialDomain) ? EmissiveColorInput : BaseColorInput;
690719

691720
for (UMaterialExpression* Expression : Material->GetExpressions()) {
692721
if (UMaterialExpressionTextureSample* TextureSample = Cast<UMaterialExpressionTextureSample>(Expression)) {
693-
if ((TextureSample->SamplerType == SAMPLERTYPE_Color || TextureSample->SamplerType == SAMPLERTYPE_LinearColor) && !BaseColorInput.IsConnected()) {
694-
BaseColorInput.Connect(0, TextureSample);
695-
}
696-
else if (TextureSample->SamplerType == SAMPLERTYPE_Normal && !NormalInput.IsConnected()) {
697-
NormalInput.Connect(0, TextureSample);
722+
switch (TextureSample->SamplerType) {
723+
case SAMPLERTYPE_Color:
724+
case SAMPLERTYPE_LinearColor:
725+
if (!ColorInput.IsConnected()) {
726+
ColorInput.Connect(0, TextureSample);
727+
}
728+
break;
729+
case SAMPLERTYPE_Normal:
730+
if (!NormalInput.IsConnected()) {
731+
NormalInput.Connect(0, TextureSample);
732+
}
733+
break;
698734
}
699735
}
700736
}

0 commit comments

Comments
 (0)