diff --git a/Source/Editor/Surface/Archetypes/Constants.cs b/Source/Editor/Surface/Archetypes/Constants.cs index 768467ebd..ff20695c0 100644 --- a/Source/Editor/Surface/Archetypes/Constants.cs +++ b/Source/Editor/Surface/Archetypes/Constants.cs @@ -1,3 +1,9 @@ +#if USE_LARGE_WORLDS +using Real = System.Double; +#else +using Real = System.Single; +#endif + // Copyright (c) 2012-2022 Wojciech Figat. All rights reserved. using System; @@ -683,6 +689,89 @@ namespace FlaxEditor.Surface.Archetypes DefaultValues = new object[] { typeof(int).FullName, typeof(string).FullName }, Elements = new[] { NodeElementArchetype.Factory.Output(0, string.Empty, null, 0) } }, + new NodeArchetype + { + TypeID = 15, + Title = "Double", + Description = "Constant floating point", + Flags = NodeFlags.AllGraphs, + Size = new Float2(110, 20), + DefaultValues = new object[] + { + 0.0d + }, + Elements = new[] + { + NodeElementArchetype.Factory.Output(0, "Value", typeof(double), 0), + NodeElementArchetype.Factory.Float(0, 0, 0) + }, + }, + new NodeArchetype + { + TypeID = 16, + Title = "Vector2", + Description = "Constant Vector2", + Flags = NodeFlags.AllGraphs, + Size = new Float2(130, 60), + DefaultValues = new object[] + { + Vector2.Zero + }, + Elements = new[] + { + NodeElementArchetype.Factory.Output(0, "Value", typeof(Vector2), 0), + NodeElementArchetype.Factory.Output(1, "X", typeof(Real), 1), + NodeElementArchetype.Factory.Output(2, "Y", typeof(Real), 2), + NodeElementArchetype.Factory.Vector_X(0, 1 * Surface.Constants.LayoutOffsetY, 0), + NodeElementArchetype.Factory.Vector_Y(0, 2 * Surface.Constants.LayoutOffsetY, 0) + } + }, + new NodeArchetype + { + TypeID = 17, + Title = "Vector3", + Description = "Constant Vector3", + Flags = NodeFlags.AllGraphs, + Size = new Float2(130, 80), + DefaultValues = new object[] + { + Vector3.Zero + }, + Elements = new[] + { + NodeElementArchetype.Factory.Output(0, "Value", typeof(Vector3), 0), + NodeElementArchetype.Factory.Output(1, "X", typeof(Real), 1), + NodeElementArchetype.Factory.Output(2, "Y", typeof(Real), 2), + NodeElementArchetype.Factory.Output(3, "Z", typeof(Real), 3), + NodeElementArchetype.Factory.Vector_X(0, 1 * Surface.Constants.LayoutOffsetY, 0), + NodeElementArchetype.Factory.Vector_Y(0, 2 * Surface.Constants.LayoutOffsetY, 0), + NodeElementArchetype.Factory.Vector_Z(0, 3 * Surface.Constants.LayoutOffsetY, 0) + } + }, + new NodeArchetype + { + TypeID = 18, + Title = "Vector4", + Description = "Constant Vector4", + Flags = NodeFlags.AllGraphs, + Size = new Float2(130, 100), + DefaultValues = new object[] + { + Vector4.Zero + }, + Elements = new[] + { + NodeElementArchetype.Factory.Output(0, "Value", typeof(Vector4), 0), + NodeElementArchetype.Factory.Output(1, "X", typeof(Real), 1), + NodeElementArchetype.Factory.Output(2, "Y", typeof(Real), 2), + NodeElementArchetype.Factory.Output(3, "Z", typeof(Real), 3), + NodeElementArchetype.Factory.Output(4, "W", typeof(Real), 4), + NodeElementArchetype.Factory.Vector_X(0, 1 * Surface.Constants.LayoutOffsetY, 0), + NodeElementArchetype.Factory.Vector_Y(0, 2 * Surface.Constants.LayoutOffsetY, 0), + NodeElementArchetype.Factory.Vector_Z(0, 3 * Surface.Constants.LayoutOffsetY, 0), + NodeElementArchetype.Factory.Vector_W(0, 4 * Surface.Constants.LayoutOffsetY, 0) + } + }, }; /// diff --git a/Source/Engine/Visject/ShaderGraph.cpp b/Source/Engine/Visject/ShaderGraph.cpp index cfe55d992..e2d70d192 100644 --- a/Source/Engine/Visject/ShaderGraph.cpp +++ b/Source/Engine/Visject/ShaderGraph.cpp @@ -69,60 +69,26 @@ void ShaderGenerator::ProcessGroupConstants(Box* box, Node* node, Value& value) case 2: case 3: case 12: + case 15: value = Value(node->Values[0]); break; + // Float2/3/4, Color case 4: - { - const Variant& cv = node->Values[0]; - if (box->ID == 0) - value = Value(cv); - else if (box->ID == 1) - value = Value(cv.AsFloat2().X); - else if (box->ID == 2) - value = Value(cv.AsFloat2().Y); - break; - } case 5: - { - const Variant& cv = node->Values[0]; - if (box->ID == 0) - value = Value(cv); - else if (box->ID == 1) - value = Value(cv.AsFloat3().X); - else if (box->ID == 2) - value = Value(cv.AsFloat3().Y); - else if (box->ID == 3) - value = Value(cv.AsFloat3().Z); - break; - } case 6: - { - const Variant& cv = node->Values[0]; - if (box->ID == 0) - value = Value(cv); - else if (box->ID == 1) - value = Value(cv.AsFloat4().X); - else if (box->ID == 2) - value = Value(cv.AsFloat4().Y); - else if (box->ID == 3) - value = Value(cv.AsFloat4().Z); - else if (box->ID == 4) - value = Value(cv.AsFloat4().W); - break; - } case 7: { - const Variant& cv = node->Values[0]; + const Float4 cv = (Float4)node->Values[0]; if (box->ID == 0) value = Value(cv); else if (box->ID == 1) - value = Value(cv.AsColor().R); + value = Value(cv.X); else if (box->ID == 2) - value = Value(cv.AsColor().G); + value = Value(cv.Y); else if (box->ID == 3) - value = Value(cv.AsColor().B); + value = Value(cv.Z); else if (box->ID == 4) - value = Value(cv.AsColor().A); + value = Value(cv.W); break; } case 8: @@ -136,6 +102,24 @@ void ShaderGenerator::ProcessGroupConstants(Box* box, Node* node, Value& value) value = Value(PI); break; } + // Vector2/3/4 + case 16: + case 17: + case 18: + { + const Vector4 cv = (Vector4)node->Values[0]; + if (box->ID == 0) + value = Value(cv); + else if (box->ID == 1) + value = Value(cv.X); + else if (box->ID == 2) + value = Value(cv.Y); + else if (box->ID == 3) + value = Value(cv.Z); + else if (box->ID == 4) + value = Value(cv.W); + break; + } default: break; } diff --git a/Source/Engine/Visject/VisjectGraph.cpp b/Source/Engine/Visject/VisjectGraph.cpp index 446da61f0..5535387f7 100644 --- a/Source/Engine/Visject/VisjectGraph.cpp +++ b/Source/Engine/Visject/VisjectGraph.cpp @@ -56,46 +56,26 @@ void VisjectExecutor::ProcessGroupConstants(Box* box, Node* node, Value& value) case 2: case 3: case 12: + case 15: value = node->Values[0]; break; + // Float2/3/4, Color case 4: - { - const Value& cv = node->Values[0]; - if (box->ID == 0) - value = cv; - else if (box->ID == 1) - value = cv.AsFloat2().X; - else if (box->ID == 2) - value = cv.AsFloat2().Y; - break; - } case 5: - { - const Value& cv = node->Values[0]; - if (box->ID == 0) - value = cv; - else if (box->ID == 1) - value = cv.AsFloat3().X; - else if (box->ID == 2) - value = cv.AsFloat3().Y; - else if (box->ID == 3) - value = cv.AsFloat3().Z; - break; - } case 6: case 7: { - const Value& cv = node->Values[0]; + const Float4 cv = (Float4)node->Values[0]; if (box->ID == 0) value = cv; else if (box->ID == 1) - value = cv.AsFloat4().X; + value = cv.X; else if (box->ID == 2) - value = cv.AsFloat4().Y; + value = cv.Y; else if (box->ID == 3) - value = cv.AsFloat4().Z; + value = cv.Z; else if (box->ID == 4) - value = cv.AsFloat4().W; + value = cv.W; break; } case 8: @@ -145,6 +125,24 @@ void VisjectExecutor::ProcessGroupConstants(Box* box, Node* node, Value& value) value.Type.SetTypeName(typeName); break; } + // Vector2/3/4 + case 16: + case 17: + case 18: + { + const Vector4 cv = (Vector4)node->Values[0]; + if (box->ID == 0) + value = cv; + else if (box->ID == 1) + value = cv.X; + else if (box->ID == 2) + value = cv.Y; + else if (box->ID == 3) + value = cv.Z; + else if (box->ID == 4) + value = cv.W; + break; + } default: break; }