diff --git a/Source/Editor/Surface/Archetypes/Material.cs b/Source/Editor/Surface/Archetypes/Material.cs index a007db7d7..c415ef012 100644 --- a/Source/Editor/Surface/Archetypes/Material.cs +++ b/Source/Editor/Surface/Archetypes/Material.cs @@ -642,6 +642,22 @@ namespace FlaxEditor.Surface.Archetypes NodeElementArchetype.Factory.Output(0, "XYZ", typeof(Vector3), 0), } }, + new NodeArchetype + { + TypeID = 26, + Title = "Blend Normals", + Description = "Blend two normal maps to create a single normal map", + Flags = NodeFlags.MaterialGraph, + Size = new Vector2(170, 40), + ConnectionsHints = ConnectionsHint.Vector, + Elements = new[] + { + NodeElementArchetype.Factory.Input(0, "Base Normal", true, typeof(Vector3), 0), + NodeElementArchetype.Factory.Input(1, "Additional Normal", true, typeof(Vector3), 1), + NodeElementArchetype.Factory.Output(0, "Result", typeof(Vector3), 2) + } + }, + }; } } diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp index f805264f5..6460863d8 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp @@ -339,6 +339,14 @@ void MaterialGenerator::ProcessGroupMaterial(Box* box, Node* node, Value& value) case 25: value = Value(VariantType::Vector3, TEXT("GetObjectSize(input)")); break; + case 26: + { + const auto BaseNormal = tryGetValue(node->GetBox(0), Value::Zero).AsVector3(); + const auto AdditionalNormal = tryGetValue(node->GetBox(1), Value::Zero).AsVector3(); + const String text = String::Format(TEXT("float3((float2({0}.xy) + float2({1}.xy) * 2.0), sqrt(saturate(1.0 - dot((float2({0}.xy) + float2({1}.xy) * 2.0).xy, (float2({0}.xy) + float2({1}.xy) * 2.0).xy))))"), BaseNormal.Value, AdditionalNormal.Value); + value = writeLocal(ValueType::Vector3, text, node); + break; + } default: break; }