From 67f3f89bf76b2eb1d91d0b70e3c4c65fb73717fa Mon Sep 17 00:00:00 2001 From: Nils Hausfeld Date: Thu, 13 Jun 2024 22:03:41 +0200 Subject: [PATCH] - Override node inputs/outputs now also get shown - Added special treatment for enum, pack and unpack nodes in order to also show their inputs/outputs --- .../Editor/Surface/ContextMenu/VisjectCM.cs | 69 ++++++++++++++++--- Source/Editor/Surface/VisualScriptSurface.cs | 1 + 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/Source/Editor/Surface/ContextMenu/VisjectCM.cs b/Source/Editor/Surface/ContextMenu/VisjectCM.cs index e386fa668..15e1448b0 100644 --- a/Source/Editor/Surface/ContextMenu/VisjectCM.cs +++ b/Source/Editor/Surface/ContextMenu/VisjectCM.cs @@ -2,7 +2,9 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Reflection; using FlaxEditor.GUI.ContextMenu; using FlaxEditor.GUI.Input; using FlaxEditor.Scripting; @@ -688,7 +690,10 @@ namespace FlaxEditor.Surface.ContextMenu if (memberInfo.ValueType != ScriptType.Null && memberInfo.ValueType != ScriptType.Void) { _surfaceStyle.GetConnectionColor(memberInfo.ValueType, archetype.ConnectionsHints, out typeColor); - AddOutputElement(spriteHandle, typeColor, $">Return ({memberInfo.ValueType.Name})"); + if (memberInfo.IsField && archetype.Title.StartsWith("Set ")) + AddInputElement(spriteHandle, typeColor, $"({memberInfo.ValueType.Name})"); + else + AddOutputElement(spriteHandle, typeColor, $">Return ({memberInfo.ValueType.Name})"); } for(int i = 0; i < memberInfo.ParametersCount; i++) @@ -708,19 +713,63 @@ namespace FlaxEditor.Surface.ContextMenu { _descriptionSignatureLabel.Text = archetype.Signature; declaringType = archetype.DefaultType; - - Debug.Log(archetype.Elements); - foreach (var element in archetype.Elements) + + // Special handling for Pack nodes + if (archetype.TypeID == 26) { - if (element.Type == NodeElementType.Input) + var outputType = TypeUtils.GetType((string)archetype.DefaultValues[0]); + _surfaceStyle.GetConnectionColor(outputType, archetype.ConnectionsHints, out typeColor); + AddOutputElement(spriteHandle, typeColor, $"{outputType.Name}"); + + var fields = outputType.GetMembers(BindingFlags.Public | BindingFlags.Instance).Where(x => x.IsField).ToArray(); + var fieldsLength = fields.Length; + for (var i = 0; i < fieldsLength; i++) { - _surfaceStyle.GetConnectionColor(element.ConnectionsType, archetype.ConnectionsHints, out typeColor); - AddInputElement(spriteHandle, typeColor, element.Text); + var field = fields[i]; + _surfaceStyle.GetConnectionColor(field.ValueType, archetype.ConnectionsHints, out typeColor); + AddInputElement(spriteHandle, typeColor, $"{field.Name} ({field.ValueType.Name})"); } - else if (element.Type == NodeElementType.Output) + } + else if (archetype.TypeID == 36) + { + var inputType = TypeUtils.GetType((string)archetype.DefaultValues[0]); + _surfaceStyle.GetConnectionColor(inputType, archetype.ConnectionsHints, out typeColor); + AddInputElement(spriteHandle, typeColor, $"{inputType.Name}"); + + var fields = inputType.GetMembers(BindingFlags.Public | BindingFlags.Instance).Where(x => x.IsField).ToArray(); + var fieldsLength = fields.Length; + for (var i = 0; i < fieldsLength; i++) { - _surfaceStyle.GetConnectionColor(element.ConnectionsType, archetype.ConnectionsHints, out typeColor); - AddOutputElement(spriteHandle, typeColor, element.Text); + var field = fields[i]; + _surfaceStyle.GetConnectionColor(field.ValueType, archetype.ConnectionsHints, out typeColor); + AddOutputElement(spriteHandle, typeColor, $"{field.Name} ({field.ValueType.Name})"); + } + } + else + { + foreach (var element in archetype.Elements) + { + if (element.Type == NodeElementType.Input) + { + _surfaceStyle.GetConnectionColor(element.ConnectionsType, archetype.ConnectionsHints, out typeColor); + AddInputElement(spriteHandle, typeColor, $"{element.Text} ({element.Type.ToString()})"); + } + else if (element.Type == NodeElementType.Output) + { + // TODO: better check for enums + switch (archetype.TypeID) + { + case 11: + var t = new ScriptType(archetype.DefaultValues[0].GetType()); + _surfaceStyle.GetConnectionColor(t, archetype.ConnectionsHints, out typeColor); + AddOutputElement(spriteHandle, typeColor, $"{t.Name}"); + break; + default: + _surfaceStyle.GetConnectionColor(element.ConnectionsType, archetype.ConnectionsHints, out typeColor); + AddOutputElement(spriteHandle, typeColor, $"{element.Text} ({element.Type.ToString()})"); + break; + } + } } } } diff --git a/Source/Editor/Surface/VisualScriptSurface.cs b/Source/Editor/Surface/VisualScriptSurface.cs index 7ee3a381b..f7fafeef8 100644 --- a/Source/Editor/Surface/VisualScriptSurface.cs +++ b/Source/Editor/Surface/VisualScriptSurface.cs @@ -242,6 +242,7 @@ namespace FlaxEditor.Surface node.DefaultValues[0] = name; node.DefaultValues[1] = parameters.Length; node.Title = "Override " + name; + node.Tag = member; nodes.Add(node); } }