- added support for MetaBall undo in edit mode (Ctrl-Z ... undo) (Ctrl-Y/Ctrl-Shift...
authorJiri Hnidek <jiri.hnidek@tul.cz>
Wed, 29 Sep 2004 22:28:14 +0000 (22:28 +0000)
committerJiri Hnidek <jiri.hnidek@tul.cz>
Wed, 29 Sep 2004 22:28:14 +0000 (22:28 +0000)
source/blender/include/BDR_editmball.h
source/blender/src/editmball.c
source/blender/src/space.c

index 27dc5f651c9ad4b641b6a96757031dfa812fb56b..71bc598042adbe74cd4274d480d5b1b55f5b323d 100644 (file)
@@ -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 */
 
index 32ef9cacb543e36f94f0639030aaaf949ed3d9be..609fc1667641e18c1ef4adb9b39ecd84754d0077 100644 (file)
@@ -30,6 +30,8 @@
  * ***** END GPL/BL DUAL LICENSE BLOCK *****
  */
 
+#include <string.h>
+
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #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);
 }
index 20822d5ee962eb935489a7f2f2e4ed70fd7fff07..474c74b425faf595d24142ee3b33e182a898c497 100644 (file)
@@ -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);
        }