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);
                    }
                }