- added support for MetaBall undo in edit mode (Ctrl-Z ... undo) (Ctrl-Y/Ctrl-Shift-Z ... redo)
This commit is contained in:
@@ -45,6 +45,8 @@ void deselectall_mball(void);
|
|||||||
void mouse_mball(void);
|
void mouse_mball(void);
|
||||||
void adduplicate_mball(void);
|
void adduplicate_mball(void);
|
||||||
void delete_mball(void);
|
void delete_mball(void);
|
||||||
|
void freeMetaElemlist(struct ListBase *lb);
|
||||||
|
void undo_push_mball(char *name);
|
||||||
|
|
||||||
#endif /* BDR_EDITMBALL_H */
|
#endif /* BDR_EDITMBALL_H */
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -57,6 +59,7 @@
|
|||||||
#include "BIF_screen.h"
|
#include "BIF_screen.h"
|
||||||
#include "BIF_toolbox.h"
|
#include "BIF_toolbox.h"
|
||||||
#include "BIF_space.h"
|
#include "BIF_space.h"
|
||||||
|
#include "BIF_editmode_undo.h"
|
||||||
|
|
||||||
#include "BDR_editobject.h"
|
#include "BDR_editobject.h"
|
||||||
#include "BDR_editmball.h"
|
#include "BDR_editmball.h"
|
||||||
@@ -207,6 +210,7 @@ void add_primitiveMball(int dummy_argument)
|
|||||||
|
|
||||||
allqueue(REDRAWALL, 0);
|
allqueue(REDRAWALL, 0);
|
||||||
makeDispList(G.obedit);
|
makeDispList(G.obedit);
|
||||||
|
BIF_undo_push("Add MetaElem");
|
||||||
}
|
}
|
||||||
|
|
||||||
void deselectall_mball()
|
void deselectall_mball()
|
||||||
@@ -229,6 +233,7 @@ void deselectall_mball()
|
|||||||
ml= ml->next;
|
ml= ml->next;
|
||||||
}
|
}
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
|
// BIF_undo_push("Deselect MetaElem");
|
||||||
}
|
}
|
||||||
|
|
||||||
void mouse_mball()
|
void mouse_mball()
|
||||||
@@ -304,6 +309,7 @@ void adduplicate_mball()
|
|||||||
allqueue(REDRAWBUTSEDIT, 0);
|
allqueue(REDRAWBUTSEDIT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Delete all selected MetaElems (not MetaBall) */
|
||||||
void delete_mball()
|
void delete_mball()
|
||||||
{
|
{
|
||||||
MetaElem *ml, *next;
|
MetaElem *ml, *next;
|
||||||
@@ -324,4 +330,87 @@ void delete_mball()
|
|||||||
makeDispList(G.obedit);
|
makeDispList(G.obedit);
|
||||||
allqueue(REDRAWVIEW3D, 0);
|
allqueue(REDRAWVIEW3D, 0);
|
||||||
allqueue(REDRAWBUTSEDIT, 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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -629,6 +629,8 @@ void BIF_undo_push(char *str)
|
|||||||
undo_push_mesh(str);
|
undo_push_mesh(str);
|
||||||
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
||||||
undo_push_curve(str);
|
undo_push_curve(str);
|
||||||
|
else if (G.obedit->type==OB_MBALL)
|
||||||
|
undo_push_mball(str);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(U.uiflag & USER_GLOBALUNDO)
|
if(U.uiflag & USER_GLOBALUNDO)
|
||||||
@@ -643,6 +645,8 @@ void BIF_undo(void)
|
|||||||
undo_editmode_step(1);
|
undo_editmode_step(1);
|
||||||
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
||||||
undo_editmode_step(1);
|
undo_editmode_step(1);
|
||||||
|
else if (G.obedit->type==OB_MBALL)
|
||||||
|
undo_editmode_step(1);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -665,6 +669,8 @@ void BIF_redo(void)
|
|||||||
undo_editmode_step(-1);
|
undo_editmode_step(-1);
|
||||||
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
||||||
undo_editmode_step(-1);
|
undo_editmode_step(-1);
|
||||||
|
else if (G.obedit->type==OB_MBALL)
|
||||||
|
undo_editmode_step(-1);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -687,6 +693,8 @@ void BIF_undo_menu(void)
|
|||||||
undo_editmode_menu();
|
undo_editmode_menu();
|
||||||
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
else if ELEM(G.obedit->type, OB_CURVE, OB_SURF)
|
||||||
undo_editmode_menu();
|
undo_editmode_menu();
|
||||||
|
else if (G.obedit->type==OB_MBALL)
|
||||||
|
undo_editmode_menu();
|
||||||
|
|
||||||
allqueue(REDRAWALL, 0);
|
allqueue(REDRAWALL, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user