void DrawPreviewConnection()
        {
            if (canvas.previewConnection == null)
            {
                return;
            }

            Vector2[] p             = canvas.previewConnection.Points;
            Vector3[] pointsVector3 = new Vector3[]
            {
                CanvasUtility.WorldToCanvasPoint(new Vector3(p[0].x, p[0].y, 0), canvas.canvasState),
                CanvasUtility.WorldToCanvasPoint(new Vector3(p[1].x, p[1].y, 0), canvas.canvasState),
                CanvasUtility.WorldToCanvasPoint(new Vector3(p[2].x, p[2].y, 0), canvas.canvasState),
                CanvasUtility.WorldToCanvasPoint(new Vector3(p[3].x, p[3].y, 0), canvas.canvasState)
            };

            Handles.DrawLines(pointsVector3, new int[] { 0, 1, 1, 2, 2, 3 });
        }
        void DrawConnections()
        {
            for (int i = 0; i < canvas.canvasState.nodePanels.Count; i++)
            {
                NodePanel panel = canvas.canvasState.nodePanels[i];

                if (panel.outHandle == null || panel.outHandle.Connections == null || panel.outHandle.Connections.Count == 0)
                {
                    continue;
                }

                NodeConnection runningConnection = null;

                for (int j = 0; j < panel.outHandle.Connections.Count; j++)
                {
                    NodeConnection connection = panel.outHandle.Connections[j];

                    Handles.color = !Application.isPlaying ? Color.white : new Color(0.5f, 0.5f, 0.5f, 1.0f);

                    if (Application.isPlaying)
                    {
                        // highlight connections that are running
                        if (connection.StartPanel.Node.CurrentChild == connection.EndPanel.Node)
                        {
                            runningConnection = connection;
                        }
                    }

                    Vector2[] p             = connection.Points;
                    Vector3[] pointsVector3 =
                    {
                        CanvasUtility.WorldToCanvasPoint(new Vector3(p[0].x, p[0].y, 0), canvas.canvasState),
                        CanvasUtility.WorldToCanvasPoint(new Vector3(p[1].x, p[1].y, 0), canvas.canvasState),
                        CanvasUtility.WorldToCanvasPoint(new Vector3(p[2].x, p[2].y, 0), canvas.canvasState),
                        CanvasUtility.WorldToCanvasPoint(new Vector3(p[3].x, p[3].y, 0), canvas.canvasState)
                    };

                    Handles.DrawLines(pointsVector3, new int[] { 0, 1, 1, 2, 2, 3 });
                }

                if (runningConnection != null)
                {
                    Handles.color = runningConnection.EndPanel.Node.State == Node.NodeState.Failure ?
                                    BehaviourEditorStyles.playMode_nodeFailureColour : BehaviourEditorStyles.playMode_nodeRunningColour;

                    Vector2[] p             = runningConnection.Points;
                    Vector3[] pointsVector3 = null;

                    if (Math.Abs(p[0].x - p[3].x) < 0.01f)
                    {
                        pointsVector3 = new Vector3[] {
                            CanvasUtility.WorldToCanvasPoint(new Vector3(p[0].x, p[0].y, 0), canvas.canvasState),
                            CanvasUtility.WorldToCanvasPoint(new Vector3(p[3].x, p[3].y, 0), canvas.canvasState),
                        };
                    }
                    else
                    {
                        pointsVector3 = new Vector3[] {
                            CanvasUtility.WorldToCanvasPoint(new Vector3(p[0].x, p[0].y, 0), canvas.canvasState),
                            CanvasUtility.WorldToCanvasPoint(new Vector3(p[1].x, p[1].y, 0), canvas.canvasState),
                            CanvasUtility.WorldToCanvasPoint(new Vector3(p[2].x, p[2].y, 0), canvas.canvasState),
                            CanvasUtility.WorldToCanvasPoint(new Vector3(p[3].x, p[3].y, 0), canvas.canvasState)
                        };
                    }

                    Handles.DrawAAPolyLine(10, pointsVector3.Length, pointsVector3);
                }
            }
        }