diff --git a/Scripts/Editor/NodeEditorAction.cs b/Scripts/Editor/NodeEditorAction.cs
index 2996938..12a48ec 100644
--- a/Scripts/Editor/NodeEditorAction.cs
+++ b/Scripts/Editor/NodeEditorAction.cs
@@ -81,11 +81,32 @@ namespace XNodeEditor {
for (int i = 0; i < Selection.objects.Length; i++) {
if (Selection.objects[i] is XNode.Node) {
XNode.Node node = Selection.objects[i] as XNode.Node;
+ Vector2 initial = node.position;
node.position = mousePos + dragOffset[i];
if (gridSnap) {
node.position.x = (Mathf.Round((node.position.x + 8) / 16) * 16) - 8;
node.position.y = (Mathf.Round((node.position.y + 8) / 16) * 16) - 8;
}
+
+ // Offset portConnectionPoints instantly if a node is dragged so they aren't delayed by a frame.
+ Vector2 offset = node.position - initial;
+ if (offset.sqrMagnitude > 0){
+ foreach (XNode.NodePort output in node.Outputs){
+ Rect rect;
+ if (portConnectionPoints.TryGetValue(output, out rect)) {
+ rect.position += offset;
+ portConnectionPoints[output] = rect;
+ }
+ }
+
+ foreach (XNode.NodePort input in node.Inputs) {
+ Rect rect;
+ if (portConnectionPoints.TryGetValue(input, out rect)) {
+ rect.position += offset;
+ portConnectionPoints[input] = rect;
+ }
+ }
+ }
}
}
// Move selected reroutes with offset
diff --git a/Scripts/Editor/NodeEditorWindow.cs b/Scripts/Editor/NodeEditorWindow.cs
index 7fdc49d..72fd4ce 100644
--- a/Scripts/Editor/NodeEditorWindow.cs
+++ b/Scripts/Editor/NodeEditorWindow.cs
@@ -1,4 +1,4 @@
-using System.Collections.Generic;
+using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;
@@ -11,6 +11,51 @@ namespace XNodeEditor {
/// Stores node positions for all nodePorts.
public Dictionary portConnectionPoints { get { return _portConnectionPoints; } }
private Dictionary _portConnectionPoints = new Dictionary();
+ [SerializeField] private NodePortReference[] _references = new NodePortReference[0];
+ [SerializeField] private Rect[] _rects = new Rect[0];
+
+ [System.Serializable] private class NodePortReference {
+ [SerializeField] private XNode.Node _node;
+ [SerializeField] private string _name;
+
+ public NodePortReference(XNode.NodePort nodePort) {
+ _node = nodePort.node;
+ _name = nodePort.fieldName;
+ }
+
+ public XNode.NodePort GetNodePort() {
+ if (_node == null) {
+ return null;
+ }
+ return _node.GetPort(_name);
+ }
+ }
+
+ private void OnDisable() {
+ // Cache portConnectionPoints before serialization starts
+ int count = portConnectionPoints.Count;
+ _references = new NodePortReference[count];
+ _rects = new Rect[count];
+ int index = 0;
+ foreach (var portConnectionPoint in portConnectionPoints) {
+ _references[index] = new NodePortReference(portConnectionPoint.Key);
+ _rects[index] = portConnectionPoint.Value;
+ index++;
+ }
+ }
+
+ private void OnEnable() {
+ // Reload portConnectionPoints if there are any
+ int length = _references.Length;
+ if (length == _rects.Length) {
+ for (int i = 0; i < length; i++) {
+ XNode.NodePort nodePort = _references[i].GetNodePort();
+ if (nodePort != null)
+ _portConnectionPoints.Add(nodePort, _rects[i]);
+ }
+ }
+ }
+
public Dictionary nodeSizes { get { return _nodeSizes; } }
private Dictionary _nodeSizes = new Dictionary();
public XNode.NodeGraph graph;
@@ -25,7 +70,6 @@ namespace XNodeEditor {
if (graphEditor != null && NodeEditorPreferences.GetSettings().autoSave) AssetDatabase.SaveAssets();
}
- partial void OnEnable();
/// Create editor window
public static NodeEditorWindow Init() {
NodeEditorWindow w = CreateInstance();