From 3c0e42ea780cbc59cc8d892c6bcd8289dab54d31 Mon Sep 17 00:00:00 2001 From: artkez <33177434+artkez@users.noreply.github.com> Date: Thu, 16 Jun 2022 10:28:57 +0300 Subject: [PATCH] added Smoothstep and Step material nodes --- Source/Editor/Surface/Archetypes/Math.cs | 29 ++++++++++++++++++++++++ Source/Engine/Visject/ShaderGraph.cpp | 17 ++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/Source/Editor/Surface/Archetypes/Math.cs b/Source/Editor/Surface/Archetypes/Math.cs index 063e2f931..72932244e 100644 --- a/Source/Editor/Surface/Archetypes/Math.cs +++ b/Source/Editor/Surface/Archetypes/Math.cs @@ -441,6 +441,35 @@ namespace FlaxEditor.Surface.Archetypes NodeElementArchetype.Factory.Output(0, string.Empty, typeof(Float3), 2), } }, + new NodeArchetype + { + TypeID = 50, + Title = "Smoothstep", + Description = "Returns a smooth Hermite interpolation between 0 and 1, if value is in the range [min, max].", + Flags = NodeFlags.MaterialGraph, + Size = new Float2(110, 60), + ConnectionsHints = ConnectionsHint.Numeric, + IndependentBoxes = new[] + { + 0, + 1, + 2 + }, + DependentBoxes = new[] { 3 }, + DefaultValues = new object[] + { + 0.0f, + 1.0f, + }, + Elements = new[] + { + NodeElementArchetype.Factory.Input(0, "Min", true, null, 0), + NodeElementArchetype.Factory.Input(1, "Max", true, null, 1), + NodeElementArchetype.Factory.Input(2, "Value", true, null, 2, 1), + NodeElementArchetype.Factory.Output(0, "Result", null, 3) + }, + }, + Op2(51, "Step", "Compares two values, returning 0 or 1 based on which value is greater."), }; } } diff --git a/Source/Engine/Visject/ShaderGraph.cpp b/Source/Engine/Visject/ShaderGraph.cpp index 82a09c909..5a0437e9e 100644 --- a/Source/Engine/Visject/ShaderGraph.cpp +++ b/Source/Engine/Visject/ShaderGraph.cpp @@ -417,6 +417,23 @@ void ShaderGenerator::ProcessGroupMath(Box* box, Node* node, Value& value) value = writeLocal(ValueType::Float3, String::Format(TEXT("QuatRotateVector({0}, {1})"), quaternion.Value, vector.Value), node); break; } + // Smoothstep + case 50: + { + Value v1 = tryGetValue(node->GetBox(0), Value::Zero); + Value v2 = tryGetValue(node->GetBox(1), Value::Zero); + Value v3 = tryGetValue(node->GetBox(2), Value::Zero); + value = writeFunction3(node, v1, v2, v3, TEXT("smoothstep"), v1.Type); + break; + } + // Step + case 51: + { + Value v1 = tryGetValue(node->GetBox(0), Value::Zero); + Value v2 = tryGetValue(node->GetBox(1), Value::Zero); + value = writeFunction2(node, v1, v2, TEXT("step")); + break; + } default: break; }