|
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" |
@@ -681,20 +682,55 @@ void DisconnectIfExpressionMissing(FExpressionInput& Input, UMaterial* Material) |
681 | 682 | } |
682 | 683 | } |
683 | 684 |
|
| 685 | +static bool PreferEmissiveColor(EMaterialDomain Domain) { |
| 686 | + return Domain == EMaterialDomain::MD_PostProcess || Domain == EMaterialDomain::MD_UI; |
| 687 | +} |
| 688 | + |
684 | 689 | void UMaterialGenerator::TryConnectBasicMaterialPins(UMaterial* Material) { |
685 | 690 | FExpressionInput& BaseColorInput = Material->GetEditorOnlyData()->BaseColor; |
686 | 691 | FExpressionInput& NormalInput = Material->GetEditorOnlyData()->Normal; |
| 692 | + FExpressionInput& EmissiveColorInput = Material->GetEditorOnlyData()->EmissiveColor; |
687 | 693 |
|
688 | 694 | DisconnectIfExpressionMissing(BaseColorInput, Material); |
689 | 695 | 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; |
690 | 719 |
|
691 | 720 | for (UMaterialExpression* Expression : Material->GetExpressions()) { |
692 | 721 | 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; |
698 | 734 | } |
699 | 735 | } |
700 | 736 | } |
|
0 commit comments