// Copyright UShaderLab. All Rights Reserved. // // Mesh / surface attribute intrinsics (vertex normals/tangents, colors, UVs). #include "ShaderLabIntrinsics.h" #include "Materials/MaterialExpressionLightmapUVs.h" #include "Materials/MaterialExpressionPixelNormalWS.h" #include "Materials/MaterialExpressionPreSkinnedNormal.h" #include "Materials/MaterialExpressionPreSkinnedPosition.h" #include "Materials/MaterialExpressionTextureCoordinate.h" #include "Materials/MaterialExpressionTwoSidedSign.h" #include "Materials/MaterialExpressionVertexColor.h" #include "Materials/MaterialExpressionVertexNormalWS.h" #include "Materials/MaterialExpressionVertexTangentWS.h" void RegisterMeshIntrinsics(FShaderLabIntrinsicRegistry& Registry) { using namespace ShaderLabIntrinsic_Private; using EFreq = EShaderLabIntrinsicFrequency; AddSimple(Registry, TEXT("VertexNormalWS"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("VertexTangentWS"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("PixelNormalWS"), EFreq::PixelOnly, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("VertexColor"), EFreq::Any, TEXT("float4"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("TwoSidedSign"), EFreq::Any, TEXT("float"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("LightmapUVs"), EFreq::Any, TEXT("float2"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("PreSkinnedNormal"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("PreSkinnedPosition"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); // TextureCoordinate(Index[, UTiling, VTiling]) — const args configure the node. { FShaderLabIntrinsicDesc Desc; Desc.Name = FName(TEXT("TextureCoordinate")); Desc.ReturnType = TEXT("float2"); Desc.Params = { { TEXT("int"), TEXT("Index"), TEXT("") }, { TEXT("float"), TEXT("UTiling"), TEXT("1") }, { TEXT("float"), TEXT("VTiling"), TEXT("1") } }; Desc.Doc = TEXT("UV channel `Index`, optionally tiled."); Desc.MakeNode = [](UMaterial& M, const TArray& Args, FString&) -> UMaterialExpression* { UMaterialExpressionTextureCoordinate* E = NewObject(&M); if (Args.Num() >= 1) { E->CoordinateIndex = FCString::Atoi(*Args[0]); } if (Args.Num() >= 2) { E->UTiling = FCString::Atof(*Args[1]); } if (Args.Num() >= 3) { E->VTiling = FCString::Atof(*Args[2]); } M.GetExpressionCollection().AddExpression(E); return E; }; Registry.Register(MoveTemp(Desc)); } }