예제 #1
0
        /// <summary>
        /// Remove an edge from both the canvas view and the underlying graph model
        /// </summary>
        public void RemoveEdge(GraphViewEdge edge, bool registerAsNewUndo)
        {
            var input  = edge.input as PortView;
            var output = edge.output as PortView;

            if (registerAsNewUndo)
            {
                Undo.RegisterCompleteObjectUndo(Graph, "Remove Edge");
            }

            // Disconnect the ports in the model
            Graph.RemoveEdge(input.Target, output.Target);
            serializedGraph.Update();
            EditorUtility.SetDirty(Graph);

            // Remove the edge view
            edge.input.Disconnect(edge);
            edge.output.Disconnect(edge);
            edge.input  = null;
            edge.output = null;
            RemoveElement(edge);

            // Dirty the affected node views
            Dirty(input.node as NodeView);
            Dirty(output.node as NodeView);
        }
예제 #2
0
        public void OnDropOutsidePort(UnityEditor.Experimental.GraphView.Edge edge, Vector2 position)
        {
            var draggedPort = edge.output?.edgeConnector.edgeDragHelper.draggedPort ?? edge.input?.edgeConnector.edgeDragHelper.draggedPort;

            m_SearchWindowProvider.connectedPort = (NodePort)draggedPort;
            SearchWindow.Open(new SearchWindowContext(GUIUtility.GUIToScreenPoint(Event.current.mousePosition)), m_SearchWindowProvider);
        }
예제 #3
0
        public void OnDropOutsidePort(Edge edge, Vector2 position)
        {
            var draggedPort = (edge.output != null ? edge.output.edgeConnector.edgeDragHelper.draggedPort : null) ?? (edge.input != null ? edge.input.edgeConnector.edgeDragHelper.draggedPort : null);

            m_SearchWindowProvider.connectedPort = (ShaderPort)draggedPort;
            SearchWindow.Open(new SearchWindowContext(GUIUtility.GUIToScreenPoint(Event.current.mousePosition)), m_SearchWindowProvider);
        }
예제 #4
0
        /// <summary>
        /// Remove an edge from both the canvas view and the underlying graph model
        /// </summary>
        public void RemoveEdge(Edge edge, bool registerAsNewUndo)
        {
            var input  = edge.input as PortView;
            var output = edge.output as PortView;

            if (registerAsNewUndo)
            {
                Undo.RegisterCompleteObjectUndo(m_Graph, "Remove Edge");
            }

            Debug.Log($"-edge {input.portName} to {output.portName}");

            // Disconnect the ports in the model
            m_Graph.RemoveEdge(input.target, output.target);
            m_SerializedGraph.Update();
            EditorUtility.SetDirty(m_Graph);

            // Remove the edge view
            edge.input.Disconnect(edge);
            edge.output.Disconnect(edge);
            edge.input  = null;
            edge.output = null;
            RemoveElement(edge);

            // Dirty the affected node views
            Dirty(input.node as NodeView);
            Dirty(output.node as NodeView);
        }
예제 #5
0
        /// <summary>
        /// Add a new edge to both the canvas view and the underlying graph model
        /// </summary>
        public void AddEdge(GraphViewEdge edge, bool registerAsNewUndo)
        {
            try
            {
                if (edge.input == null || edge.output == null)
                {
                    return;
                }

                if (registerAsNewUndo)
                {
                    Undo.RegisterCompleteObjectUndo(Graph, "Add Edge");
                }

                // Handle single connection ports on either end.
                var edgesToRemove = new List <GraphViewEdge>();
                if (edge.input.capacity == GraphViewPort.Capacity.Single)
                {
                    foreach (var conn in edge.input.connections)
                    {
                        edgesToRemove.Add(conn);
                    }
                }

                if (edge.output.capacity == GraphViewPort.Capacity.Single)
                {
                    foreach (var conn in edge.output.connections)
                    {
                        edgesToRemove.Add(conn);
                    }
                }

                foreach (var edgeToRemove in edgesToRemove)
                {
                    RemoveEdge(edgeToRemove, false);
                }

                var input  = edge.input as PortView;
                var output = edge.output as PortView;

                // Connect the ports in the model
                Graph.AddEdge(input.Target, output.Target);
                serializedGraph.Update();
                EditorUtility.SetDirty(Graph);

                // Add a matching edge view onto the canvas
                var newEdge = input.ConnectTo(output);
                AddElement(newEdge);

                // Dirty the affected node views
                Dirty(input.node as NodeView);
                Dirty(output.node as NodeView);
            }
            catch (Exception ex)
            {
                Debug.LogException(ex);
            }
        }
예제 #6
0
        public void OnDropOutsidePort(Edge edge, Vector2 position)
        {
            var draggedPort = (edge.output != null ? edge.output.edgeConnector.edgeDragHelper.draggedPort : null) ?? (edge.input != null ? edge.input.edgeConnector.edgeDragHelper.draggedPort : null);

            m_SearchWindowProvider.connectedPort = (ShaderPort)draggedPort;
            SearcherWindow.Show(m_editorWindow, (m_SearchWindowProvider as SearcherProvider).LoadSearchWindow(),
                                item => (m_SearchWindowProvider as SearcherProvider).OnSearcherSelectEntry(item, position),
                                position, null);
        }
예제 #7
0
        public void OnDrop(GraphView graphView, UnityEditor.Experimental.GraphView.Edge edge)
        {
            var leftSlot  = edge.output.GetSlot();
            var rightSlot = edge.input.GetSlot();

            if (leftSlot != null && rightSlot != null)
            {
                m_Graph.owner.RegisterCompleteObjectUndo("Connect Edge");
                m_Graph.Connect(leftSlot.slotReference, rightSlot.slotReference);
            }
        }
예제 #8
0
        public void BuildEdge(EditorView editorView)
        {
            EditorView = editorView;
            var inputNode  = editorView.GraphView.nodes.ToList().Find(node => node.viewDataKey == Input) as AbstractNode;
            var outputNode = editorView.GraphView.nodes.ToList().Find(node => node.viewDataKey == Output) as AbstractNode;
            var inputPort  = inputNode.Owner.GuidPortDictionary[InputPort];
            var outputPort = outputNode.Owner.GuidPortDictionary[OutputPort];

            Edge          = inputPort.ConnectTo(outputPort);
            Edge.userData = this;
        }
        public void OnDropOutsidePort(Edge edge, Vector2 position)
        {
            var draggedPort = (edge.output != null ? edge.output.edgeConnector.edgeDragHelper.draggedPort : null) ?? (edge.input != null ? edge.input.edgeConnector.edgeDragHelper.draggedPort : null);

            m_SearchWindowProvider.connectedPort     = (ShaderPort)draggedPort;
            m_SearchWindowProvider.regenerateEntries = true;//need to be sure the entires are relevant to the edge we are dragging
            SearcherWindow.Show(m_editorWindow, (m_SearchWindowProvider as SearcherProvider).LoadSearchWindow(),
                                item => (m_SearchWindowProvider as SearcherProvider).OnSearcherSelectEntry(item, position),
                                position, null);
            m_SearchWindowProvider.regenerateEntries = true;//entries no longer necessarily relevant, need to regenerate
        }
예제 #10
0
        /// <summary>
        /// Create a new node from reflection data and insert into the Graph.
        /// </summary>
        internal void AddNodeFromSearch(Node node, Vector2 screenPosition, PortView connectedPort = null, bool registerUndo = true)
        {
            // Calculate where to place this node on the graph
            var windowRoot          = EditorWindow.rootVisualElement;
            var windowMousePosition = EditorWindow.rootVisualElement.ChangeCoordinatesTo(
                windowRoot.parent,
                screenPosition - EditorWindow.position.position
                );

            var graphMousePosition = contentViewContainer.WorldToLocal(windowMousePosition);

            // Track undo and add to the graph
            if (registerUndo)
            {
                Undo.RegisterCompleteObjectUndo(Graph, $"Add Node {node.Name}");
            }

            node.Position = graphMousePosition;

            Graph.AddNode(node);
            serializedGraph.Update();
            EditorUtility.SetDirty(Graph);

            // Add a node to the visual graph
            var editorType = NodeReflection.GetNodeEditorType(node.GetType());
            var element    = Activator.CreateInstance(editorType) as NodeView;

            element.Initialize(node, this, edgeConnectorListener);

            AddElement(element);

            // If there was a provided existing port to connect to, find the best
            // candidate port on the new node and connect.
            if (connectedPort != null)
            {
                var edge = new GraphViewEdge();

                if (connectedPort.direction == Direction.Input)
                {
                    edge.input  = connectedPort;
                    edge.output = element.GetCompatibleOutputPort(connectedPort);
                }
                else
                {
                    edge.output = connectedPort;
                    edge.input  = element.GetCompatibleInputPort(connectedPort);
                }

                AddEdge(edge, false);
            }

            Dirty(element);
        }
예제 #11
0
        GEdge AddEdge(IEdge edge)
        {
            var sourceNode = m_Graph.GetNodeFromGuid(edge.outputSlot.nodeGuid);

            if (sourceNode == null)
            {
                Debug.LogWarning("Source node is null");
                return(null);
            }
            var sourceSlot = sourceNode.FindOutputSlot <NodeSlot>(edge.outputSlot.slotId);

            var targetNode = m_Graph.GetNodeFromGuid(edge.inputSlot.nodeGuid);

            if (targetNode == null)
            {
                Debug.LogWarning("Target node is null");
                return(null);
            }
            var targetSlot = targetNode.FindInputSlot <NodeSlot>(edge.inputSlot.slotId);

            var sourceNodeView = m_GraphView.nodes.ToList().OfType <NodeView>().FirstOrDefault(x => x.node == sourceNode);

            if (sourceNodeView != null)
            {
                var sourceAnchor = sourceNodeView.outputContainer.Children().OfType <NodePort>().FirstOrDefault(x => x.slot.Equals(sourceSlot));

                var targetNodeView = m_GraphView.nodes.ToList().OfType <NodeView>().FirstOrDefault(x => x.node == targetNode);
                var targetAnchor   = targetNodeView.inputContainer.Children().OfType <NodePort>().FirstOrDefault(x => x.slot.Equals(targetSlot));

                var edgeView = new GEdge
                {
                    userData = edge,
                    output   = sourceAnchor,
                    input    = targetAnchor
                };

                edgeView.output.Connect(edgeView);
                edgeView.input.Connect(edgeView);
                m_GraphView.AddElement(edgeView);
                sourceNodeView.RefreshPorts();
                targetNodeView.RefreshPorts();
                sourceNodeView.UpdatePortInputTypes();
                targetNodeView.UpdatePortInputTypes();

                return(edgeView);
            }

            return(null);
        }
        /// <summary>
        /// Generates a connection (edge) between graph nodes
        /// </summary>
        public void GenerateEdge()
        {
            var tempEdge = new GraphView.Edge()
            {
                output = ParentPort,
                input  = InputPort,
            };

            tempEdge?.input.Connect(tempEdge);
            tempEdge?.output.Connect(tempEdge);

            Add(tempEdge);

            RefreshExpandedState();
            RefreshPorts();
        }
        /// <summary>
        /// Activate the search dialog when an edge is dropped on an arbitrary location
        /// </summary>
        public void OnDropOutsidePort(GraphViewEdge edge, Vector2 position)
        {
            var screenPosition = GUIUtility.GUIToScreenPoint(
                Event.current.mousePosition
                );

            if (edge.output != null)
            {
                canvas.OpenSearch(
                    screenPosition,
                    edge.output.edgeConnector.edgeDragHelper.draggedPort as PortView
                    );
            }
            else if (edge.input != null)
            {
                canvas.OpenSearch(
                    screenPosition,
                    edge.input.edgeConnector.edgeDragHelper.draggedPort as PortView
                    );
            }
        }
예제 #14
0
 public void OnDropOutsidePort(Edge edge, Vector2 position)
 {
 }
 /// <summary>
 /// Handle connecting nodes when an edge is dropped between two ports
 /// </summary>
 public void OnDrop(GraphView graphView, GraphViewEdge edge)
 {
     canvas.AddEdge(edge, true);
 }
예제 #16
0
        /// <summary>
        /// Create a new node from reflection data and insert into the Graph.
        /// </summary>
        internal void AddNodeFromReflectionData(
            NodeReflectionData data,
            Vector2 screenPosition,
            PortView connectedPort = null
            )
        {
            // Calculate where to place this node on the graph
            var windowRoot          = m_EditorWindow.rootVisualElement;
            var windowMousePosition = m_EditorWindow.rootVisualElement.ChangeCoordinatesTo(
                windowRoot.parent,
                screenPosition - m_EditorWindow.position.position
                );

            var graphMousePosition = contentViewContainer.WorldToLocal(windowMousePosition);

            // Create a new node instance and set initial data (ports, etc)
            Undo.RegisterCompleteObjectUndo(m_Graph, $"Add Node {data.name}");

            Debug.Log($"+node {data.name}");

            var node = data.CreateInstance();

            node.graphPosition = graphMousePosition;

            m_Graph.AddNode(node);
            m_SerializedGraph.Update();
            EditorUtility.SetDirty(m_Graph);

            var serializedNodesArr = m_SerializedGraph.FindProperty("nodes");

            var nodeIdx        = m_Graph.nodes.IndexOf(node);
            var serializedNode = serializedNodesArr.GetArrayElementAtIndex(nodeIdx);

            // Add a node to the visual graph
            var editorType = NodeReflection.GetNodeEditorType(data.type);
            var element    = Activator.CreateInstance(editorType) as NodeView;

            element.Initialize(node, serializedNode, m_EdgeListener);

            AddElement(element);

            // If there was a provided existing port to connect to, find the best
            // candidate port on the new node and connect.
            if (connectedPort != null)
            {
                var edge = new Edge();

                if (connectedPort.direction == Direction.Input)
                {
                    edge.input  = connectedPort;
                    edge.output = element.GetCompatibleOutputPort(connectedPort);
                }
                else
                {
                    edge.output = connectedPort;
                    edge.input  = element.GetCompatibleInputPort(connectedPort);
                }

                AddEdge(edge, false);
            }

            Dirty(element);
        }
예제 #17
0
        /// <summary>
        /// Add a new edge to both the canvas view and the underlying graph model
        /// </summary>
        public void AddEdge(Edge edge, bool registerAsNewUndo)
        {
            if (edge.input == null || edge.output == null)
            {
                return;
            }

            if (edge.input.node != null && edge.input.node is NodeView in_view)
            {
                in_view.UpdateBinding();
            }
            if (edge.output.node != null && edge.output.node is NodeView out_view)
            {
                out_view.UpdateBinding();
            }

            if (registerAsNewUndo)
            {
                Undo.RegisterCompleteObjectUndo(m_Graph, "Add Edge");
            }

            // Handle single connection ports on either end.
            var edgesToRemove = new List <Edge>();

            if (edge.input.capacity == Port.Capacity.Single)
            {
                foreach (var conn in edge.input.connections)
                {
                    edgesToRemove.Add(conn);
                }
            }

            if (edge.output.capacity == Port.Capacity.Single)
            {
                foreach (var conn in edge.output.connections)
                {
                    edgesToRemove.Add(conn);
                }
            }

            foreach (var edgeToRemove in edgesToRemove)
            {
                RemoveEdge(edgeToRemove, false);
            }

            var input  = edge.input as PortView;
            var output = edge.output as PortView;

            Debug.Log($"+edge {input.portName} to {output.portName}");

            // Connect the ports in the model
            m_Graph.AddEdge(input.target, output.target);
            m_SerializedGraph.Update();
            EditorUtility.SetDirty(m_Graph);

            // Add a matching edge view onto the canvas
            var newEdge = input.ConnectTo(output);

            AddElement(newEdge);

            // Dirty the affected node views
            Dirty(input.node as NodeView);
            Dirty(output.node as NodeView);
        }