diff --git a/Scripts/Editor/NodeEditorAction.cs b/Scripts/Editor/NodeEditorAction.cs index 0e10ce4..808382d 100644 --- a/Scripts/Editor/NodeEditorAction.cs +++ b/Scripts/Editor/NodeEditorAction.cs @@ -53,7 +53,7 @@ public partial class NodeEditorWindow { Repaint(); } else if (IsDraggingNode) { - draggedNode.position.position = WindowToGridPosition(e.mousePosition) + dragOffset; + draggedNode.rect.position = WindowToGridPosition(e.mousePosition) + dragOffset; Repaint(); } } @@ -84,7 +84,7 @@ public partial class NodeEditorWindow { } else if (IsHoveringNode && IsHoveringTitle(hoveredNode)) { draggedNode = hoveredNode; - dragOffset = hoveredNode.position.position - WindowToGridPosition(e.mousePosition); + dragOffset = hoveredNode.rect.position - WindowToGridPosition(e.mousePosition); } break; case EventType.MouseUp: @@ -121,7 +121,7 @@ public partial class NodeEditorWindow { public void CreateNode(Type type, Vector2 position) { Node node = graph.AddNode(type); - node.position.position = position; + node.rect.position = position; Repaint(); } @@ -129,8 +129,8 @@ public partial class NodeEditorWindow { public void DrawDraggedConnection() { if (IsDraggingPort) { if (!_portConnectionPoints.ContainsKey(draggedOutput)) return; - Vector2 from = draggedOutput.node.position.position + _portConnectionPoints[draggedOutput].center; - Vector2 to = draggedOutputTarget != null ? draggedOutputTarget.node.position.position + portConnectionPoints[draggedOutputTarget].center : WindowToGridPosition(Event.current.mousePosition); + Vector2 from = draggedOutput.node.rect.position + _portConnectionPoints[draggedOutput].center; + Vector2 to = draggedOutputTarget != null ? draggedOutputTarget.node.rect.position + portConnectionPoints[draggedOutputTarget].center : WindowToGridPosition(Event.current.mousePosition); Color col = NodeEditorUtilities.GetTypeColor(draggedOutput.type); col.a = 0.6f; DrawConnection(from, to, col); @@ -143,8 +143,8 @@ public partial class NodeEditorWindow { Node newHoverNode = null; foreach (Node node in graph.nodes) { //Get node position - Vector2 nodePos = GridToWindowPosition(node.position.position); - Rect windowRect = new Rect(nodePos, new Vector2(node.position.size.x / zoom, node.position.size.y / zoom)); + Vector2 nodePos = GridToWindowPosition(node.rect.position); + Rect windowRect = new Rect(nodePos, new Vector2(node.rect.size.x / zoom, node.rect.size.y / zoom)); if (windowRect.Contains(mousePos)) { newHoverNode = node; } @@ -162,7 +162,7 @@ public partial class NodeEditorWindow { //Check if port rect is available if (!portConnectionPoints.ContainsKey(port)) continue; Rect r = portConnectionPoints[port]; - r.position = GridToWindowPosition(r.position + hoveredNode.position.position); + r.position = GridToWindowPosition(r.position + hoveredNode.rect.position); r.size /= zoom; if (r.Contains(mousePos)) newHoverPort = port; } @@ -172,7 +172,7 @@ public partial class NodeEditorWindow { //Check if port rect is available if (!portConnectionPoints.ContainsKey(port)) continue; Rect r = portConnectionPoints[port]; - r.position = GridToWindowPosition(r.position + hoveredNode.position.position); + r.position = GridToWindowPosition(r.position + hoveredNode.rect.position); r.size /= zoom; if (r.Contains(mousePos)) newHoverPort = port; } @@ -186,8 +186,8 @@ public partial class NodeEditorWindow { 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)); + Vector2 nodePos = GridToWindowPosition(node.rect.position); + Rect windowRect = new Rect(nodePos, new Vector2(node.rect.size.x / zoom, 30 / zoom)); return windowRect.Contains(mousePos); } } diff --git a/Scripts/Editor/NodeEditorGUI.cs b/Scripts/Editor/NodeEditorGUI.cs index 008e6e6..74d9872 100644 --- a/Scripts/Editor/NodeEditorGUI.cs +++ b/Scripts/Editor/NodeEditorGUI.cs @@ -124,10 +124,10 @@ public partial class NodeEditorWindow { //Needs cleanup. Null checks are ugly if (!portConnectionPoints.ContainsKey(output)) continue; - Vector2 from = _portConnectionPoints[output].center + node.position.position; + Vector2 from = _portConnectionPoints[output].center + node.rect.position; for (int k = 0; k < output.ConnectionCount; k++) { NodePort input = output.GetConnection(k); - Vector2 to = input.node.position.position + _portConnectionPoints[input].center; + Vector2 to = input.node.rect.position + _portConnectionPoints[input].center; DrawConnection(from, to, NodeEditorUtilities.GetTypeColor(output.type)); } } @@ -151,7 +151,7 @@ public partial class NodeEditorWindow { foreach (Node node in graph.nodes) { //Get node position - Vector2 nodePos = GridToWindowPositionNoClipped(node.position.position); + Vector2 nodePos = GridToWindowPositionNoClipped(node.rect.position); GUIStyle style = (node == selectedNode) ? (GUIStyle)"flow node 0 on" : (GUIStyle)"flow node 0"; GUILayout.BeginArea(new Rect(nodePos,new Vector2(240,4000))); @@ -176,7 +176,7 @@ public partial class NodeEditorWindow { GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); - if (e.type == EventType.Repaint) node.position.size = GUILayoutUtility.GetLastRect().size; + if (e.type == EventType.Repaint) node.rect.size = GUILayoutUtility.GetLastRect().size; GUILayout.EndArea(); } EndZoomed(position, zoom); diff --git a/Scripts/Editor/NodeEditorToolbar.cs b/Scripts/Editor/NodeEditorToolbar.cs index c540bf0..eb89b6f 100644 --- a/Scripts/Editor/NodeEditorToolbar.cs +++ b/Scripts/Editor/NodeEditorToolbar.cs @@ -32,9 +32,7 @@ public partial class NodeEditorWindow { public void FileContextMenu() { GenericMenu contextMenu = new GenericMenu(); - contextMenu.AddItem(new GUIContent("Create New"), false, New); - contextMenu.AddSeparator(""); contextMenu.AddItem(new GUIContent("Save"), false, Save); contextMenu.AddItem(new GUIContent("Save As"), false, SaveAs); diff --git a/Scripts/Editor/NodeEditorWindow.cs b/Scripts/Editor/NodeEditorWindow.cs index ce1c760..a1974b3 100644 --- a/Scripts/Editor/NodeEditorWindow.cs +++ b/Scripts/Editor/NodeEditorWindow.cs @@ -48,10 +48,6 @@ public partial class NodeEditorWindow : EditorWindow { } } - public void New() { - _graph = new NodeGraph(); - } - private void DraggableWindow(int windowID) { GUI.DragWindow(); } diff --git a/Scripts/Node.cs b/Scripts/Node.cs index b5b27ee..2634453 100644 --- a/Scripts/Node.cs +++ b/Scripts/Node.cs @@ -8,21 +8,23 @@ using System; public abstract class Node { /// Name of the node - public string name = ""; - [NonSerialized] public NodeGraph graph; + [SerializeField] public string name = ""; + [SerializeField] public NodeGraph graph; - [SerializeField] public Rect position = new Rect(0,0,200,200); [SerializeField] private NodePort[] inputs = new NodePort[0]; [SerializeField] private NodePort[] outputs = new NodePort[0]; + [SerializeField] public Rect rect = new Rect(0,0,200,200); public int InputCount { get { return inputs.Length; } } public int OutputCount { get { return outputs.Length; } } + /// Constructor protected Node() { - CachePorts(); + CachePorts(); //Cache the ports at creation time so we don't have to use reflection at runtime Init(); } + /// Initialize node. Called on creation. protected virtual void Init() { } diff --git a/Scripts/NodeGraph.cs b/Scripts/NodeGraph.cs index eefff63..86f534a 100644 --- a/Scripts/NodeGraph.cs +++ b/Scripts/NodeGraph.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using UnityEngine; using System; + /// Base class for all node graphs -[Serializable, CreateAssetMenu(fileName = "NewNodeGraph", menuName = "Node Graph")] -public class NodeGraph : ScriptableObject { +public abstract class NodeGraph : ScriptableObject { /// All nodes in the graph. /// See: [NonSerialized] public List nodes = new List(); @@ -49,7 +49,6 @@ public class NodeGraph : ScriptableObject { nodes.Clear(); } - private class NodeTyper { public string nodeType = "Node"; } diff --git a/Scripts/NodePort.cs b/Scripts/NodePort.cs index 4964551..064830b 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 { public enum IO { Input, Output} public int ConnectionCount { get { return connections.Count; } } @@ -23,15 +23,13 @@ public class NodePort : ISerializationCallbackReceiver{ public string name { get { return _name; } set { _name = value; } } public bool enabled { get { return _enabled; } set { _enabled = value; } } - [NonSerialized] private List connections = new List(); + [SerializeField] private List connections = new List(); [SerializeField] public Type type; [SerializeField] private string _name; [SerializeField] private bool _enabled = true; [SerializeField] private IO _direction; - [SerializeField] private PortID[] connectionIDs; - public NodePort(string name, Type type, Node node, IO direction) { _name = name; this.type = type; @@ -69,34 +67,6 @@ public class NodePort : ISerializationCallbackReceiver{ connections.Clear(); } - public void OnBeforeSerialize() { - if (direction == IO.Output) { - connectionIDs = new PortID[connections.Count]; - for (int i = 0; i < connections.Count; i++) { - connectionIDs[i] = new PortID(); - connectionIDs[i].nodeID = node.graph.nodes.IndexOf(connections[i].node); - connectionIDs[i].portID = connections[i].node.GetInputId(connections[i]); - } - } - } - - public void OnAfterDeserialize() { - - } - - public void FinalizeDeserialization() { - //Reconnect - if (direction == IO.Output) { - connections = new List(); - for (int i = 0; i < connectionIDs.Length; i++) { - Node node = this.node.graph.nodes[connectionIDs[i].nodeID]; - NodePort port = node.GetInput(connectionIDs[i].portID); - Connect(port); - } - } - } - - [Serializable] private class PortID { public int nodeID;