Skip to content

Commit 93e4252

Browse files
committed
Improve domain-specific material generation
Signed-off-by: Angel Pons <[email protected]>
1 parent ddc20c5 commit 93e4252

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"
@@ -664,20 +665,55 @@ void DisconnectIfExpressionMissing(FExpressionInput& Input, UMaterial* Material)
664665
}
665666
}
666667

668+
static bool PreferEmissiveColor(EMaterialDomain Domain) {
669+
return Domain == EMaterialDomain::MD_PostProcess || Domain == EMaterialDomain::MD_UI;
670+
}
671+
667672
void UMaterialGenerator::TryConnectBasicMaterialPins(UMaterial* Material) {
668673
FExpressionInput& BaseColorInput = Material->GetEditorOnlyData()->BaseColor;
669674
FExpressionInput& NormalInput = Material->GetEditorOnlyData()->Normal;
675+
FExpressionInput& EmissiveColorInput = Material->GetEditorOnlyData()->EmissiveColor;
670676

671677
DisconnectIfExpressionMissing(BaseColorInput, Material);
672678
DisconnectIfExpressionMissing(NormalInput, Material);
679+
DisconnectIfExpressionMissing(EmissiveColorInput, Material);
680+
681+
if (Material->MaterialDomain == EMaterialDomain::MD_PostProcess) {
682+
const FVector2D NodePos = FVector2D(Material->EditorX - 384, Material->EditorY);
683+
// This terribleness is necessary because UMaterialExpressionSceneTexture
684+
// is not exported at all, so there is no way to use the type directly...
685+
UPackage* EngineScriptPackage = UEngine::StaticClass()->GetOuterUPackage();
686+
TSubclassOf<UMaterialExpression> SceneTextureExpressionClass = FindObjectChecked<UClass>(EngineScriptPackage, TEXT("MaterialExpressionSceneTexture"));
687+
UMaterialExpression* SceneTextureExpression = SpawnMaterialExpression<UMaterialExpression>(Material, NodePos, SceneTextureExpressionClass);
688+
if (FByteProperty* Prop = CastField<FByteProperty>(SceneTextureExpressionClass->FindPropertyByName(TEXT("SceneTextureId")))) {
689+
if (uint8* ValuePtr = Prop->ContainerPtrToValuePtr<uint8>(SceneTextureExpression)) {
690+
*ValuePtr = PPI_PostProcessInput0;
691+
} else {
692+
fgcheckf(0, TEXT("bad ValuePtr"));
693+
}
694+
} else {
695+
fgcheckf(0, TEXT("bad Prop"));
696+
}
697+
EmissiveColorInput.Connect(0, SceneTextureExpression);
698+
return;
699+
}
700+
701+
FExpressionInput& ColorInput = PreferEmissiveColor(Material->MaterialDomain) ? EmissiveColorInput : BaseColorInput;
673702

674703
for (UMaterialExpression* Expression : Material->GetExpressions()) {
675704
if (UMaterialExpressionTextureSample* TextureSample = Cast<UMaterialExpressionTextureSample>(Expression)) {
676-
if ((TextureSample->SamplerType == SAMPLERTYPE_Color || TextureSample->SamplerType == SAMPLERTYPE_LinearColor) && !BaseColorInput.IsConnected()) {
677-
BaseColorInput.Connect(0, TextureSample);
678-
}
679-
else if (TextureSample->SamplerType == SAMPLERTYPE_Normal && !NormalInput.IsConnected()) {
680-
NormalInput.Connect(0, TextureSample);
705+
switch (TextureSample->SamplerType) {
706+
case SAMPLERTYPE_Color:
707+
case SAMPLERTYPE_LinearColor:
708+
if (!ColorInput.IsConnected()) {
709+
ColorInput.Connect(0, TextureSample);
710+
}
711+
break;
712+
case SAMPLERTYPE_Normal:
713+
if (!NormalInput.IsConnected()) {
714+
NormalInput.Connect(0, TextureSample);
715+
}
716+
break;
681717
}
682718
}
683719
}

0 commit comments

Comments
 (0)