Files
UnrealEngine/Engine/Source/Runtime/Landscape/Private/Materials/MaterialExpressionLandscapePhysicalMaterialOutput.cpp
2025-05-18 13:04:45 +08:00

113 lines
2.9 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Materials/MaterialExpressionLandscapePhysicalMaterialOutput.h"
#include "EdGraph/EdGraphNode.h"
#include "Engine/Engine.h"
#include "EngineGlobals.h"
#include "MaterialCompiler.h"
#include "PhysicalMaterials/PhysicalMaterial.h"
#include UE_INLINE_GENERATED_CPP_BY_NAME(MaterialExpressionLandscapePhysicalMaterialOutput)
#define LOCTEXT_NAMESPACE "Landscape"
UMaterialExpressionLandscapePhysicalMaterialOutput::UMaterialExpressionLandscapePhysicalMaterialOutput(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
// Structure to hold one-time initialization
struct FConstructorStatics
{
FText NAME_Landscape;
FConstructorStatics()
: NAME_Landscape(LOCTEXT("Landscape", "Landscape"))
{
}
};
static FConstructorStatics ConstructorStatics;
#if WITH_EDITORONLY_DATA
MenuCategories.Add(ConstructorStatics.NAME_Landscape);
// No outputs
Outputs.Reset();
#endif
}
#if WITH_EDITOR
void UMaterialExpressionLandscapePhysicalMaterialOutput::GetCaption(TArray<FString>& OutCaptions) const
{
OutCaptions.Add(FString(TEXT("Landscape Physical Material Output")));
}
TArrayView<FExpressionInput*> UMaterialExpressionLandscapePhysicalMaterialOutput::GetInputsView()
{
CachedInputs.Empty();
CachedInputs.Reserve(Inputs.Num());
for (auto& Input : Inputs)
{
CachedInputs.Add(&Input.Input);
}
return CachedInputs;
}
FExpressionInput* UMaterialExpressionLandscapePhysicalMaterialOutput::GetInput(int32 InputIndex)
{
return Inputs.IsValidIndex(InputIndex) ? &Inputs[InputIndex].Input : nullptr;
}
FName UMaterialExpressionLandscapePhysicalMaterialOutput::GetInputName(int32 InputIndex) const
{
UPhysicalMaterial* PhysicalMaterial = Inputs[InputIndex].PhysicalMaterial;
if (PhysicalMaterial != nullptr)
{
return PhysicalMaterial->GetFName();
}
return NAME_None;
}
int32 UMaterialExpressionLandscapePhysicalMaterialOutput::Compile(class FMaterialCompiler* Compiler, int32 OutputIndex)
{
if (Inputs.IsValidIndex(OutputIndex))
{
if (Inputs[OutputIndex].PhysicalMaterial == nullptr)
{
return CompilerError(Compiler, TEXT("Physical material not set."));
}
if (Inputs[OutputIndex].Input.Expression == nullptr)
{
return CompilerError(Compiler, TEXT("Input missing."));
}
return Compiler->CustomOutput(this, OutputIndex, Inputs[OutputIndex].Input.Compile(Compiler));
}
return INDEX_NONE;
}
void UMaterialExpressionLandscapePhysicalMaterialOutput::PostEditChangeProperty(FPropertyChangedEvent& PropertyChangedEvent)
{
Super::PostEditChangeProperty(PropertyChangedEvent);
if (PropertyChangedEvent.MemberProperty)
{
const FName PropertyName = PropertyChangedEvent.MemberProperty->GetFName();
if (PropertyName == GET_MEMBER_NAME_CHECKED(UMaterialExpressionLandscapePhysicalMaterialOutput, Inputs))
{
if (GraphNode)
{
GraphNode->ReconstructNode();
}
}
}
}
#endif // WITH_EDITOR
#undef LOCTEXT_NAMESPACE