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

95 lines
2.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "Materials/MaterialExpressionLandscapeLayerCoords.h"
#include "LandscapePrivate.h"
#include "MaterialCompiler.h"
#define LOCTEXT_NAMESPACE "Landscape"
///////////////////////////////////////////////////////////////////////////////
// UMaterialExpressionLandscapeLayerCoords
///////////////////////////////////////////////////////////////////////////////
UMaterialExpressionLandscapeLayerCoords::UMaterialExpressionLandscapeLayerCoords(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);
bCollapsed = false;
#endif
}
#if WITH_EDITOR
int32 UMaterialExpressionLandscapeLayerCoords::Compile(class FMaterialCompiler* Compiler, int32 OutputIndex)
{
switch (CustomUVType)
{
case LCCT_CustomUV0:
return Compiler->TextureCoordinate(0, false, false);
case LCCT_CustomUV1:
return Compiler->TextureCoordinate(1, false, false);
case LCCT_CustomUV2:
return Compiler->TextureCoordinate(2, false, false);
case LCCT_WeightMapUV:
return Compiler->TextureCoordinate(3, false, false);
default:
break;
}
int32 BaseUV;
switch (MappingType)
{
case TCMT_Auto:
case TCMT_XY: BaseUV = Compiler->TextureCoordinate(0, false, false); break;
case TCMT_XZ: BaseUV = Compiler->TextureCoordinate(1, false, false); break;
case TCMT_YZ:
{
int Y = Compiler->ComponentMask(Compiler->TextureCoordinate(0, false, false), 0, 1, 0, 0);
int Z = Compiler->ComponentMask(Compiler->TextureCoordinate(1, false, false), 0, 1, 0, 0);
BaseUV = Compiler->AppendVector(Y, Z);
}
break;
default:
UE_LOG(LogLandscape, Fatal, TEXT("Invalid mapping type %u"), (uint8)MappingType);
return INDEX_NONE;
};
float Scale = (MappingScale == 0.0f) ? 1.0f : 1.0f / MappingScale;
const float RotX = FMath::Cos(MappingRotation * PI / 180.0f) * Scale;
const float RotY = FMath::Sin(MappingRotation * PI / 180.0f) * Scale;
int32 TransformedUV = Compiler->Add(
Compiler->AppendVector(
Compiler->Dot(BaseUV, Compiler->Constant2(+RotX, +RotY)),
Compiler->Dot(BaseUV, Compiler->Constant2(-RotY, +RotX))),
Compiler->Constant2(MappingPanU, MappingPanV)
);
return TransformedUV;
}
void UMaterialExpressionLandscapeLayerCoords::GetCaption(TArray<FString>& OutCaptions) const
{
OutCaptions.Add(FString(TEXT("Landscape Coords")));
}
#endif // WITH_EDITOR
#undef LOCTEXT_NAMESPACE