Cleanup: move curve undo into own file
authorCampbell Barton <ideasman42@gmail.com>
Mon, 19 Mar 2018 15:30:53 +0000 (16:30 +0100)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 19 Mar 2018 15:30:53 +0000 (16:30 +0100)
source/blender/editors/curve/CMakeLists.txt
source/blender/editors/curve/curve_intern.h
source/blender/editors/curve/editcurve.c
source/blender/editors/curve/editcurve_undo.c [new file with mode: 0644]
source/blender/editors/include/ED_curve.h

index 2f5b2ab..13f12f6 100644 (file)
@@ -42,6 +42,7 @@ set(SRC
        editcurve_add.c
        editcurve_paint.c
        editcurve_select.c
+       editcurve_undo.c
        editfont.c
        editfont_undo.c
 
index bf1e22a..020d34f 100644 (file)
@@ -35,6 +35,7 @@
 /* internal exports only */
 struct ListBase;
 struct EditNurb;
+struct GHash;
 struct Object;
 struct wmOperatorType;
 struct ViewContext;
@@ -129,6 +130,10 @@ void CURVE_OT_cyclic_toggle(struct wmOperatorType *ot);
 
 void CURVE_OT_match_texture_space(struct wmOperatorType *ot);
 
+/* exported for editcurve_undo.c */
+struct GHash *ED_curve_keyindex_hash_duplicate(struct GHash *keyindex);
+void          ED_curve_keyindex_update_nurb(struct EditNurb *editnurb, struct Nurb *nu, struct Nurb *newnu);
+
 bool ED_curve_pick_vert(
         struct ViewContext *vc, short sel, const int mval[2],
         struct Nurb **r_nurb, struct BezTriple **r_bezt, struct BPoint **r_bp, short *r_handle);
index 86a7c58..0dbe526 100644 (file)
 #include "RNA_define.h"
 #include "RNA_enum_types.h"
 
-/* Undo stuff */
-typedef struct {
-       ListBase nubase;
-       int actvert;
-       GHash *undoIndex;
-       ListBase fcurves, drivers;
-       int actnu;
-       int flag;
-} UndoCurve;
-
 void selectend_nurb(Object *obedit, enum eEndPoint_Types selfirst, bool doswap, bool selstatus);
 static void adduplicateflagNurb(Object *obedit, ListBase *newnurb, const short flag, const bool split);
 static int curve_delete_segments(Object *obedit, const bool split);
@@ -343,7 +333,7 @@ static void keyIndex_updateBP(EditNurb *editnurb, BPoint *bp,
        keyIndex_updateCV(editnurb, (char *)bp, (char *)newbp, count, sizeof(BPoint));
 }
 
-static void keyIndex_updateNurb(EditNurb *editnurb, Nurb *nu, Nurb *newnu)
+void ED_curve_keyindex_update_nurb(EditNurb *editnurb, Nurb *nu, Nurb *newnu)
 {
        if (nu->bezt) {
                keyIndex_updateBezt(editnurb, nu->bezt, newnu->bezt, newnu->pntsu);
@@ -522,7 +512,7 @@ static void keyData_switchDirectionNurb(Curve *cu, Nurb *nu)
                switch_keys_direction(cu, nu);
 }
 
-static GHash *dupli_keyIndexHash(GHash *keyindex)
+GHash *ED_curve_keyindex_hash_duplicate(GHash *keyindex)
 {
        GHash *gh;
        GHashIterator gh_iter;
@@ -6198,119 +6188,6 @@ void CURVE_OT_tilt_clear(wmOperatorType *ot)
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
 }
 
-/****************** undo for curves ****************/
-
-static void undoCurve_to_editCurve(void *ucu, void *UNUSED(edata), void *cu_v)
-{
-       Curve *cu = cu_v;
-       UndoCurve *undoCurve = ucu;
-       ListBase *undobase = &undoCurve->nubase;
-       ListBase *editbase = BKE_curve_editNurbs_get(cu);
-       Nurb *nu, *newnu;
-       EditNurb *editnurb = cu->editnurb;
-       AnimData *ad = BKE_animdata_from_id(&cu->id);
-
-       BKE_nurbList_free(editbase);
-
-       if (undoCurve->undoIndex) {
-               BKE_curve_editNurb_keyIndex_free(&editnurb->keyindex);
-               editnurb->keyindex = dupli_keyIndexHash(undoCurve->undoIndex);
-       }
-
-       if (ad) {
-               if (ad->action) {
-                       free_fcurves(&ad->action->curves);
-                       copy_fcurves(&ad->action->curves, &undoCurve->fcurves);
-               }
-
-               free_fcurves(&ad->drivers);
-               copy_fcurves(&ad->drivers, &undoCurve->drivers);
-       }
-
-       /* copy  */
-       for (nu = undobase->first; nu; nu = nu->next) {
-               newnu = BKE_nurb_duplicate(nu);
-
-               if (editnurb->keyindex) {
-                       keyIndex_updateNurb(editnurb, nu, newnu);
-               }
-
-               BLI_addtail(editbase, newnu);
-       }
-
-       cu->actvert = undoCurve->actvert;
-       cu->actnu = undoCurve->actnu;
-       cu->flag = undoCurve->flag;
-       ED_curve_updateAnimPaths(cu);
-}
-
-static void *editCurve_to_undoCurve(void *UNUSED(edata), void *cu_v)
-{
-       Curve *cu = cu_v;
-       ListBase *nubase = BKE_curve_editNurbs_get(cu);
-       UndoCurve *undoCurve;
-       EditNurb *editnurb = cu->editnurb, tmpEditnurb;
-       Nurb *nu, *newnu;
-       AnimData *ad = BKE_animdata_from_id(&cu->id);
-
-       undoCurve = MEM_callocN(sizeof(UndoCurve), "undoCurve");
-
-       if (editnurb->keyindex) {
-               undoCurve->undoIndex = dupli_keyIndexHash(editnurb->keyindex);
-               tmpEditnurb.keyindex = undoCurve->undoIndex;
-       }
-
-       if (ad) {
-               if (ad->action)
-                       copy_fcurves(&undoCurve->fcurves, &ad->action->curves);
-
-               copy_fcurves(&undoCurve->drivers, &ad->drivers);
-       }
-
-       /* copy  */
-       for (nu = nubase->first; nu; nu = nu->next) {
-               newnu = BKE_nurb_duplicate(nu);
-
-               if (undoCurve->undoIndex) {
-                       keyIndex_updateNurb(&tmpEditnurb, nu, newnu);
-               }
-
-               BLI_addtail(&undoCurve->nubase, newnu);
-       }
-
-       undoCurve->actvert = cu->actvert;
-       undoCurve->actnu = cu->actnu;
-       undoCurve->flag = cu->flag;
-
-       return undoCurve;
-}
-
-static void free_undoCurve(void *ucv)
-{
-       UndoCurve *undoCurve = ucv;
-
-       BKE_nurbList_free(&undoCurve->nubase);
-
-       BKE_curve_editNurb_keyIndex_free(&undoCurve->undoIndex);
-
-       free_fcurves(&undoCurve->fcurves);
-       free_fcurves(&undoCurve->drivers);
-
-       MEM_freeN(undoCurve);
-}
-
-static void *get_data(bContext *C)
-{
-       Object *obedit = CTX_data_edit_object(C);
-       return obedit;
-}
-
-/* and this is all the undo system needs to know */
-void undo_push_curve(bContext *C, const char *name)
-{
-       undo_editmode_push(C, name, get_data, free_undoCurve, undoCurve_to_editCurve, editCurve_to_undoCurve, NULL);
-}
-
 void ED_curve_beztcpy(EditNurb *editnurb, BezTriple *dst, BezTriple *src, int count)
 {
        memcpy(dst, src, count * sizeof(BezTriple));
diff --git a/source/blender/editors/curve/editcurve_undo.c b/source/blender/editors/curve/editcurve_undo.c
new file mode 100644 (file)
index 0000000..f8f96eb
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/curve/editcurve_undo.c
+ *  \ingroup edcurve
+ */
+
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_anim_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_ghash.h"
+
+#include "BKE_context.h"
+#include "BKE_curve.h"
+#include "BKE_fcurve.h"
+#include "BKE_library.h"
+#include "BKE_animsys.h"
+
+#include "ED_util.h"
+#include "ED_curve.h"
+
+#include "curve_intern.h"
+
+typedef struct {
+       ListBase nubase;
+       int actvert;
+       GHash *undoIndex;
+       ListBase fcurves, drivers;
+       int actnu;
+       int flag;
+} UndoCurve;
+
+static void undoCurve_to_editCurve(void *ucu, void *UNUSED(edata), void *cu_v)
+{
+       Curve *cu = cu_v;
+       UndoCurve *undoCurve = ucu;
+       ListBase *undobase = &undoCurve->nubase;
+       ListBase *editbase = BKE_curve_editNurbs_get(cu);
+       Nurb *nu, *newnu;
+       EditNurb *editnurb = cu->editnurb;
+       AnimData *ad = BKE_animdata_from_id(&cu->id);
+
+       BKE_nurbList_free(editbase);
+
+       if (undoCurve->undoIndex) {
+               BKE_curve_editNurb_keyIndex_free(&editnurb->keyindex);
+               editnurb->keyindex = ED_curve_keyindex_hash_duplicate(undoCurve->undoIndex);
+       }
+
+       if (ad) {
+               if (ad->action) {
+                       free_fcurves(&ad->action->curves);
+                       copy_fcurves(&ad->action->curves, &undoCurve->fcurves);
+               }
+
+               free_fcurves(&ad->drivers);
+               copy_fcurves(&ad->drivers, &undoCurve->drivers);
+       }
+
+       /* copy  */
+       for (nu = undobase->first; nu; nu = nu->next) {
+               newnu = BKE_nurb_duplicate(nu);
+
+               if (editnurb->keyindex) {
+                       ED_curve_keyindex_update_nurb(editnurb, nu, newnu);
+               }
+
+               BLI_addtail(editbase, newnu);
+       }
+
+       cu->actvert = undoCurve->actvert;
+       cu->actnu = undoCurve->actnu;
+       cu->flag = undoCurve->flag;
+       ED_curve_updateAnimPaths(cu);
+}
+
+static void *editCurve_to_undoCurve(void *UNUSED(edata), void *cu_v)
+{
+       Curve *cu = cu_v;
+       ListBase *nubase = BKE_curve_editNurbs_get(cu);
+       UndoCurve *undoCurve;
+       EditNurb *editnurb = cu->editnurb, tmpEditnurb;
+       Nurb *nu, *newnu;
+       AnimData *ad = BKE_animdata_from_id(&cu->id);
+
+       undoCurve = MEM_callocN(sizeof(UndoCurve), "undoCurve");
+
+       if (editnurb->keyindex) {
+               undoCurve->undoIndex = ED_curve_keyindex_hash_duplicate(editnurb->keyindex);
+               tmpEditnurb.keyindex = undoCurve->undoIndex;
+       }
+
+       if (ad) {
+               if (ad->action)
+                       copy_fcurves(&undoCurve->fcurves, &ad->action->curves);
+
+               copy_fcurves(&undoCurve->drivers, &ad->drivers);
+       }
+
+       /* copy  */
+       for (nu = nubase->first; nu; nu = nu->next) {
+               newnu = BKE_nurb_duplicate(nu);
+
+               if (undoCurve->undoIndex) {
+                       ED_curve_keyindex_update_nurb(&tmpEditnurb, nu, newnu);
+               }
+
+               BLI_addtail(&undoCurve->nubase, newnu);
+       }
+
+       undoCurve->actvert = cu->actvert;
+       undoCurve->actnu = cu->actnu;
+       undoCurve->flag = cu->flag;
+
+       return undoCurve;
+}
+
+static void free_undoCurve(void *ucv)
+{
+       UndoCurve *undoCurve = ucv;
+
+       BKE_nurbList_free(&undoCurve->nubase);
+
+       BKE_curve_editNurb_keyIndex_free(&undoCurve->undoIndex);
+
+       free_fcurves(&undoCurve->fcurves);
+       free_fcurves(&undoCurve->drivers);
+
+       MEM_freeN(undoCurve);
+}
+
+static void *get_data(bContext *C)
+{
+       Object *obedit = CTX_data_edit_object(C);
+       return obedit;
+}
+
+/* and this is all the undo system needs to know */
+void undo_push_curve(bContext *C, const char *name)
+{
+       undo_editmode_push(C, name, get_data, free_undoCurve, undoCurve_to_editCurve, editCurve_to_undoCurve, NULL);
+}
index 859d45e..d45e52d 100644 (file)
@@ -48,7 +48,6 @@ void    ED_operatormacros_curve(void);
 void    ED_keymap_curve(struct wmKeyConfig *keyconf);
 
 /* editcurve.c */
-void    undo_push_curve(struct bContext *C, const char *name);
 ListBase *object_editcurve_get(struct Object *ob);
 
 void    ED_curve_editnurb_load(struct Object *obedit);
@@ -72,6 +71,9 @@ void ED_curve_deselect_all(struct EditNurb *editnurb);
 void ED_curve_select_all(struct EditNurb *editnurb);
 void ED_curve_select_swap(struct EditNurb *editnurb, bool hide_handles);
 
+/* editcurve_undo.c */
+void undo_push_curve(struct bContext *C, const char *name);
+
 /* editfont.c */
 void    ED_curve_editfont_load(struct Object *obedit);
 void    ED_curve_editfont_make(struct Object *obedit);