From bcb38dc2ca52a79269ae545b392467b6e0f2c2d4 Mon Sep 17 00:00:00 2001 From: "W2.Wizard" Date: Sun, 24 Jan 2021 15:10:38 +0100 Subject: [PATCH] Added rotator node --- Source/Editor/Surface/Archetypes/Material.cs | 15 +++++++++++++++ .../MaterialGenerator.Material.cpp | 17 +++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/Source/Editor/Surface/Archetypes/Material.cs b/Source/Editor/Surface/Archetypes/Material.cs index 38ebd9134..ee70c2b5e 100644 --- a/Source/Editor/Surface/Archetypes/Material.cs +++ b/Source/Editor/Surface/Archetypes/Material.cs @@ -657,6 +657,21 @@ namespace FlaxEditor.Surface.Archetypes NodeElementArchetype.Factory.Output(0, "Result", typeof(Vector3), 2) } }, + new NodeArchetype + { + TypeID = 27, + Title = "Rotator", + Description = "Rotates UV coordinates according to a scalar angle (0-1)", + Flags = NodeFlags.MaterialGraph, + Size = new Vector2(150, 55), + Elements = new[] + { + NodeElementArchetype.Factory.Input(0, "UV", true, typeof(Vector2), 0), + NodeElementArchetype.Factory.Input(1, "Center", true, typeof(Vector2), 1), + NodeElementArchetype.Factory.Input(2, "Rotation Angle", true, typeof(float), 2), + NodeElementArchetype.Factory.Output(0, string.Empty, typeof(Vector2), 3), + } + }, }; } } diff --git a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp index ce1101868..60e932d8c 100644 --- a/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp +++ b/Source/Engine/Tools/MaterialGenerator/MaterialGenerator.Material.cpp @@ -339,6 +339,7 @@ void MaterialGenerator::ProcessGroupMaterial(Box* box, Node* node, Value& value) case 25: value = Value(VariantType::Vector3, TEXT("GetObjectSize(input)")); break; + // Normal blend case 26: { const auto baseNormal = tryGetValue(node->GetBox(0), Value::Zero).AsVector3(); @@ -346,6 +347,22 @@ void MaterialGenerator::ProcessGroupMaterial(Box* box, Node* node, Value& value) 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; + } + // Rotator + case 27: + { + auto UV = tryGetValue(node->GetBox(0), Value::Zero).AsVector2(); + auto center = tryGetValue(node->GetBox(1), Value::Zero).AsVector2(); + auto rotationAngle = tryGetValue(node->GetBox(2), Value::Zero).AsFloat(); + + const auto x1 = writeLocal(ValueType::Vector2, String::Format(TEXT("({0} * -1) + {1}"), center.Value, UV.Value), node); + const auto RACosSin = writeLocal(ValueType::Vector2, String::Format(TEXT("float2(cos({0}), sin({0}))"), rotationAngle.Value), node); + + const auto DotB1 = writeLocal(ValueType::Vector2, String::Format(TEXT("float2({0}.x, {0}.y * -1)"), RACosSin.Value), node); + const auto DotB2 = writeLocal(ValueType::Vector2, String::Format(TEXT("float2({0}.y, {0}.x)"), RACosSin.Value), node); + + value = writeLocal(ValueType::Vector2, String::Format(TEXT("{3} + float2(dot({0},{1}), dot({0},{2}))"), x1.Value, DotB1.Value, DotB2.Value, center.Value), node); + break; } default: break;