diff --git a/source/blender/include/BDR_editmball.h b/source/blender/include/BDR_editmball.h index 27dc5f651c9..71bc598042a 100644 --- a/source/blender/include/BDR_editmball.h +++ b/source/blender/include/BDR_editmball.h @@ -45,6 +45,8 @@ void deselectall_mball(void); void mouse_mball(void); void adduplicate_mball(void); void delete_mball(void); +void freeMetaElemlist(struct ListBase *lb); +void undo_push_mball(char *name); #endif /* BDR_EDITMBALL_H */ diff --git a/source/blender/src/editmball.c b/source/blender/src/editmball.c index 32ef9cacb54..609fc166764 100644 --- a/source/blender/src/editmball.c +++ b/source/blender/src/editmball.c @@ -30,6 +30,8 @@ * ***** END GPL/BL DUAL LICENSE BLOCK ***** */ +#include + #ifdef HAVE_CONFIG_H #include #endif @@ -57,6 +59,7 @@ #include "BIF_screen.h" #include "BIF_toolbox.h" #include "BIF_space.h" +#include "BIF_editmode_undo.h" #include "BDR_editobject.h" #include "BDR_editmball.h" @@ -207,6 +210,7 @@ void add_primitiveMball(int dummy_argument) allqueue(REDRAWALL, 0); makeDispList(G.obedit); + BIF_undo_push("Add MetaElem"); } void deselectall_mball() @@ -229,6 +233,7 @@ void deselectall_mball() ml= ml->next; } allqueue(REDRAWVIEW3D, 0); +// BIF_undo_push("Deselect MetaElem"); } void mouse_mball() @@ -304,6 +309,7 @@ void adduplicate_mball() allqueue(REDRAWBUTSEDIT, 0); } +/* Delete all selected MetaElems (not MetaBall) */ void delete_mball() { MetaElem *ml, *next; @@ -324,4 +330,87 @@ void delete_mball() makeDispList(G.obedit); allqueue(REDRAWVIEW3D, 0); allqueue(REDRAWBUTSEDIT, 0); + + BIF_undo_push("Delete MetaElem"); +} + +/* free all MetaElems from ListBase */ +void freeMetaElemlist(ListBase *lb) +{ + MetaElem *ml, *next; + + if(lb==NULL) return; + + ml= lb->first; + while(ml){ + next= ml->next; + BLI_remlink(lb, ml); + MEM_freeN(ml); + ml= next; + } + + lb->first= lb->last= NULL; + +} + +/* ************* undo for MetaBalls ************* */ + +static void undoMball_to_editMball(void *lbv) +{ + ListBase *lb= lbv; + MetaElem *ml, *newml; + unsigned int nr, lastmlnr= 0; + + /* we try to restore lastelem, which used in for example in button window */ + for(ml= editelems.first; ml; ml= ml->next, lastmlnr++) + if(lastelem==ml) break; + + freeMetaElemlist(&editelems); + + /* copy 'undo' MetaElems to 'edit' MetaElems */ + ml= lb->first; + while(ml){ + newml= MEM_dupallocN(ml); + BLI_addtail(&editelems, newml); + ml= ml->next; + } + + for(nr=0, lastelem= editelems.first; lastelem; lastelem= lastelem->next, nr++) + if(nr==lastmlnr) break; + +} + +static void *editMball_to_undoMball(void) +{ + ListBase *lb; + MetaElem *ml, *newml; + + /* allocate memory for undo ListBase */ + lb= MEM_callocN(sizeof(ListBase), "listbase undo"); + lb->first= lb->last= NULL; + + /* copy contents of current ListBase to the undo ListBase */ + ml= editelems.first; + while(ml){ + newml= MEM_dupallocN(ml); + BLI_addtail(lb, newml); + ml= ml->next; + } + + return lb; +} + +/* free undo ListBase of MetaElems */ +static void free_undoMball(void *lbv) +{ + ListBase *lb= lbv; + + freeMetaElemlist(lb); + MEM_freeN(lb); +} + +/* this is undo system for MetaBalls */ +void undo_push_mball(char *name) +{ + undo_editmode_push(name, free_undoMball, undoMball_to_editMball, editMball_to_undoMball); } diff --git a/source/blender/src/space.c b/source/blender/src/space.c index 20822d5ee96..474c74b425f 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -629,6 +629,8 @@ void BIF_undo_push(char *str) undo_push_mesh(str); else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) undo_push_curve(str); + else if (G.obedit->type==OB_MBALL) + undo_push_mball(str); } else { if(U.uiflag & USER_GLOBALUNDO) @@ -643,6 +645,8 @@ void BIF_undo(void) undo_editmode_step(1); else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) undo_editmode_step(1); + else if (G.obedit->type==OB_MBALL) + undo_editmode_step(1); } else { @@ -665,6 +669,8 @@ void BIF_redo(void) undo_editmode_step(-1); else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) undo_editmode_step(-1); + else if (G.obedit->type==OB_MBALL) + undo_editmode_step(-1); } else { @@ -687,6 +693,8 @@ void BIF_undo_menu(void) undo_editmode_menu(); else if ELEM(G.obedit->type, OB_CURVE, OB_SURF) undo_editmode_menu(); + else if (G.obedit->type==OB_MBALL) + undo_editmode_menu(); allqueue(REDRAWALL, 0); }