diff --git a/Source/Editor/Surface/Archetypes/Textures.cs b/Source/Editor/Surface/Archetypes/Textures.cs index beed72475..044ee6430 100644 --- a/Source/Editor/Surface/Archetypes/Textures.cs +++ b/Source/Editor/Surface/Archetypes/Textures.cs @@ -371,6 +371,20 @@ namespace FlaxEditor.Surface.Archetypes NodeElementArchetype.Factory.Input(0, "World Position", true, typeof(Vector3), 1), } }, + new NodeArchetype + { + TypeID = 15, + Title = "Sample Global SDF Gradient", + Description = "Samples the Global SDF to get the gradient and distance to the closest surface (in world-space). Normalize gradient to get SDF surface normal vector. Requires models SDF to be generated and checking `Enable Global SDF` in Graphics Settings.", + Flags = NodeFlags.MaterialGraph | NodeFlags.ParticleEmitterGraph, + Size = new Vector2(260, 40), + Elements = new[] + { + NodeElementArchetype.Factory.Output(0, "Gradient", typeof(Vector3), 0), + NodeElementArchetype.Factory.Output(1, "Distance", typeof(float), 2), + NodeElementArchetype.Factory.Input(0, "World Position", true, typeof(Vector3), 1), + } + }, }; } } diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp index bff013718..7ed372a32 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Textures.cpp @@ -429,6 +429,21 @@ void MaterialGenerator::ProcessGroupTextures(Box* box, Node* node, Value& value) _includes.Add(TEXT("./Flax/GlobalSignDistanceField.hlsl")); break; } + // Sample Global SDF Gradient + case 15: + { + auto gradientBox = node->GetBox(0); + auto distanceBox = node->GetBox(2); + auto param = findOrAddGlobalSDF(); + Value worldPosition = tryGetValue(node->GetBox(1), Value(VariantType::Vector3, TEXT("input.WorldPosition.xyz"))).Cast(VariantType::Vector3); + auto distance = writeLocal(VariantType::Float, node); + auto gradient = writeLocal(VariantType::Vector3, String::Format(TEXT("SampleGlobalSDFGradient({0}, {0}_Tex, {1}, {2})"), param.ShaderName, worldPosition.Value, distance.Value), node); + _includes.Add(TEXT("./Flax/GlobalSignDistanceField.hlsl")); + gradientBox->Cache = gradient; + distanceBox->Cache = distance; + value = box == gradientBox ? gradient : distance; + break; + } default: break; }