private void DrawHeldConnection() { if (!IsDraggingPort) { return; } Color color = NodePreferences.CONNECTION_PORT_COLOR; Vector2 start, end; color.a *= 0.6f; Vector2 portPosition = NodeEditor.FindPortRect(DraggedPort).center;// + node.Position; Vector2 mousePosition = _mousePosition; //mousePosition = WindowToGridPosition(mousePosition); //portPosition = GridToWindowPosition(portPosition); mousePosition = WindowToWindowPositionNotClipped(mousePosition); portPosition = GridToWindowPositionNotClipped(portPosition); if (DraggedPort is InputPort) { start = mousePosition; end = portPosition; } else { start = portPosition; end = mousePosition; } NodeRendering.DrawConnection(start, end, color, NodePreferences.CONNECTION_WIDTH / Zoom); }
private void DrawConnections() { //return; for (int i = 0; i < Graph.ConnectionCount; i++) { Connection connection = Graph.GetConnection(i); if (connection == null || connection.End == null || connection.Start == null || connection.End.Node == null || connection.Start.Node == null) { Debug.LogWarning("F****d up connection. Removing."); Graph.RemoveConnection(connection); continue; } Vector2 end = NodeEditor.FindPortRect(connection.End).center; // + node.Position; Vector2 windowEnd = GridToWindowPositionNotClipped(end); Vector2 start = NodeEditor.FindPortRect(connection.Start).center; // + output.Node.Position; Vector2 windowStart = GridToWindowPositionNotClipped(start); if (Selection.Contains(connection)) { NodeRendering.DrawConnection(windowStart, windowEnd, Color.green, NodePreferences.CONNECTION_WIDTH / Zoom * 2, false); } NodeRendering.DrawConnection(windowStart, windowEnd, NodePreferences.CONNECTION_PORT_COLOR, NodePreferences.CONNECTION_WIDTH / Zoom); DrawConnectionModifiers((start + end) / 2, connection); } //for (int i = 0; i < _graph.NodeCount; i++) //{ // Node node = _graph.GetNode(i); // IInput inputNode = node as IInput; // InputPort input = inputNode != null ? inputNode.InputPort : null; // if (input == null) continue; // Vector2 end = NodeEditor.FindPortRect(input).center;// + node.Position; // Vector2 windowEnd = GridToWindowPositionNotClipped(end); // for (int j = 0; j < input.ConnectionsCount; j++) // { // Connection connection = input.GetConnection(j); // if (connection == null) // { // OnNull(input); // continue; // } // Vector2 start = NodeEditor.FindPortRect(connection.Start).center;// + output.Node.Position; // Vector2 windowStart = GridToWindowPositionNotClipped(start); // NodeRendering.DrawConnection(windowStart, windowEnd, // NodePreferences.CONNECTION_PORT_COLOR, NodePreferences.CONNECTION_WIDTH / Zoom); // DrawConnectionModifiers((start + end) / 2, connection); // } //} }
private void CheckHoveringAndSelection() { if (_isLayoutEvent) { return; } ResetHover(); bool isDraggingGrid = _currentActivity == Activity.DraggingGrid; Rect selectionRect = _selectionRect; Vector2 mousePosition = _mousePosition; List <Object> boxSelected = new List <Object>(); //TODO Investigate reverse recognition not working!? //Never mind it works, it's just my architecture works bottom-top, //instead of top-bottom-or-stop //Why? Cause hovering //TODO Investigate alternatives for conversion for (int i = 0; i < Graph.NodeCount; i++) { Node node = Graph.GetNode(i); NodeEditor nodeEditor = NodeEditor.GetEditor(node); Vector2 size; if (_nodeSizes.TryGetValue(node, out size)) { Rect nodeRect = new Rect(node.Position, size); nodeRect = GridToWindowRect(nodeRect); if (nodeRect.Contains(mousePosition)) { _hoveredNode = node; } if (isDraggingGrid && nodeRect.Overlaps(selectionRect)) { boxSelected.Add(node); } } //Check hovering over ports var inputNode = node as IInput; if (inputNode != null) { InputPort input = inputNode.InputPort; Rect inputRect = nodeEditor.GetPortRect(input); //inputRect.position += node.Position; inputRect = GridToWindowRect(inputRect); if (inputRect.Contains(mousePosition)) { HoveredPort = input; } } IOutput sOutputNode = node as IOutput; if (sOutputNode != null) { OutputPort output = sOutputNode.OutputPort; Rect outputRect = nodeEditor.GetPortRect(output); //outputRect.position += node.Position; outputRect = GridToWindowRect(outputRect); if (outputRect.Contains(mousePosition)) { HoveredPort = output; } } IMultipleOutput mOutputNode = node as IMultipleOutput; if (mOutputNode != null) { var outputs = mOutputNode.GetOutputs(); foreach (OutputPort output in outputs) { Rect outputRect = nodeEditor.GetPortRect(output); //outputRect.position += node.Position; outputRect = GridToWindowRect(outputRect); if (outputRect.Contains(mousePosition)) { HoveredPort = output; } } } } for (int i = 0; i < Graph.ConnectionCount; i++) { Connection connection = Graph.GetConnection(i); if (connection == null) { Debug.Log("Null connection at index " + i); OnNull(Graph); continue; } Vector2 start = NodeEditor.FindPortRect(connection.Start).center; Vector2 end = NodeEditor.FindPortRect(connection.End).center; start = GridToWindowPosition(start); end = GridToWindowPosition(end); //if (OtherUtilities.PointOverlapBezier(mousePosition, start, end, NodePreferences.CONNECTION_WIDTH)) if (LineSegment.WideLineSegmentPointCheck(mousePosition, start, end, NodePreferences.CONNECTION_WIDTH * 2 / Zoom)) { _hoveredConnection = connection; } //DONE: Add range percentage overlap check, as just overlapping might be too annoying. if (isDraggingGrid && LineSegment.LineRectOverlapPercentageCheck(selectionRect, start, end) > 0.3f) { boxSelected.Add(connection); } Rect[] modifierRects; if (!_connectionModifierRects.TryGetValue(connection, out modifierRects)) { continue; } for (int j = 0; j < connection.InstructionCount; j++) { Instruction mod = connection.GetInstruction(j); Rect rect = GridToWindowRect(modifierRects[j]); if (rect.Contains(mousePosition)) { _hoveredInstruction = mod; } if (isDraggingGrid && rect.Overlaps(selectionRect)) { boxSelected.Add(mod); } } } //return; if (isDraggingGrid) { if (_cachedEvent.control || _cachedEvent.shift) { boxSelected.AddRange(_cachedSelectedObjects); } Selection.objects = boxSelected.ToArray(); } else { _selectionRect = Rect.zero; } }