// Copyright UShaderLab. All Rights Reserved. // // Object / primitive / bounds intrinsics. #include "ShaderLabIntrinsics.h" #include "Materials/MaterialExpressionActorPositionWS.h" #include "Materials/MaterialExpressionBounds.h" #include "Materials/MaterialExpressionDistanceCullFade.h" #include "Materials/MaterialExpressionLocalPosition.h" #include "Materials/MaterialExpressionObjectBounds.h" #include "Materials/MaterialExpressionObjectLocalBounds.h" #include "Materials/MaterialExpressionObjectOrientation.h" #include "Materials/MaterialExpressionObjectPositionWS.h" #include "Materials/MaterialExpressionObjectRadius.h" #include "Materials/MaterialExpressionPrecomputedAOMask.h" #include "Materials/MaterialExpressionPreSkinnedLocalBounds.h" void RegisterObjectIntrinsics(FShaderLabIntrinsicRegistry& Registry) { using namespace ShaderLabIntrinsic_Private; using EFreq = EShaderLabIntrinsicFrequency; AddSimple(Registry, TEXT("LocalPosition"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("ActorPositionWS"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("ObjectPositionWS"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("ObjectRadius"), EFreq::Any, TEXT("float"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("ObjectBounds"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); // Multi-output nodes: connect output 0 (matches existing behavior). AddSimple(Registry, TEXT("ObjectLocalBounds"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("ObjectOrientation"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("PreSkinnedLocalBounds"), EFreq::Any, TEXT("float3"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("DistanceCullFade"), EFreq::Any, TEXT("float"), [](UMaterial& M) { return MakeSimple(M); }); AddSimple(Registry, TEXT("PrecomputedAOMask"), EFreq::Any, TEXT("float"), [](UMaterial& M) { return MakeSimple(M); }); // Bounds(Space) — unified bounds node; Space is an EMaterialExpressionBoundsType token (MEILB_*). { FShaderLabIntrinsicDesc Desc; Desc.Name = FName(TEXT("Bounds")); Desc.ReturnType = TEXT("float3"); Desc.Doc = TEXT("Space is an EMaterialExpressionBoundsType token (e.g. MEILB_ObjectLocal)."); FShaderLabIntrinsicParam SpaceParam; SpaceParam.Name = TEXT("Space"); SpaceParam.Enum = StaticEnum(); check(SpaceParam.Enum); Desc.Params = { MoveTemp(SpaceParam) }; Desc.MakeNode = [](UMaterial& M, const TArray& Args, FString& OutError) -> UMaterialExpression* { UMaterialExpressionBounds* E = NewObject(&M); if (Args.Num() >= 1) { UEnum* Enum = StaticEnum(); check(Enum); const int64 Value = Enum->GetValueByNameString(Args[0]); if (Value == INDEX_NONE) { OutError = FString::Printf(TEXT("unknown bounds space '%s'"), *Args[0]); return nullptr; } E->Type = static_cast(Value); } M.GetExpressionCollection().AddExpression(E); return E; }; Registry.Register(MoveTemp(Desc)); } }