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; } }