Add Sample Global SDF Gradient node to materials and particles

This commit is contained in:
Wojciech Figat
2022-03-28 13:58:27 +02:00
parent 4938c7e64b
commit a685962d32
2 changed files with 29 additions and 0 deletions

View File

@@ -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),
}
},
};
}
}

View File

@@ -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;
}