public static void Straighten()
        {
            GameObject   selected  = Selection.activeObject as GameObject;
            ControlPoint ctrlPoint = selected.GetComponent <ControlPoint>();
            MeshDeformer deformer  = selected.GetComponentInParent <MeshDeformer>();
            int          index     = 0;

            if (ctrlPoint == null)
            {
                Scaffold scaffold = selected.GetComponent <Scaffold>();
                for (int i = 0; i < deformer.Scaffolds.Length; ++i)
                {
                    if (deformer.Scaffolds[i].Obj == scaffold)
                    {
                        index = deformer.Scaffolds[i].CurveIndices.Min() * 3 + 1;
                        break;
                    }
                }
            }
            else
            {
                index = ctrlPoint.Index;
            }


            Undo.RecordObject(deformer, "Battlehub.MeshDeformer.Straighten");
            MeshDeformerEditor.RecordScaffolds(deformer, "Battlehub.MeshDeformer.Straighten");
            EditorUtility.SetDirty(deformer);
            deformer.Straighten(index);
        }
        private static void SetMode(GameObject selected, bool isRigid, ControlPointMode mode)
        {
            MeshDeformer meshDeformer = selected.GetComponentInParent <MeshDeformer>();

            if (meshDeformer == null)
            {
                return;
            }
            Scaffold     selectedScaffold     = selected.GetComponent <Scaffold>();
            ControlPoint selectedControlPoint = selected.GetComponent <ControlPoint>();


            Undo.RecordObject(meshDeformer, "Battlehub.MeshDeformer.SetMode");
            MeshDeformerEditor.RecordScaffolds(meshDeformer, "Battlehub.MeshDeformer.SetMode");
            EditorUtility.SetDirty(meshDeformer);

            if (selectedScaffold != null && selectedScaffold.gameObject != meshDeformer.gameObject)
            {
                ScaffoldWrapper scaffold = meshDeformer.Scaffolds.Where(s => s.Obj == selectedScaffold).FirstOrDefault();
                if (scaffold != null)
                {
                    for (int i = 0; i < scaffold.CurveIndices.Length; ++i)
                    {
                        int curveIndex = scaffold.CurveIndices[i];
                        if (mode == ControlPointMode.Free)
                        {
                            meshDeformer.SetIsRigid(curveIndex * 3, isRigid);
                        }

                        if (!isRigid)
                        {
                            meshDeformer.SetControlPointMode(curveIndex * 3, mode);
                            meshDeformer.SetControlPointMode(curveIndex * 3 + 3, mode);
                        }
                    }
                }
                else
                {
                    Debug.LogError("scaffold not found");
                }
            }
            else if (selectedControlPoint != null)
            {
                if (mode == ControlPointMode.Free)
                {
                    meshDeformer.SetIsRigid(selectedControlPoint.Index, isRigid);
                }

                if (!isRigid)
                {
                    meshDeformer.SetControlPointMode(selectedControlPoint.Index, mode);
                }
            }
            else
            {
                MeshDeformerEditor.SetMode(meshDeformer, mode, isRigid);
            }
        }
        public static void Fit()
        {
            GameObject selected = Selection.activeObject as GameObject;
            SplineBase spline   = selected.GetComponentInParent <SplineBase>();

            if (spline is MeshDeformer)
            {
                MeshDeformer deformer = (MeshDeformer)spline;
                Undo.RecordObject(deformer, "Battlehub.MeshDeformer.Fit");
                MeshDeformerEditor.RecordScaffolds(deformer, "Battlehub.MeshDeformer.Fit");
                EditorUtility.SetDirty(deformer);
            }
            else
            {
                Undo.RecordObject(spline, "Battlehub.MeshDeformer.Fit");
                EditorUtility.SetDirty(spline);
            }


            spline.Smooth();
        }
        public static void Remove()
        {
            GameObject   selected  = Selection.activeObject as GameObject;
            ControlPoint ctrlPoint = selected.GetComponent <ControlPoint>();
            MeshDeformer deformer  = selected.GetComponentInParent <MeshDeformer>();

            Selection.activeGameObject = deformer.gameObject;

            Undo.RecordObject(deformer, "Battlehub.MeshDeformer.Remove");
            MeshDeformerEditor.RecordScaffolds(deformer, "Battlehub.MeshDeformer.Remove");

            GameObject removeObject;

            deformer.Remove((ctrlPoint.Index - 1) / 3, out removeObject);
            if (removeObject != null)
            {
                Undo.DestroyObjectImmediate(removeObject);
            }

            EditorUtility.SetDirty(deformer);
        }