|
4 | 4 | #include "Engine/Texture.h" |
5 | 5 | #include "Engine/Texture2DArray.h" |
6 | 6 | #include "Kismet2/BlueprintEditorUtils.h" |
| 7 | +#include "MaterialDomain.h" |
7 | 8 | #include "MaterialEditor/Public/MaterialEditingLibrary.h" |
8 | 9 | #include "MaterialGraph/MaterialGraphNode_Comment.h" |
9 | 10 | #include "Materials/Material.h" |
@@ -664,20 +665,55 @@ void DisconnectIfExpressionMissing(FExpressionInput& Input, UMaterial* Material) |
664 | 665 | } |
665 | 666 | } |
666 | 667 |
|
| 668 | +static bool PreferEmissiveColor(EMaterialDomain Domain) { |
| 669 | + return Domain == EMaterialDomain::MD_PostProcess || Domain == EMaterialDomain::MD_UI; |
| 670 | +} |
| 671 | + |
667 | 672 | void UMaterialGenerator::TryConnectBasicMaterialPins(UMaterial* Material) { |
668 | 673 | FExpressionInput& BaseColorInput = Material->GetEditorOnlyData()->BaseColor; |
669 | 674 | FExpressionInput& NormalInput = Material->GetEditorOnlyData()->Normal; |
| 675 | + FExpressionInput& EmissiveColorInput = Material->GetEditorOnlyData()->EmissiveColor; |
670 | 676 |
|
671 | 677 | DisconnectIfExpressionMissing(BaseColorInput, Material); |
672 | 678 | 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; |
673 | 702 |
|
674 | 703 | for (UMaterialExpression* Expression : Material->GetExpressions()) { |
675 | 704 | 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; |
681 | 717 | } |
682 | 718 | } |
683 | 719 | } |
|
0 commit comments