diff options
Diffstat (limited to 'source/blender/editors/curve')
-rw-r--r-- | source/blender/editors/curve/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/curve/curve_intern.h | 5 | ||||
-rw-r--r-- | source/blender/editors/curve/editcurve.c | 127 | ||||
-rw-r--r-- | source/blender/editors/curve/editcurve_undo.c | 163 |
4 files changed, 171 insertions, 125 deletions
diff --git a/source/blender/editors/curve/CMakeLists.txt b/source/blender/editors/curve/CMakeLists.txt index 2f5b2ab6e87..13f12f62d95 100644 --- a/source/blender/editors/curve/CMakeLists.txt +++ b/source/blender/editors/curve/CMakeLists.txt @@ -42,6 +42,7 @@ set(SRC editcurve_add.c editcurve_paint.c editcurve_select.c + editcurve_undo.c editfont.c editfont_undo.c diff --git a/source/blender/editors/curve/curve_intern.h b/source/blender/editors/curve/curve_intern.h index bf1e22ae170..020d34f2767 100644 --- a/source/blender/editors/curve/curve_intern.h +++ b/source/blender/editors/curve/curve_intern.h @@ -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); diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c index 86a7c58972e..0dbe526117c 100644 --- a/source/blender/editors/curve/editcurve.c +++ b/source/blender/editors/curve/editcurve.c @@ -81,16 +81,6 @@ #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 index 00000000000..f8f96eb3bc9 --- /dev/null +++ b/source/blender/editors/curve/editcurve_undo.c @@ -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); +} |