public static void CreateXSpline()
    {
        GameObject       go     = new GameObject("XSpline");
        XSplineComponent spcomp = go.AddComponent <XSplineComponent>();

        spcomp.Spline.AppendPoint(Vector3.zero, XSpline.BezierPointType.Smooth, Vector3.zero, Vector3.zero);

        spcomp.Spline.AppendPoint(spcomp.Spline.mPoints[spcomp.Spline.mPoints.Count - 1].mPoint + Vector3.right, XSpline.BezierPointType.Smooth, Vector3.zero, Vector3.zero);


        spcomp.Spline.Build();
        spcomp.RefreshElements();
    }
    void OnSceneGUI()
    {
        if (mSplinecomp != null)
        {
            bool  selected = false;
            float hsize;

            Vector3 pPrev, pNext, pPos = Vector3.zero;

            EditorGUI.BeginChangeCheck();

            Handles.matrix = mSplinecomp.transform.localToWorldMatrix;

            mEdithelper.Reset();
            while (mEdithelper.MoveNext())
            {
                hsize = HandleUtility.GetHandleSize(mEdithelper.Point.mPoint) * 1f;

                if (Handles.Button(mEdithelper.Point.mPoint, Quaternion.identity, hsize * mPointSize, hsize * mPointSize, DrawPoint))
                {
                    mEdithelper.Selected = true;
                    selected             = true;
                }



                bool  isKeydown = false;
                Event e         = Event.current;
                Tools.hidden = false;
                if (e.alt || e.shift || e.control)
                {
                    isKeydown    = true;
                    Tools.hidden = true;
                }

                if (mEdithelper.Selected && !isKeydown)
                {
                    Handles.ArrowCap(0, mEdithelper.SelectedPoint.mPoint, Quaternion.LookRotation(Vector3.up), HandleUtility.GetHandleSize(mEdithelper.SelectedPoint.mPoint));

                    if (mSpline.InterpolateType == XSpline.SplineType.Bezier && mEdithelper.SelectedPoint.mBezierType != XSpline.BezierPointType.Smooth)
                    {
                        Handles.color = new Color(1, 1, 0, 1);
                        Handles.DrawLine(mEdithelper.SelectedPoint.mPoint, mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mPrevctrl);
                        Handles.DrawLine(mEdithelper.SelectedPoint.mPoint, mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mNextctrl);

                        Handles.color = Color.green;
                        Handles.DotCap(0, mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mPrevctrl, Tools.handleRotation, hsize * mPointSize);
                        Handles.DotCap(0, mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mNextctrl, Tools.handleRotation, hsize * mPointSize);

                        pPrev = Handles.PositionHandle(mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mPrevctrl, Tools.handleRotation);
                        pNext = Handles.PositionHandle(mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mNextctrl, Tools.handleRotation);

                        bool chgOut = (mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mPrevctrl) != pPrev;
                        bool chgIn  = (mEdithelper.SelectedPoint.mPoint + mEdithelper.SelectedPoint.mNextctrl) != pNext;

                        if (chgOut || chgIn)
                        {
                            if (chgOut)
                            {
                                mEdithelper.SelectedPoint.mPrevctrl = pPrev - mEdithelper.SelectedPoint.mPoint;
                                if (mEdithelper.SelectedPoint.mBezierType != XSpline.BezierPointType.BezierCorner)
                                {
                                    mEdithelper.SelectedPoint.mNextctrl = -mEdithelper.SelectedPoint.mPrevctrl;
                                }
                            }
                            if (chgIn)
                            {
                                mEdithelper.SelectedPoint.mNextctrl = pNext - mEdithelper.SelectedPoint.mPoint;
                                if (mEdithelper.SelectedPoint.mBezierType != XSpline.BezierPointType.BezierCorner)
                                {
                                    mEdithelper.SelectedPoint.mPrevctrl = -mEdithelper.SelectedPoint.mNextctrl;
                                }
                            }
                        }
                    }

                    //handle point pos
                    pPos = Handles.PositionHandle(mEdithelper.SelectedPoint.mPoint, Tools.handleRotation);
                    if (mEdithelper.SelectedPoint.mPoint != pPos)
                    {
                        mEdithelper.SelectedPoint.mPoint = pPos;
                    }
                }
            }

            if (EditorGUI.EndChangeCheck())
            {
            }

            if (GUI.changed)
            {
                mSpline.Build();
                mSplinecomp.RefreshElements();
                EditorUtility.SetDirty(mSplinecomp);
                Repaint();
            }
            if (selected)
            {
                Repaint();
                SceneView.RepaintAll();
                GUIUtility.keyboardControl = 0;
            }
        }
    }