private void RenderLinks(float scale, NodeEditorField highlightedField) { foreach (NodeEditorGUI node in _editableObjects) { if (node.HasOutput()) { RenderLinkIcon(node.GetOutputField()._position, kOutputLinkIconColor, scale, false); } foreach (NodeEditorField nodeInputField in node.GetInputFields()) { Color color; if (_dragMode == eDragType.Custom && (nodeInputField._type != _draggingNodeFieldFrom._type && !_draggingNodeFieldFrom._type.IsAssignableFrom(nodeInputField._type))) { color = kUnusableLinkIconColor; } else { color = kInputLinkIconColor; } RenderStaticValueBox(nodeInputField, nodeInputField._position, kUnusableLinkIconColor, scale); RenderLinkIcon(nodeInputField._position, color, scale, nodeInputField == highlightedField); } } foreach (NodeEditorGUI node in _editableObjects) { foreach (NodeEditorField nodeInputField in node.GetInputFields()) { if (_dragMode != eDragType.Custom || _draggingNodeFieldTo != nodeInputField) { int linkedOutputNodeId = GetNodeInputFieldLinkNodeId(nodeInputField); if (linkedOutputNodeId != -1) { NodeEditorGUI outputNode = GetEditableObject(linkedOutputNodeId); if (outputNode != null && outputNode.HasOutput()) { RenderLink(outputNode.GetOutputField()._position, nodeInputField._position, _dragMode == eDragType.Custom ? Color.Lerp(kLinkLineColor, Color.black, 0.3f) : kLinkLineColor, scale); } } } } } if (_dragMode == eDragType.Custom) { //Instead of rendering current dragging link, render it to mouse position RenderLink(_draggingNodeFieldFrom._position, Event.current.mousePosition, kLinkLineColor, scale, true); } }
protected override void OnLeftMouseDown(Event inputEvent) { //Check for clicking on a link NodeEditorField clickedOnNodeFromField = null; NodeEditorField clickedOnNodeToField = null; for (int i = 0; i < _editableObjects.Count && clickedOnNodeFromField == null; i++) { NodeEditorGUI node = (NodeEditorGUI)_editableObjects[i]; if (node.GetOutputField() != null) { Vector2 toField = inputEvent.mousePosition - node.GetOutputField()._position; if (toField.magnitude < kLinkIconWidth * 0.5f) { clickedOnNodeFromField = node.GetOutputField(); break; } } foreach (NodeEditorField nodeInputField in node.GetInputFields()) { //If has an link going into it we can drag it away int linkNodeId = GetNodeInputFieldLinkNodeId(nodeInputField); if (linkNodeId != -1) { NodeEditorGUI linkedNode = GetEditableObject(linkNodeId); if (linkedNode != null) { Vector2 toField = inputEvent.mousePosition - nodeInputField._position; if (toField.magnitude < kLinkIconWidth) { clickedOnNodeFromField = linkedNode.GetOutputField(); clickedOnNodeToField = nodeInputField; break; } } } } } if (clickedOnNodeFromField != null) { _draggingNodeFieldFrom = clickedOnNodeFromField; _draggingNodeFieldTo = clickedOnNodeToField; _dragMode = eDragType.Custom; _dragPos = inputEvent.mousePosition; _dragAreaRect = new Rect(-1.0f, -1.0f, 0.0f, 0.0f); } //Normal object clicking else { _dragMode = eDragType.LeftClick; base.OnLeftMouseDown(inputEvent); } }