private LW_Canvas CreateControlPointLine(int pointIndex, int handleIndex)
        {
            LW_Point2D point = points[pointIndex];
            Vector3    start = (vectorCanvas.transform.localToWorldMatrix * vectorCanvas.scaler).MultiplyPoint3x4(point.position);
            Vector3    end   = start;

            if (handleIndex < 0)
            {
                end += (vectorCanvas.scaler).MultiplyVector(point.handleIn);
            }
            else if (handleIndex > 0)
            {
                end += (vectorCanvas.scaler).MultiplyVector(point.handleOut);
            }
            LW_Canvas canvas = LW_Canvas.Create(vectorCanvas.gameObject, "ControlLine");
            LW_Line   line   = LW_Line.Create(start, end);
            LW_Stroke stroke = LW_Stroke.Create(Color.red, 2f);

            line.styles.Add(stroke);
            canvas.graphic.Add(line);

            canvas.featureMode      = FeatureMode.Advanced;
            canvas.joinsAndCapsMode = JoinsAndCapsMode.Shader;
            canvas.gradientsMode    = GradientsMode.Shader;
            canvas.antiAliasingMode = AntiAliasingMode.On;

            canvas.transform.position = Vector3.zero;

            //canvas.SetViewBoxToBounds();
            canvas.SetRectSizeToViewBox();
            //canvas.transform.position = start;

            return(canvas);
        }
        public void OnDragPoint(int pointIndex, int handleIndex, Vector3 newWorldPosition)
        {
            LW_Point2D point = points[pointIndex];

            if (handleIndex < 0)
            {
                point.handleIn = ((Vector2)(vectorCanvas.transform.localToWorldMatrix * vectorCanvas.scaler).inverse.MultiplyPoint3x4(newWorldPosition)) - point.position;
            }
            else if (handleIndex > 0)
            {
                point.handleOut = ((Vector2)(vectorCanvas.transform.localToWorldMatrix * vectorCanvas.scaler).inverse.MultiplyPoint3x4(newWorldPosition)) - point.position;
            }
            else
            {
                point.position = (vectorCanvas.transform.localToWorldMatrix * vectorCanvas.scaler).inverse.MultiplyPoint3x4(newWorldPosition);
            }
            points[pointIndex] = point;

            ControlPoint controlPoint = controlPoints[pointIndex];
            Vector3      position     = (vectorCanvas.transform.localToWorldMatrix * vectorCanvas.scaler).MultiplyPoint3x4(point.position);

            if (point.hasHandleIn)
            {
                Vector3 handleInPos = position + (vectorCanvas.transform.localToWorldMatrix * vectorCanvas.scaler).MultiplyVector(point.handleIn);
                //Debug.Log("HandleInPos: " + handleInPos + " newWorldPos: " + newWorldPosition);
                if (controlPoint.handleInDot != null)
                {
                    controlPoint.handleInDot.transform.position = handleInPos;
                }
                if (controlPoint.handleInLine != null)
                {
                    LW_Line line = controlPoint.handleInLine.graphic[0] as LW_Line;
                    line.Set(position, handleInPos);
                }
            }
            if (point.hasHandleOut)
            {
                Vector3 handleOutPos = position + (vectorCanvas.transform.localToWorldMatrix * vectorCanvas.scaler).MultiplyVector(point.handleOut);
                if (controlPoint.handleOutDot != null)
                {
                    controlPoint.handleOutDot.transform.position = handleOutPos;
                }
                if (controlPoint.handleOutLine != null)
                {
                    LW_Line line = controlPoint.handleOutLine.graphic[0] as LW_Line;
                    line.Set(position, handleOutPos);
                }
            }
            if (controlPoint.positionDot != null)
            {
                controlPoint.positionDot.transform.position = position;
            }

            path.points = points;
        }