private void OnEnable()
        {
            m_SpriteShapeProp  = serializedObject.FindProperty("m_SpriteShape");
            m_SplineDetailProp = serializedObject.FindProperty("m_SplineDetail");
            m_IsOpenEndedProp  = serializedObject.FindProperty("m_Spline").FindPropertyRelative("m_IsOpenEnded");
            m_AdaptiveUVProp   = serializedObject.FindProperty("m_AdaptiveUV");

            m_ColliderAutoUpdate     = serializedObject.FindProperty("m_UpdateCollider");
            m_ColliderDetailProp     = serializedObject.FindProperty("m_ColliderDetail");
            m_ColliderOffsetProp     = serializedObject.FindProperty("m_ColliderOffset");
            m_ColliderCornerTypeProp = serializedObject.FindProperty("m_ColliderCornerType");

            if (m_SpriteShapeController.spriteShapeRenderer)
            {
                m_MeshRendererSO   = new SerializedObject(m_SpriteShapeController.spriteShapeRenderer);
                m_SortingLayerProp = m_MeshRendererSO.FindProperty("m_SortingLayerID");
                m_SortingOrderProp = m_MeshRendererSO.FindProperty("m_SortingOrder");
            }

            m_SplineEditor      = new SplineEditor(this, m_SpriteShapeController.spriteShape);
            m_SplineSceneEditor = new SplineSceneEditor(m_SpriteShapeController.spline, this, m_SpriteShapeController);

            EditMode.onEditModeStartDelegate += OnEditModeStart;
            EditMode.onEditModeEndDelegate   += OnEditModeEnd;
        }
        private void SetupSpriteShapeEditor(Spline spline)
        {
            m_Spline       = spline;
            m_SplineEditor = new SplineEditor()
            {
                //Data
                GetLocalPosition    = i => spline.GetPosition(i),
                GetPosition         = i => LocalToWorld(spline.GetPosition(i)),
                SetPosition         = (i, p) => spline.SetPosition(i, WorldToLocal(p)),
                GetLeftTangent      = i => LocalToWorld(spline.GetLeftTangent(i) + spline.GetPosition(i)) - LocalToWorld(spline.GetPosition(i)),
                SetLeftTangent      = (i, p) => spline.SetLeftTangent(i, WorldToLocal(p + LocalToWorld(spline.GetPosition(i))) - spline.GetPosition(i)),
                GetRightTangent     = i => LocalToWorld(spline.GetRightTangent(i) + spline.GetPosition(i)) - LocalToWorld(spline.GetPosition(i)),
                SetRightTangent     = (i, p) => spline.SetRightTangent(i, WorldToLocal(p + LocalToWorld(spline.GetPosition(i))) - spline.GetPosition(i)),
                GetTangentMode      = i => (SplineEditor.TangentMode)spline.GetTangentMode(i),
                SetTangentMode      = (i, m) => spline.SetTangentMode(i, (ShapeTangentMode)m),
                InsertPointAt       = (i, p) => spline.InsertPointAt(i, WorldToLocal(p)),
                RemovePointAt       = i => spline.RemovePointAt(i),
                GetPointCount       = () => spline.GetPointCount(),
                GetSubDivisionCount = () => GetSplineDetail(),
                // Transforms
                ScreenToWorld      = (p) => ScreenToWorld(p),
                LocalToWorldMatrix = () => Matrix4x4.identity,
                WorldToScreen      = (p) => HandleUtility.WorldToGUIPoint(p),
                GetForwardVector   = () => GetTransform().forward,
                GetUpVector        = () => GetTransform().up,
                GetRightVector     = () => GetTransform().right,
                // Other
                GetSpriteIndex = (i) => spline.GetSpriteIndex(i),
                SetSpriteIndex = (s, i) => spline.SetSpriteIndex(s, i),
                Snap           = (p) => SnapPoint(p),
                RegisterUndo   = RegisterUndo,
                OpenEnded      = () => spline.isOpenEnded,
                Repaint        = () => { UnityEditorInternal.InternalEditorUtility.RepaintAllViews(); }
            };

            m_SplineEditor.UpdateTangentCache();
        }
 private void InvalidateShapeEditor()
 {
     m_SplineEditor = null;
     m_Spline       = null;
     SplineEditorCache.SetTarget(null);
 }