public void LoadScript(ScriptData scriptData) { ScriptData = scriptData; DeleteElements(graphElements.ToList()); //Debug.Log($"Loading script '{scriptData.name}' with {scriptData.Nodes.Count} nodes..."); // add nodes foreach (ScriptNodeData nodeData in scriptData.Nodes) { AddNode(nodeData); } // add edges foreach (ScriptNodeData nodeData in Nodes.Values) { Type nodeType = nodeData.GetType(); var connections = nodeType.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) .Where(x => Attribute.IsDefined(x, typeof(ConnectionAttribute))); foreach (FieldInfo connection in connections) { ConnectionAttribute attr = connection.GetCustomAttribute <ConnectionAttribute>(); if (attr.ConnectionDirection != ConnectionAttribute.Direction.Output) { continue; } ScriptNodePortData outputPort = (ScriptNodePortData)connection.GetValue(nodeData); if (!outputPort.IsConnected) { //Debug.Log($"Node {nodeData.Id} connection {outputPort.Id} not connected"); continue; } AddEdge(nodeData.Id, outputPort.Id, outputPort.NodeId, outputPort.PortId); } var outputs = nodeType.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) .Where(x => Attribute.IsDefined(x, typeof(OutputAttribute))); foreach (FieldInfo output in outputs) { OutputAttribute attr = output.GetCustomAttribute <OutputAttribute>(); ScriptNodePortData outputPort = (ScriptNodePortData)output.GetValue(nodeData); if (!outputPort.IsConnected) { //Debug.Log($"Node {nodeData.Id} output {outputPort.Id} not connected"); continue; } AddEdge(nodeData.Id, outputPort.Id, outputPort.NodeId, outputPort.PortId); } } }
public ScriptViewPort(ScriptViewNode node, ScriptNodePortData portData, Orientation orientation, Direction direction, Capacity capacity, Type type) : base(node, portData, orientation, direction, capacity, type) { }
protected override void InitializeView() { base.InitializeView(); Type nodeType = ScriptNodeData.GetType(); //Debug.Log($"Node 0x{Id:X} of type {nodeType}"); var connections = nodeType.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) .Where(x => Attribute.IsDefined(x, typeof(ConnectionAttribute))); foreach (FieldInfo connection in connections) { ConnectionAttribute attr = connection.GetCustomAttribute <ConnectionAttribute>(); if (attr.ConnectionDirection != ConnectionAttribute.Direction.Input) { continue; } //Debug.Log($"Add input connection {attr.Name} to node 0x{Id:X}"); ScriptNodePortData inputPort = (ScriptNodePortData)connection.GetValue(ScriptNodeData); ScriptViewPort port = new ScriptViewPort(this, inputPort, Orientation.Horizontal, Direction.Input, Port.Capacity.Single, typeof(ScriptNodePortData)) { portName = attr.Name }; port.AddManipulator(new EdgeConnector <Edge>(EdgeConnectorListener)); Add(port); } var inputs = nodeType.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) .Where(x => Attribute.IsDefined(x, typeof(InputAttribute))); foreach (FieldInfo input in inputs) { InputAttribute attr = input.GetCustomAttribute <InputAttribute>(); //Debug.Log($"Add input {attr.Name} of type {attr.Type} to node 0x{Id:X}"); ScriptNodePortData inputPort = (ScriptNodePortData)input.GetValue(ScriptNodeData); ScriptViewPort port = new ScriptViewPort(this, inputPort, Orientation.Horizontal, Direction.Input, Port.Capacity.Single, attr.Type) { portName = attr.Name }; port.AddManipulator(new EdgeConnector <Edge>(EdgeConnectorListener)); Add(port); } foreach (FieldInfo connection in connections) { ConnectionAttribute attr = connection.GetCustomAttribute <ConnectionAttribute>(); if (attr.ConnectionDirection != ConnectionAttribute.Direction.Output) { continue; } //Debug.Log($"Add output connection {attr.Name} to node 0x{Id:X}"); ScriptNodePortData outputPort = (ScriptNodePortData)connection.GetValue(ScriptNodeData); ScriptViewPort port = new ScriptViewPort(this, outputPort, Orientation.Horizontal, Direction.Output, Port.Capacity.Single, typeof(ScriptNodePortData)) { portName = attr.Name }; port.AddManipulator(new EdgeConnector <Edge>(EdgeConnectorListener)); Add(port); } var outputs = nodeType.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) .Where(x => Attribute.IsDefined(x, typeof(OutputAttribute))); foreach (FieldInfo output in outputs) { OutputAttribute attr = output.GetCustomAttribute <OutputAttribute>(); //Debug.Log($"Add output {attr.Name} of type {attr.Type} to node 0x{Id:X}"); ScriptNodePortData outputPort = (ScriptNodePortData)output.GetValue(ScriptNodeData); ScriptViewPort port = new ScriptViewPort(this, outputPort, Orientation.Horizontal, Direction.Output, Port.Capacity.Single, attr.Type) { portName = attr.Name }; port.AddManipulator(new EdgeConnector <Edge>(EdgeConnectorListener)); Add(port); } }