mirror of
https://github.com/Siccity/xNode.git
synced 2026-02-04 14:24:54 +08:00
Defined namespaces across all scripts prevent conflicts.
This commit is contained in:
parent
3332b64795
commit
d7e133a822
@ -4,5 +4,5 @@ using XNode;
|
|||||||
|
|
||||||
/// <summary> Defines an example nodegraph. </summary>
|
/// <summary> Defines an example nodegraph. </summary>
|
||||||
[Serializable, CreateAssetMenu(fileName = "ExampleNodeGraph", menuName = "Node Graph/Example")]
|
[Serializable, CreateAssetMenu(fileName = "ExampleNodeGraph", menuName = "Node Graph/Example")]
|
||||||
public class ExampleNodeGraph : NodeGraph {
|
public class ExampleNodeGraph : XNode.NodeGraph {
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,13 +1,13 @@
|
|||||||
using XNode;
|
using XNode;
|
||||||
|
|
||||||
namespace BasicNodes {
|
namespace BasicNodes {
|
||||||
public class DisplayValue : Node {
|
public class DisplayValue : XNode.Node {
|
||||||
protected override void Init() {
|
protected override void Init() {
|
||||||
base.Init();
|
base.Init();
|
||||||
if (!HasPort("input")) AddInstanceInput(typeof(object), "input");
|
if (!HasPort("input")) AddInstanceInput(typeof(object), "input");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override object GetValue(NodePort port) {
|
public override object GetValue(XNode.NodePort port) {
|
||||||
return GetInputValue<object>("input");
|
return GetInputValue<object>("input");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
namespace BasicNodes {
|
namespace BasicNodes {
|
||||||
[System.Serializable]
|
[System.Serializable]
|
||||||
public class MathNode : Node {
|
public class MathNode : XNode.Node {
|
||||||
// Adding [Input] or [Output] is all you need to do to register a field as a valid port on your node
|
// Adding [Input] or [Output] is all you need to do to register a field as a valid port on your node
|
||||||
[Input] public float a;
|
[Input] public float a;
|
||||||
[Input] public float b;
|
[Input] public float b;
|
||||||
@ -14,7 +14,7 @@ namespace BasicNodes {
|
|||||||
public enum MathType { Add, Subtract, Multiply, Divide }
|
public enum MathType { Add, Subtract, Multiply, Divide }
|
||||||
|
|
||||||
// GetValue should be overridden to return a value for any specified output port
|
// GetValue should be overridden to return a value for any specified output port
|
||||||
public override object GetValue(NodePort port) {
|
public override object GetValue(XNode.NodePort port) {
|
||||||
|
|
||||||
// Get new a and b values from input connections. Fallback to field values if input is not connected
|
// Get new a and b values from input connections. Fallback to field values if input is not connected
|
||||||
float a = GetInputValue<float>("a", this.a);
|
float a = GetInputValue<float>("a", this.a);
|
||||||
|
|||||||
@ -2,11 +2,11 @@
|
|||||||
using XNode;
|
using XNode;
|
||||||
|
|
||||||
namespace BasicNodes {
|
namespace BasicNodes {
|
||||||
public class Vector : Node {
|
public class Vector : XNode.Node {
|
||||||
[Input] public float x, y, z;
|
[Input] public float x, y, z;
|
||||||
[Output] public Vector3 vector;
|
[Output] public Vector3 vector;
|
||||||
|
|
||||||
public override object GetValue(NodePort port) {
|
public override object GetValue(XNode.NodePort port) {
|
||||||
vector.x = GetInputValue<float>("x", this.x);
|
vector.x = GetInputValue<float>("x", this.x);
|
||||||
vector.y = GetInputValue<float>("y", this.y);
|
vector.y = GetInputValue<float>("y", this.y);
|
||||||
vector.z = GetInputValue<float>("z", this.z);
|
vector.z = GetInputValue<float>("z", this.z);
|
||||||
|
|||||||
@ -8,12 +8,12 @@ using XNode;
|
|||||||
namespace XNodeEditor {
|
namespace XNodeEditor {
|
||||||
/// <summary> Base class to derive custom Node editors from. Use this to create your own custom inspectors and editors for your nodes. </summary>
|
/// <summary> Base class to derive custom Node editors from. Use this to create your own custom inspectors and editors for your nodes. </summary>
|
||||||
|
|
||||||
[CustomNodeEditor(typeof(Node))]
|
[CustomNodeEditor(typeof(XNode.Node))]
|
||||||
public class NodeEditor : XNodeInternal.NodeEditorBase<NodeEditor, NodeEditor.CustomNodeEditorAttribute, Node> {
|
public class NodeEditor : XNodeInternal.NodeEditorBase<NodeEditor, NodeEditor.CustomNodeEditorAttribute, XNode.Node> {
|
||||||
|
|
||||||
/// <summary> Fires every whenever a node was modified through the editor </summary>
|
/// <summary> Fires every whenever a node was modified through the editor </summary>
|
||||||
public static Action<Node> onUpdateNode;
|
public static Action<XNode.Node> onUpdateNode;
|
||||||
public static Dictionary<NodePort, Vector2> portPositions;
|
public static Dictionary<XNode.NodePort, Vector2> portPositions;
|
||||||
|
|
||||||
/// <summary> Draws the node GUI.</summary>
|
/// <summary> Draws the node GUI.</summary>
|
||||||
/// <param name="portPositions">Port handle positions need to be returned to the NodeEditorWindow </param>
|
/// <param name="portPositions">Port handle positions need to be returned to the NodeEditorWindow </param>
|
||||||
@ -31,7 +31,7 @@ namespace XNodeEditor {
|
|||||||
/// <summary> Draws standard field editors for all public fields </summary>
|
/// <summary> Draws standard field editors for all public fields </summary>
|
||||||
public virtual void OnBodyGUI() {
|
public virtual void OnBodyGUI() {
|
||||||
string[] excludes = { "m_Script", "graph", "position", "ports" };
|
string[] excludes = { "m_Script", "graph", "position", "ports" };
|
||||||
portPositions = new Dictionary<NodePort, Vector2>();
|
portPositions = new Dictionary<XNode.NodePort, Vector2>();
|
||||||
|
|
||||||
SerializedProperty iterator = serializedObject.GetIterator();
|
SerializedProperty iterator = serializedObject.GetIterator();
|
||||||
bool enterChildren = true;
|
bool enterChildren = true;
|
||||||
|
|||||||
@ -15,13 +15,13 @@ namespace XNodeEditor {
|
|||||||
private bool IsHoveringNode { get { return hoveredNode != null; } }
|
private bool IsHoveringNode { get { return hoveredNode != null; } }
|
||||||
private bool HasSelectedNode { get { return selectedNode != null; } }
|
private bool HasSelectedNode { get { return selectedNode != null; } }
|
||||||
|
|
||||||
private Node hoveredNode = null;
|
private XNode.Node hoveredNode = null;
|
||||||
|
|
||||||
[NonSerialized] private Node selectedNode = null;
|
[NonSerialized] private XNode.Node selectedNode = null;
|
||||||
[NonSerialized] private Node draggedNode = null;
|
[NonSerialized] private XNode.Node draggedNode = null;
|
||||||
[NonSerialized] private NodePort hoveredPort = null;
|
[NonSerialized] private XNode.NodePort hoveredPort = null;
|
||||||
[NonSerialized] private NodePort draggedOutput = null;
|
[NonSerialized] private XNode.NodePort draggedOutput = null;
|
||||||
[NonSerialized] private NodePort draggedOutputTarget = null;
|
[NonSerialized] private XNode.NodePort draggedOutputTarget = null;
|
||||||
|
|
||||||
private Rect nodeRects;
|
private Rect nodeRects;
|
||||||
|
|
||||||
@ -69,8 +69,8 @@ namespace XNodeEditor {
|
|||||||
} else {
|
} else {
|
||||||
hoveredPort.VerifyConnections();
|
hoveredPort.VerifyConnections();
|
||||||
if (hoveredPort.IsConnected) {
|
if (hoveredPort.IsConnected) {
|
||||||
Node node = hoveredPort.node;
|
XNode.Node node = hoveredPort.node;
|
||||||
NodePort output = hoveredPort.Connection;
|
XNode.NodePort output = hoveredPort.Connection;
|
||||||
hoveredPort.Disconnect(output);
|
hoveredPort.Disconnect(output);
|
||||||
draggedOutput = output;
|
draggedOutput = output;
|
||||||
draggedOutputTarget = hoveredPort;
|
draggedOutputTarget = hoveredPort;
|
||||||
@ -89,7 +89,7 @@ namespace XNodeEditor {
|
|||||||
if (IsDraggingPort) {
|
if (IsDraggingPort) {
|
||||||
//If connection is valid, save it
|
//If connection is valid, save it
|
||||||
if (draggedOutputTarget != null) {
|
if (draggedOutputTarget != null) {
|
||||||
Node node = draggedOutputTarget.node;
|
XNode.Node node = draggedOutputTarget.node;
|
||||||
if (graph.nodes.Count != 0) draggedOutput.Connect(draggedOutputTarget);
|
if (graph.nodes.Count != 0) draggedOutput.Connect(draggedOutputTarget);
|
||||||
if (NodeEditor.onUpdateNode != null) NodeEditor.onUpdateNode(node);
|
if (NodeEditor.onUpdateNode != null) NodeEditor.onUpdateNode(node);
|
||||||
EditorUtility.SetDirty(graph);
|
EditorUtility.SetDirty(graph);
|
||||||
@ -127,7 +127,7 @@ namespace XNodeEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void CreateNode(Type type, Vector2 position) {
|
public void CreateNode(Type type, Vector2 position) {
|
||||||
Node node = graph.AddNode(type);
|
XNode.Node node = graph.AddNode(type);
|
||||||
node.position = position;
|
node.position = position;
|
||||||
Repaint();
|
Repaint();
|
||||||
}
|
}
|
||||||
@ -144,7 +144,7 @@ namespace XNodeEditor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IsHoveringTitle(Node node) {
|
bool IsHoveringTitle(XNode.Node node) {
|
||||||
Vector2 mousePos = Event.current.mousePosition;
|
Vector2 mousePos = Event.current.mousePosition;
|
||||||
//Get node position
|
//Get node position
|
||||||
Vector2 nodePos = GridToWindowPosition(node.position);
|
Vector2 nodePos = GridToWindowPosition(node.position);
|
||||||
|
|||||||
@ -12,7 +12,7 @@ namespace XNodeEditor {
|
|||||||
UnityEditor.MonoScript script = obj as UnityEditor.MonoScript;
|
UnityEditor.MonoScript script = obj as UnityEditor.MonoScript;
|
||||||
System.Type scriptType = script.GetClass();
|
System.Type scriptType = script.GetClass();
|
||||||
|
|
||||||
if (scriptType != typeof(Node) && !scriptType.IsSubclassOf(typeof(Node))) return AssetDeleteResult.DidNotDelete;
|
if (scriptType != typeof(XNode.Node) && !scriptType.IsSubclassOf(typeof(XNode.Node))) return AssetDeleteResult.DidNotDelete;
|
||||||
|
|
||||||
//Find ScriptableObjects using this script
|
//Find ScriptableObjects using this script
|
||||||
string[] guids = AssetDatabase.FindAssets("t:" + scriptType);
|
string[] guids = AssetDatabase.FindAssets("t:" + scriptType);
|
||||||
@ -20,7 +20,7 @@ namespace XNodeEditor {
|
|||||||
string assetpath = AssetDatabase.GUIDToAssetPath(guids[i]);
|
string assetpath = AssetDatabase.GUIDToAssetPath(guids[i]);
|
||||||
Object[] objs = AssetDatabase.LoadAllAssetRepresentationsAtPath(assetpath);
|
Object[] objs = AssetDatabase.LoadAllAssetRepresentationsAtPath(assetpath);
|
||||||
for (int k = 0; k < objs.Length; k++) {
|
for (int k = 0; k < objs.Length; k++) {
|
||||||
Node node = objs[k] as Node;
|
XNode.Node node = objs[k] as XNode.Node;
|
||||||
if (node.GetType() == scriptType) {
|
if (node.GetType() == scriptType) {
|
||||||
if (node != null && node.graph != null) {
|
if (node != null && node.graph != null) {
|
||||||
Debug.LogWarning(node.name + " of " + node.graph + " depended on deleted script and has been removed automatically.", node.graph);
|
Debug.LogWarning(node.name + " of " + node.graph + " depended on deleted script and has been removed automatically.", node.graph);
|
||||||
|
|||||||
@ -76,7 +76,7 @@ namespace XNodeEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Show right-click context menu for a node </summary>
|
/// <summary> Show right-click context menu for a node </summary>
|
||||||
public void ShowNodeContextMenu(Node node) {
|
public void ShowNodeContextMenu(XNode.Node node) {
|
||||||
GenericMenu contextMenu = new GenericMenu();
|
GenericMenu contextMenu = new GenericMenu();
|
||||||
contextMenu.AddItem(new GUIContent("Move To Top"), false, () => {
|
contextMenu.AddItem(new GUIContent("Move To Top"), false, () => {
|
||||||
int index;
|
int index;
|
||||||
@ -86,7 +86,7 @@ namespace XNodeEditor {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
contextMenu.AddItem(new GUIContent("Duplicate"), false, () => {
|
contextMenu.AddItem(new GUIContent("Duplicate"), false, () => {
|
||||||
Node n = graph.CopyNode(node);
|
XNode.Node n = graph.CopyNode(node);
|
||||||
n.position = node.position + new Vector2(30, 30);
|
n.position = node.position + new Vector2(30, 30);
|
||||||
});
|
});
|
||||||
contextMenu.AddItem(new GUIContent("Remove"), false, () => graph.RemoveNode(node));
|
contextMenu.AddItem(new GUIContent("Remove"), false, () => graph.RemoveNode(node));
|
||||||
@ -145,17 +145,17 @@ namespace XNodeEditor {
|
|||||||
|
|
||||||
/// <summary> Draws all connections </summary>
|
/// <summary> Draws all connections </summary>
|
||||||
public void DrawConnections() {
|
public void DrawConnections() {
|
||||||
foreach (Node node in graph.nodes) {
|
foreach (XNode.Node node in graph.nodes) {
|
||||||
//If a null node is found, return. This can happen if the nodes associated script is deleted. It is currently not possible in Unity to delete a null asset.
|
//If a null node is found, return. This can happen if the nodes associated script is deleted. It is currently not possible in Unity to delete a null asset.
|
||||||
if (node == null) continue;
|
if (node == null) continue;
|
||||||
|
|
||||||
foreach (NodePort output in node.Outputs) {
|
foreach (XNode.NodePort output in node.Outputs) {
|
||||||
//Needs cleanup. Null checks are ugly
|
//Needs cleanup. Null checks are ugly
|
||||||
if (!portConnectionPoints.ContainsKey(output)) continue;
|
if (!portConnectionPoints.ContainsKey(output)) continue;
|
||||||
Vector2 from = _portConnectionPoints[output].center;
|
Vector2 from = _portConnectionPoints[output].center;
|
||||||
for (int k = 0; k < output.ConnectionCount; k++) {
|
for (int k = 0; k < output.ConnectionCount; k++) {
|
||||||
|
|
||||||
NodePort input = output.GetConnection(k);
|
XNode.NodePort input = output.GetConnection(k);
|
||||||
if (input == null) continue; //If a script has been updated and the port doesn't exist, it is removed and null is returned. If this happens, return.
|
if (input == null) continue; //If a script has been updated and the port doesn't exist, it is removed and null is returned. If this happens, return.
|
||||||
if (!input.IsConnectedTo(output)) input.Connect(output);
|
if (!input.IsConnectedTo(output)) input.Connect(output);
|
||||||
if (!_portConnectionPoints.ContainsKey(input)) continue;
|
if (!_portConnectionPoints.ContainsKey(input)) continue;
|
||||||
@ -196,10 +196,10 @@ namespace XNodeEditor {
|
|||||||
for (int n = 0; n < graph.nodes.Count; n++) {
|
for (int n = 0; n < graph.nodes.Count; n++) {
|
||||||
while (graph.nodes[n] == null) graph.nodes.RemoveAt(n);
|
while (graph.nodes[n] == null) graph.nodes.RemoveAt(n);
|
||||||
if (n >= graph.nodes.Count) return;
|
if (n >= graph.nodes.Count) return;
|
||||||
Node node = graph.nodes[n];
|
XNode.Node node = graph.nodes[n];
|
||||||
|
|
||||||
NodeEditor nodeEditor = NodeEditor.GetEditor(node);
|
NodeEditor nodeEditor = NodeEditor.GetEditor(node);
|
||||||
NodeEditor.portPositions = new Dictionary<NodePort, Vector2>();
|
NodeEditor.portPositions = new Dictionary<XNode.NodePort, Vector2>();
|
||||||
|
|
||||||
//Get node position
|
//Get node position
|
||||||
Vector2 nodePos = GridToWindowPositionNoClipped(node.position);
|
Vector2 nodePos = GridToWindowPositionNoClipped(node.position);
|
||||||
@ -244,14 +244,14 @@ namespace XNodeEditor {
|
|||||||
|
|
||||||
//Check if we are hovering any of this nodes ports
|
//Check if we are hovering any of this nodes ports
|
||||||
//Check input ports
|
//Check input ports
|
||||||
foreach (NodePort input in node.Inputs) {
|
foreach (XNode.NodePort input in node.Inputs) {
|
||||||
//Check if port rect is available
|
//Check if port rect is available
|
||||||
if (!portConnectionPoints.ContainsKey(input)) continue;
|
if (!portConnectionPoints.ContainsKey(input)) continue;
|
||||||
Rect r = GridToWindowRect(portConnectionPoints[input]);
|
Rect r = GridToWindowRect(portConnectionPoints[input]);
|
||||||
if (r.Contains(mousePos)) hoveredPort = input;
|
if (r.Contains(mousePos)) hoveredPort = input;
|
||||||
}
|
}
|
||||||
//Check all output ports
|
//Check all output ports
|
||||||
foreach (NodePort output in node.Outputs) {
|
foreach (XNode.NodePort output in node.Outputs) {
|
||||||
//Check if port rect is available
|
//Check if port rect is available
|
||||||
if (!portConnectionPoints.ContainsKey(output)) continue;
|
if (!portConnectionPoints.ContainsKey(output)) continue;
|
||||||
Rect r = GridToWindowRect(portConnectionPoints[output]);
|
Rect r = GridToWindowRect(portConnectionPoints[output]);
|
||||||
|
|||||||
@ -16,18 +16,18 @@ namespace XNodeEditor {
|
|||||||
/// <summary> Make a field for a serialized property. Automatically displays relevant node port. </summary>
|
/// <summary> Make a field for a serialized property. Automatically displays relevant node port. </summary>
|
||||||
public static void PropertyField(SerializedProperty property, GUIContent label, bool includeChildren = true, params GUILayoutOption[] options) {
|
public static void PropertyField(SerializedProperty property, GUIContent label, bool includeChildren = true, params GUILayoutOption[] options) {
|
||||||
if (property == null) throw new NullReferenceException();
|
if (property == null) throw new NullReferenceException();
|
||||||
Node node = property.serializedObject.targetObject as Node;
|
XNode.Node node = property.serializedObject.targetObject as XNode.Node;
|
||||||
NodePort port = node.GetPort(property.name);
|
XNode.NodePort port = node.GetPort(property.name);
|
||||||
PropertyField(property, label, port, includeChildren);
|
PropertyField(property, label, port, includeChildren);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Make a field for a serialized property. Manual node port override. </summary>
|
/// <summary> Make a field for a serialized property. Manual node port override. </summary>
|
||||||
public static void PropertyField(SerializedProperty property, NodePort port, bool includeChildren = true, params GUILayoutOption[] options) {
|
public static void PropertyField(SerializedProperty property, XNode.NodePort port, bool includeChildren = true, params GUILayoutOption[] options) {
|
||||||
PropertyField(property, null, port, includeChildren, options);
|
PropertyField(property, null, port, includeChildren, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Make a field for a serialized property. Manual node port override. </summary>
|
/// <summary> Make a field for a serialized property. Manual node port override. </summary>
|
||||||
public static void PropertyField(SerializedProperty property, GUIContent label, NodePort port, bool includeChildren = true, params GUILayoutOption[] options) {
|
public static void PropertyField(SerializedProperty property, GUIContent label, XNode.NodePort port, bool includeChildren = true, params GUILayoutOption[] options) {
|
||||||
if (property == null) throw new NullReferenceException();
|
if (property == null) throw new NullReferenceException();
|
||||||
|
|
||||||
// If property is not a port, display a regular property field
|
// If property is not a port, display a regular property field
|
||||||
@ -36,24 +36,24 @@ namespace XNodeEditor {
|
|||||||
Rect rect = new Rect();
|
Rect rect = new Rect();
|
||||||
|
|
||||||
// If property is an input, display a regular property field and put a port handle on the left side
|
// If property is an input, display a regular property field and put a port handle on the left side
|
||||||
if (port.direction == NodePort.IO.Input) {
|
if (port.direction == XNode.NodePort.IO.Input) {
|
||||||
// Get data from [Input] attribute
|
// Get data from [Input] attribute
|
||||||
Node.ShowBackingValue showBacking = Node.ShowBackingValue.Unconnected;
|
XNode.Node.ShowBackingValue showBacking = XNode.Node.ShowBackingValue.Unconnected;
|
||||||
Node.InputAttribute inputAttribute;
|
XNode.Node.InputAttribute inputAttribute;
|
||||||
if (NodeEditorUtilities.GetAttrib(port.node.GetType(), property.name, out inputAttribute)) showBacking = inputAttribute.backingValue;
|
if (NodeEditorUtilities.GetAttrib(port.node.GetType(), property.name, out inputAttribute)) showBacking = inputAttribute.backingValue;
|
||||||
|
|
||||||
switch (showBacking) {
|
switch (showBacking) {
|
||||||
case Node.ShowBackingValue.Unconnected:
|
case XNode.Node.ShowBackingValue.Unconnected:
|
||||||
// Display a label if port is connected
|
// Display a label if port is connected
|
||||||
if (port.IsConnected) EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName));
|
if (port.IsConnected) EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName));
|
||||||
// Display an editable property field if port is not connected
|
// Display an editable property field if port is not connected
|
||||||
else EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
else EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
||||||
break;
|
break;
|
||||||
case Node.ShowBackingValue.Never:
|
case XNode.Node.ShowBackingValue.Never:
|
||||||
// Display a label
|
// Display a label
|
||||||
EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName));
|
EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName));
|
||||||
break;
|
break;
|
||||||
case Node.ShowBackingValue.Always:
|
case XNode.Node.ShowBackingValue.Always:
|
||||||
// Display an editable property field
|
// Display an editable property field
|
||||||
EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
||||||
break;
|
break;
|
||||||
@ -62,24 +62,24 @@ namespace XNodeEditor {
|
|||||||
rect = GUILayoutUtility.GetLastRect();
|
rect = GUILayoutUtility.GetLastRect();
|
||||||
rect.position = rect.position - new Vector2(16, 0);
|
rect.position = rect.position - new Vector2(16, 0);
|
||||||
// If property is an output, display a text label and put a port handle on the right side
|
// If property is an output, display a text label and put a port handle on the right side
|
||||||
} else if (port.direction == NodePort.IO.Output) {
|
} else if (port.direction == XNode.NodePort.IO.Output) {
|
||||||
// Get data from [Output] attribute
|
// Get data from [Output] attribute
|
||||||
Node.ShowBackingValue showBacking = Node.ShowBackingValue.Unconnected;
|
XNode.Node.ShowBackingValue showBacking = XNode.Node.ShowBackingValue.Unconnected;
|
||||||
Node.OutputAttribute outputAttribute;
|
XNode.Node.OutputAttribute outputAttribute;
|
||||||
if (NodeEditorUtilities.GetAttrib(port.node.GetType(), property.name, out outputAttribute)) showBacking = outputAttribute.backingValue;
|
if (NodeEditorUtilities.GetAttrib(port.node.GetType(), property.name, out outputAttribute)) showBacking = outputAttribute.backingValue;
|
||||||
|
|
||||||
switch (showBacking) {
|
switch (showBacking) {
|
||||||
case Node.ShowBackingValue.Unconnected:
|
case XNode.Node.ShowBackingValue.Unconnected:
|
||||||
// Display a label if port is connected
|
// Display a label if port is connected
|
||||||
if (port.IsConnected) EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName), NodeEditorResources.styles.outputPort, GUILayout.MinWidth(30));
|
if (port.IsConnected) EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName), NodeEditorResources.styles.outputPort, GUILayout.MinWidth(30));
|
||||||
// Display an editable property field if port is not connected
|
// Display an editable property field if port is not connected
|
||||||
else EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
else EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
||||||
break;
|
break;
|
||||||
case Node.ShowBackingValue.Never:
|
case XNode.Node.ShowBackingValue.Never:
|
||||||
// Display a label
|
// Display a label
|
||||||
EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName), NodeEditorResources.styles.outputPort, GUILayout.MinWidth(30));
|
EditorGUILayout.LabelField(label != null ? label : new GUIContent(property.displayName), NodeEditorResources.styles.outputPort, GUILayout.MinWidth(30));
|
||||||
break;
|
break;
|
||||||
case Node.ShowBackingValue.Always:
|
case XNode.Node.ShowBackingValue.Always:
|
||||||
// Display an editable property field
|
// Display an editable property field
|
||||||
EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
EditorGUILayout.PropertyField(property, label, includeChildren, GUILayout.MinWidth(30));
|
||||||
break;
|
break;
|
||||||
@ -104,18 +104,18 @@ namespace XNodeEditor {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Make a simple port field. </summary>
|
/// <summary> Make a simple port field. </summary>
|
||||||
public static void PortField(NodePort port, params GUILayoutOption[] options) {
|
public static void PortField(XNode.NodePort port, params GUILayoutOption[] options) {
|
||||||
PortField(null, port, options);
|
PortField(null, port, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary> Make a simple port field. </summary>
|
/// <summary> Make a simple port field. </summary>
|
||||||
public static void PortField(GUIContent label, NodePort port, params GUILayoutOption[] options) {
|
public static void PortField(GUIContent label, XNode.NodePort port, params GUILayoutOption[] options) {
|
||||||
if (port == null) return;
|
if (port == null) return;
|
||||||
if (label == null) EditorGUILayout.LabelField(ObjectNames.NicifyVariableName(port.fieldName), options);
|
if (label == null) EditorGUILayout.LabelField(ObjectNames.NicifyVariableName(port.fieldName), options);
|
||||||
else EditorGUILayout.LabelField(label, options);
|
else EditorGUILayout.LabelField(label, options);
|
||||||
Rect rect = GUILayoutUtility.GetLastRect();
|
Rect rect = GUILayoutUtility.GetLastRect();
|
||||||
if (port.direction == NodePort.IO.Input) rect.position = rect.position - new Vector2(16, 0);
|
if (port.direction == XNode.NodePort.IO.Input) rect.position = rect.position - new Vector2(16, 0);
|
||||||
else if (port.direction == NodePort.IO.Output) rect.position = rect.position + new Vector2(rect.width, 0);
|
else if (port.direction == XNode.NodePort.IO.Output) rect.position = rect.position + new Vector2(rect.width, 0);
|
||||||
rect.size = new Vector2(16, 16);
|
rect.size = new Vector2(16, 16);
|
||||||
|
|
||||||
Color backgroundColor = new Color32(90, 97, 105, 255);
|
Color backgroundColor = new Color32(90, 97, 105, 255);
|
||||||
|
|||||||
@ -19,15 +19,15 @@ namespace XNodeEditor {
|
|||||||
|
|
||||||
public static Type[] GetNodeTypes() {
|
public static Type[] GetNodeTypes() {
|
||||||
//Get all classes deriving from Node via reflection
|
//Get all classes deriving from Node via reflection
|
||||||
return GetDerivedTypes(typeof(Node));
|
return GetDerivedTypes(typeof(XNode.Node));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Dictionary<Type, Color> GetNodeTint() {
|
public static Dictionary<Type, Color> GetNodeTint() {
|
||||||
Dictionary<Type, Color> tints = new Dictionary<Type, Color>();
|
Dictionary<Type, Color> tints = new Dictionary<Type, Color>();
|
||||||
for (int i = 0; i < nodeTypes.Length; i++) {
|
for (int i = 0; i < nodeTypes.Length; i++) {
|
||||||
var attribs = nodeTypes[i].GetCustomAttributes(typeof(Node.NodeTint), true);
|
var attribs = nodeTypes[i].GetCustomAttributes(typeof(XNode.Node.NodeTint), true);
|
||||||
if (attribs == null || attribs.Length == 0) continue;
|
if (attribs == null || attribs.Length == 0) continue;
|
||||||
Node.NodeTint attrib = attribs[0] as Node.NodeTint;
|
XNode.Node.NodeTint attrib = attribs[0] as XNode.Node.NodeTint;
|
||||||
tints.Add(nodeTypes[i], attrib.color);
|
tints.Add(nodeTypes[i], attrib.color);
|
||||||
}
|
}
|
||||||
return tints;
|
return tints;
|
||||||
|
|||||||
@ -10,11 +10,11 @@ namespace XNodeEditor {
|
|||||||
public static NodeEditorWindow current;
|
public static NodeEditorWindow current;
|
||||||
|
|
||||||
/// <summary> Stores node positions for all nodePorts. </summary>
|
/// <summary> Stores node positions for all nodePorts. </summary>
|
||||||
public Dictionary<NodePort, Rect> portConnectionPoints { get { return _portConnectionPoints; } }
|
public Dictionary<XNode.NodePort, Rect> portConnectionPoints { get { return _portConnectionPoints; } }
|
||||||
private Dictionary<NodePort, Rect> _portConnectionPoints = new Dictionary<NodePort, Rect>();
|
private Dictionary<XNode.NodePort, Rect> _portConnectionPoints = new Dictionary<XNode.NodePort, Rect>();
|
||||||
public Dictionary<Node, float> nodeWidths { get { return _nodeWidths; } }
|
public Dictionary<XNode.Node, float> nodeWidths { get { return _nodeWidths; } }
|
||||||
private Dictionary<Node, float> _nodeWidths = new Dictionary<Node, float>();
|
private Dictionary<XNode.Node, float> _nodeWidths = new Dictionary<XNode.Node, float>();
|
||||||
public NodeGraph graph;
|
public XNode.NodeGraph graph;
|
||||||
public Vector2 panOffset { get { return _panOffset; } set { _panOffset = value; Repaint(); } }
|
public Vector2 panOffset { get { return _panOffset; } set { _panOffset = value; Repaint(); } }
|
||||||
private Vector2 _panOffset;
|
private Vector2 _panOffset;
|
||||||
public float zoom { get { return _zoom; } set { _zoom = Mathf.Clamp(value, 1f, 5f); Repaint(); } }
|
public float zoom { get { return _zoom; } set { _zoom = Mathf.Clamp(value, 1f, 5f); Repaint(); } }
|
||||||
@ -46,7 +46,7 @@ namespace XNodeEditor {
|
|||||||
string path = EditorUtility.SaveFilePanelInProject("Save NodeGraph", "NewNodeGraph", "asset", "");
|
string path = EditorUtility.SaveFilePanelInProject("Save NodeGraph", "NewNodeGraph", "asset", "");
|
||||||
if (string.IsNullOrEmpty(path)) return;
|
if (string.IsNullOrEmpty(path)) return;
|
||||||
else {
|
else {
|
||||||
NodeGraph existingGraph = AssetDatabase.LoadAssetAtPath<NodeGraph>(path);
|
XNode.NodeGraph existingGraph = AssetDatabase.LoadAssetAtPath<XNode.NodeGraph>(path);
|
||||||
if (existingGraph != null) AssetDatabase.DeleteAsset(path);
|
if (existingGraph != null) AssetDatabase.DeleteAsset(path);
|
||||||
AssetDatabase.CreateAsset(graph, path);
|
AssetDatabase.CreateAsset(graph, path);
|
||||||
EditorUtility.SetDirty(graph);
|
EditorUtility.SetDirty(graph);
|
||||||
@ -78,13 +78,13 @@ namespace XNodeEditor {
|
|||||||
return new Vector2(xOffset, yOffset);
|
return new Vector2(xOffset, yOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SelectNode(Node node) {
|
public void SelectNode(XNode.Node node) {
|
||||||
selectedNode = node;
|
selectedNode = node;
|
||||||
}
|
}
|
||||||
|
|
||||||
[OnOpenAsset(0)]
|
[OnOpenAsset(0)]
|
||||||
public static bool OnOpen(int instanceID, int line) {
|
public static bool OnOpen(int instanceID, int line) {
|
||||||
NodeGraph nodeGraph = EditorUtility.InstanceIDToObject(instanceID) as NodeGraph;
|
XNode.NodeGraph nodeGraph = EditorUtility.InstanceIDToObject(instanceID) as XNode.NodeGraph;
|
||||||
if (nodeGraph != null) {
|
if (nodeGraph != null) {
|
||||||
NodeEditorWindow w = Init();
|
NodeEditorWindow w = Init();
|
||||||
w.graph = nodeGraph;
|
w.graph = nodeGraph;
|
||||||
|
|||||||
@ -7,8 +7,8 @@ using XNode;
|
|||||||
|
|
||||||
namespace XNodeEditor {
|
namespace XNodeEditor {
|
||||||
/// <summary> Base class to derive custom Node Graph editors from. Use this to override how graphs are drawn in the editor. </summary>
|
/// <summary> Base class to derive custom Node Graph editors from. Use this to override how graphs are drawn in the editor. </summary>
|
||||||
[CustomNodeGraphEditor(typeof(NodeGraph))]
|
[CustomNodeGraphEditor(typeof(XNode.NodeGraph))]
|
||||||
public class NodeGraphEditor : XNodeInternal.NodeEditorBase<NodeGraphEditor, NodeGraphEditor.CustomNodeGraphEditorAttribute, NodeGraph> {
|
public class NodeGraphEditor : XNodeInternal.NodeEditorBase<NodeGraphEditor, NodeGraphEditor.CustomNodeGraphEditorAttribute, XNode.NodeGraph> {
|
||||||
/// <summary> Custom node editors defined with [CustomNodeGraphEditor] </summary>
|
/// <summary> Custom node editors defined with [CustomNodeGraphEditor] </summary>
|
||||||
[NonSerialized] private static Dictionary<Type, NodeGraphEditor> editors;
|
[NonSerialized] private static Dictionary<Type, NodeGraphEditor> editors;
|
||||||
|
|
||||||
@ -23,7 +23,7 @@ namespace XNodeEditor {
|
|||||||
/// <summary> Returns context menu path. Returns null if node is not available. </summary>
|
/// <summary> Returns context menu path. Returns null if node is not available. </summary>
|
||||||
public virtual string GetNodePath(Type type) {
|
public virtual string GetNodePath(Type type) {
|
||||||
//Check if type has the CreateNodeMenuAttribute
|
//Check if type has the CreateNodeMenuAttribute
|
||||||
Node.CreateNodeMenuAttribute attrib;
|
XNode.Node.CreateNodeMenuAttribute attrib;
|
||||||
if (NodeEditorUtilities.GetAttrib(type, out attrib)) // Return custom path
|
if (NodeEditorUtilities.GetAttrib(type, out attrib)) // Return custom path
|
||||||
return attrib.menuName;
|
return attrib.menuName;
|
||||||
else // Return generated path
|
else // Return generated path
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user