IEdge ConnectNoValidate(SlotReference fromSlotRef, SlotReference toSlotRef) { var fromNode = GetNodeFromGuid(fromSlotRef.nodeGuid); var toNode = GetNodeFromGuid(toSlotRef.nodeGuid); if (fromNode == null || toNode == null) { return(null); } // if fromNode is already connected to toNode // do now allow a connection as toNode will then // have an edge to fromNode creating a cycle. // if this is parsed it will lead to an infinite loop. var dependentNodes = new List <AbstractMaterialNode>(); NodeUtils.CollectNodesNodeFeedsInto(dependentNodes, toNode); if (dependentNodes.Contains(fromNode)) { return(null); } var fromSlot = fromNode.FindSlot <ISlot>(fromSlotRef.slotId); var toSlot = toNode.FindSlot <ISlot>(toSlotRef.slotId); if (fromSlot.isOutputSlot == toSlot.isOutputSlot) { return(null); } var outputSlot = fromSlot.isOutputSlot ? fromSlotRef : toSlotRef; var inputSlot = fromSlot.isInputSlot ? fromSlotRef : toSlotRef; s_TempEdges.Clear(); GetEdges(inputSlot, s_TempEdges); // remove any inputs that exits before adding foreach (var edge in s_TempEdges) { RemoveEdgeNoValidate(edge); } var newEdge = new Edge(outputSlot, inputSlot); m_Edges.Add(newEdge); m_AddedEdges.Add(newEdge); AddEdgeToNodeEdges(newEdge); //Debug.LogFormat("Connected edge: {0} -> {1} ({2} -> {3})\n{4}", newEdge.outputSlot.nodeGuid, newEdge.inputSlot.nodeGuid, fromNode.name, toNode.name, Environment.StackTrace); return(newEdge); }
void OnNodeChanged(INode inNode, ModificationScope scope) { if (m_GraphView == null) { return; } var dependentNodes = new List <INode>(); NodeUtils.CollectNodesNodeFeedsInto(dependentNodes, inNode); foreach (var node in dependentNodes) { var theViews = m_GraphView.nodes.ToList().OfType <MaterialNodeView>(); var viewsFound = theViews.Where(x => x.node.guid == node.guid).ToList(); foreach (var drawableNodeData in viewsFound) { drawableNodeData.OnModified(scope); } } }