123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- using System;
- using System.Collections.Generic;
- using UnityEngine;
- namespace XNode
- {
- /// <summary> Base class for all node graphs </summary>
- [Serializable]
- public abstract class NodeGraph : ScriptableObject
- {
- /// <summary> All nodes in the graph. <para/>
- /// See: <see cref="AddNode{T}"/> </summary>
- [SerializeField] public List<Node> nodes = new List<Node>();
- /// <summary> Add a node to the graph by type (convenience method - will call the System.Type version) </summary>
- public T AddNode<T>() where T : Node
- {
- return AddNode(typeof(T)) as T;
- }
- public virtual string Title()
- {
- return "xNode";
- }
- /// <summary> Add a node to the graph by type </summary>
- public virtual Node AddNode(Type type)
- {
- Node.graphHotfix = this;
- Node node = CreateInstance(type) as Node;
- node.UniqueID = node.GetInstanceID();
- node.graph = this;
- nodes.Add(node);
- return node;
- }
- /// <summary> Creates a copy of the original node in the graph </summary>
- public virtual Node CopyNode(Node original)
- {
- Node.graphHotfix = this;
- Node node = Instantiate(original);
- node.graph = this;
- node.ClearConnections();
- nodes.Add(node);
- return node;
- }
- /// <summary> Safely remove a node and all its connections </summary>
- /// <param name="node"> The node to remove </param>
- public virtual void RemoveNode(Node node)
- {
- node.ClearConnections();
- nodes.Remove(node);
- if (Application.isPlaying) Destroy(node);
- }
- /// <summary> Remove all nodes and connections from the graph </summary>
- public virtual void Clear()
- {
- // if (Application.isPlaying)
- // {
- // for (int i = 0; i < nodes.Count; i++)
- // {
- // DestroyImmediate(nodes[i], false);
- // }
- // }
- //
- // nodes.Clear();
- }
- /// <summary> Create a new deep copy of this graph </summary>
- public virtual NodeGraph Copy()
- {
- // Instantiate a new nodegraph instance
- NodeGraph graph = Instantiate(this);
- // Instantiate all nodes inside the graph
- for (int i = 0; i < nodes.Count; i++)
- {
- if (nodes[i] == null) continue;
- Node.graphHotfix = graph;
- Node node = Instantiate(nodes[i]) as Node;
- node.graph = graph;
- graph.nodes[i] = node;
- }
- // Redirect all connections
- for (int i = 0; i < graph.nodes.Count; i++)
- {
- if (graph.nodes[i] == null) continue;
- foreach (NodePort port in graph.nodes[i].Ports)
- {
- port.Redirect(nodes, graph.nodes);
- }
- }
- return graph;
- }
- protected virtual void OnDestroy()
- {
- // Remove all nodes prior to graph destruction
- // Clear();
- }
- #region Attributes
- /// <summary> Automatically ensures the existance of a certain node type, and prevents it from being deleted. </summary>
- [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
- public class RequireNodeAttribute : Attribute
- {
- public Type type0;
- public Type type1;
- public Type type2;
- /// <summary> Automatically ensures the existance of a certain node type, and prevents it from being deleted </summary>
- public RequireNodeAttribute(Type type)
- {
- this.type0 = type;
- this.type1 = null;
- this.type2 = null;
- }
- /// <summary> Automatically ensures the existance of a certain node type, and prevents it from being deleted </summary>
- public RequireNodeAttribute(Type type, Type type2)
- {
- this.type0 = type;
- this.type1 = type2;
- this.type2 = null;
- }
- /// <summary> Automatically ensures the existance of a certain node type, and prevents it from being deleted </summary>
- public RequireNodeAttribute(Type type, Type type2, Type type3)
- {
- this.type0 = type;
- this.type1 = type2;
- this.type2 = type3;
- }
- public bool Requires(Type type)
- {
- if (type == null) return false;
- if (type == type0) return true;
- else if (type == type1) return true;
- else if (type == type2) return true;
- return false;
- }
- }
- #endregion
- }
- }
|