diff --git a/Examples/Nodes/Editor/MathNodeEditor.cs b/Examples/Nodes/Editor/MathNodeEditor.cs index 6dbf0f2..d51aadf 100644 --- a/Examples/Nodes/Editor/MathNodeEditor.cs +++ b/Examples/Nodes/Editor/MathNodeEditor.cs @@ -7,6 +7,5 @@ public class AddNodeEditor : NodeEditor { public override void OnNodeGUI() { GUILayout.Label("YEAH CUSTOM"); - base.OnNodeGUI(); } } diff --git a/Scripts/Editor/NodeEditor.cs b/Scripts/Editor/NodeEditor.cs index 8ef0317..1df9ffb 100644 --- a/Scripts/Editor/NodeEditor.cs +++ b/Scripts/Editor/NodeEditor.cs @@ -16,7 +16,8 @@ public class NodeEditor { DrawDefaultNodeGUI(); } - public void DrawDefaultNodeGUI() { + /// Draws standard field editors for all public fields + protected void DrawDefaultNodeGUI() { FieldInfo[] fields = GetInspectorFields(target); for (int i = 0; i < fields.Length; i++) { Type fieldType = fields[i].FieldType; @@ -58,16 +59,18 @@ public class NodeEditor { fieldValue = EditorGUILayout.Vector2Field(fieldName, (Vector2)fieldValue); } else if (fieldType == typeof(Vector3)) { - fieldValue = EditorGUILayout.Vector2Field(fieldName, (Vector3)fieldValue); + fieldValue = EditorGUILayout.Vector3Field(new GUIContent(fieldName), (Vector3)fieldValue); } else if (fieldType == typeof(Vector4)) { - fieldValue = EditorGUILayout.Vector2Field(fieldName, (Vector4)fieldValue); + fieldValue = EditorGUILayout.Vector4Field(fieldName, (Vector4)fieldValue); } else if (fieldType == typeof(Color)) { fieldValue = EditorGUILayout.ColorField(fieldName, (Color)fieldValue); } else if (fieldType == typeof(AnimationCurve)) { - fieldValue = EditorGUILayout.CurveField(fieldName, fieldValue != null ? (AnimationCurve)fieldValue : new AnimationCurve()); + AnimationCurve curve = fieldValue != null ? (AnimationCurve)fieldValue : new AnimationCurve(); + curve = EditorGUILayout.CurveField(fieldName, curve); + if (fieldValue != curve) fields[i].SetValue(target, curve); } else if (fieldType.IsSubclassOf(typeof(UnityEngine.Object)) || fieldType == typeof(UnityEngine.Object)) { fieldValue = EditorGUILayout.ObjectField(fieldName, (UnityEngine.Object)fieldValue, fieldType, true); @@ -78,8 +81,9 @@ public class NodeEditor { } } } + private static FieldInfo[] GetInspectorFields(Node node) { - return node.GetType().GetFields().Where(f => f.IsPublic).ToArray(); + return node.GetType().GetFields().Where(f => f.IsPublic || f.GetCustomAttributes(typeof(SerializeField),false) != null).ToArray(); } private static bool GetAttrib(object[] attribs, out T attribOut) where T : Attribute { diff --git a/Scripts/Editor/NodeEditorAction.cs b/Scripts/Editor/NodeEditorAction.cs index 1034746..d3ce874 100644 --- a/Scripts/Editor/NodeEditorAction.cs +++ b/Scripts/Editor/NodeEditorAction.cs @@ -16,16 +16,17 @@ public partial class NodeEditorWindow { private bool IsHoveringNode { get { return hoveredNode != null; } } private bool HasSelectedNode { get { return selectedNode != null; } } - private Node hoveredNode; - private Node selectedNode; - private Node draggedNode; - private NodePort hoveredPort; - private NodePort draggedOutput; - private NodePort draggedOutputTarget; + private Node hoveredNode = null; + + [NonSerialized] private Node selectedNode = null; + [NonSerialized] private Node draggedNode = null; + [NonSerialized] private NodePort hoveredPort = null; + [NonSerialized] private NodePort draggedOutput = null; + [NonSerialized] private NodePort draggedOutputTarget = null; private Rect nodeRects; - public void Controls() { + public void Controls() { wantsMouseMove = true; Event e = Event.current; @@ -81,7 +82,7 @@ public partial class NodeEditorWindow { } } } - else if (IsHoveringNode) { + else if (IsHoveringNode && IsHoveringTitle(hoveredNode)) { draggedNode = hoveredNode; dragOffset = hoveredNode.position.position - WindowToGridPosition(e.mousePosition); } @@ -108,9 +109,6 @@ public partial class NodeEditorWindow { isPanning = false; } UpdateHovered(); - break; - case EventType.repaint: - break; } } @@ -171,9 +169,16 @@ public partial class NodeEditorWindow { } if (newHoverPort != hoveredPort) { hoveredPort = newHoverPort; - Repaint(); } } else hoveredPort = null; } + + bool IsHoveringTitle(Node node) { + Vector2 mousePos = Event.current.mousePosition; + //Get node position + Vector2 nodePos = GridToWindowPosition(node.position.position); + Rect windowRect = new Rect(nodePos, new Vector2(node.position.size.x / zoom, 30 / zoom)); + return windowRect.Contains(mousePos); + } } diff --git a/Scripts/Editor/NodeEditorGUI.cs b/Scripts/Editor/NodeEditorGUI.cs index e036aa9..6152b49 100644 --- a/Scripts/Editor/NodeEditorGUI.cs +++ b/Scripts/Editor/NodeEditorGUI.cs @@ -12,13 +12,11 @@ public partial class NodeEditorWindow { Matrix4x4 m = GUI.matrix; Controls(); - if (e.type != EventType.MouseMove && e.type != EventType.MouseDrag) { - DrawGrid(position, zoom, panOffset); - DrawNodes(); - DrawConnections(); - DrawDraggedConnection(); - DrawToolbar(); - } + DrawGrid(position, zoom, panOffset); + DrawNodes(); + DrawConnections(); + DrawDraggedConnection(); + DrawToolbar(); GUI.matrix = m; } @@ -135,6 +133,7 @@ public partial class NodeEditorWindow { BeginZoomed(position, zoom); if (e.type == EventType.Repaint) portRects.Clear(); foreach (Node node in graph.nodes) { + //Get node position Vector2 nodePos = GridToWindowPositionNoClipped(node.position.position); @@ -173,13 +172,6 @@ public partial class NodeEditorWindow { nodeEditor.OnNodeGUI(); GUILayout.EndArea(); - - if (windowRect.position != nodePos) { - nodePos = windowRect.position; - node.position.position = WindowToGridPosition(nodePos); - //Vector2 newPos = windowRect = - } - } EndZoomed(position, zoom); EndWindows(); diff --git a/Scripts/Editor/NodeEditorResources.cs b/Scripts/Editor/NodeEditorResources.cs index 1297ae0..44e23d8 100644 --- a/Scripts/Editor/NodeEditorResources.cs +++ b/Scripts/Editor/NodeEditorResources.cs @@ -37,12 +37,19 @@ public partial class NodeEditorWindow { outputColor = new GUIStyle((GUIStyle)"flow shader out 4"); outputTexture = new GUIStyle((GUIStyle)"flow shader out 5"); - foreach (GUIStyle style in new GUIStyle[] { inputInt, inputString, inputFloat, inputObject, inputTexture, inputColor, outputInt, outputString, outputFloat, outputObject, outputTexture, outputColor }) { + foreach (GUIStyle style in new GUIStyle[] { inputInt, inputString, inputFloat, inputObject, inputTexture, inputColor }) { style.normal.textColor = Color.black; style.fixedHeight = 18; style.alignment = TextAnchor.MiddleLeft; style.onHover.textColor = Color.red; } + + foreach (GUIStyle style in new GUIStyle[] { outputInt, outputString, outputFloat, outputObject, outputTexture, outputColor }) { + style.normal.textColor = Color.black; + style.fixedHeight = 18; + style.alignment = TextAnchor.MiddleRight; + style.onHover.textColor = Color.red; + } } public GUIStyle GetInputStyle(Type type) { diff --git a/Scripts/Editor/NodeEditorToolbar.cs b/Scripts/Editor/NodeEditorToolbar.cs index 19bc890..c1ae734 100644 --- a/Scripts/Editor/NodeEditorToolbar.cs +++ b/Scripts/Editor/NodeEditorToolbar.cs @@ -13,11 +13,15 @@ public partial class NodeEditorWindow { if (DropdownButton("View", 50)) { } if (DropdownButton("Settings", 70)) { } if (DropdownButton("Tools", 50)) ToolsContextMenu(); - if (IsHoveringNode) { - GUILayout.Space(20); - string hoverInfo = hoveredNode.GetType().ToString(); - if (IsHoveringPort) hoverInfo += " > " + hoveredPort.name; - GUILayout.Label(hoverInfo); + + //Draw hover info + if (Event.current.type == EventType.Layout || Event.current.type == EventType.Repaint) { + if (IsHoveringNode) { + GUILayout.Space(20); + string hoverInfo = hoveredNode.GetType().ToString(); + if (IsHoveringPort) hoverInfo += " > " + hoveredPort.name; + GUILayout.Label(hoverInfo); + } } // Make the toolbar extend all throughout the window extension. diff --git a/Scripts/NodePort.cs b/Scripts/NodePort.cs index 2cea5de..1bc47ff 100644 --- a/Scripts/NodePort.cs +++ b/Scripts/NodePort.cs @@ -4,7 +4,7 @@ using UnityEngine; using System; [Serializable] -public class NodePort :ISerializationCallbackReceiver{ +public class NodePort : ISerializationCallbackReceiver{ public enum IO { Input, Output} public int ConnectionCount { get { return connections.Count; } }