merge with trunk at r31523
[blender.git] / source / blender / editors / util / editmode_undo.c
index 290c8a64881c3616948095ebf955a43863873f08..564439a7bb34329d4d6b4d5a5155ee127ca93123 100644 (file)
@@ -89,8 +89,8 @@ typedef struct UndoElem {
        char name[MAXUNDONAME];
        void * (*getdata)(bContext *C);
        void (*freedata)(void *);
-       void (*to_editmode)(void *, void *);
-       void * (*from_editmode)(void *);
+       void (*to_editmode)(void *, void *, void *);
+       void * (*from_editmode)(void *, void *);
        int (*validate_undo)(void *, void *);
 } UndoElem;
 
@@ -100,10 +100,10 @@ static UndoElem *curundo= NULL;
 
 /* ********************* xtern api calls ************* */
 
-static void undo_restore(UndoElem *undo, void *editdata)
+static void undo_restore(UndoElem *undo, void *editdata, void *obdata)
 {
        if(undo) {
-               undo->to_editmode(undo->undodata, editdata);    
+               undo->to_editmode(undo->undodata, editdata, obdata);    
        }
 }
 
@@ -111,8 +111,8 @@ static void undo_restore(UndoElem *undo, void *editdata)
 void undo_editmode_push(bContext *C, char *name, 
                                                void * (*getdata)(bContext *C),
                                                void (*freedata)(void *), 
-                                               void (*to_editmode)(void *, void *),  
-                                               void *(*from_editmode)(void *),
+                                               void (*to_editmode)(void *, void *, void *),  
+                                               void *(*from_editmode)(void *, void *),
                                                int (*validate_undo)(void *, void *))
 {
        UndoElem *uel;
@@ -161,7 +161,7 @@ void undo_editmode_push(bContext *C, char *name,
        /* copy  */
        memused= MEM_get_memory_in_use();
        editdata= getdata(C);
-       curundo->undodata= curundo->from_editmode(editdata);
+       curundo->undodata= curundo->from_editmode(editdata, obedit->data);
        curundo->undosize= MEM_get_memory_in_use() - memused;
        curundo->ob= obedit;
        curundo->id= obedit->id;
@@ -241,7 +241,7 @@ void undo_editmode_step(bContext *C, int step)
        undo_clean_stack(C);
        
        if(step==0) {
-               undo_restore(curundo, curundo->getdata(C));
+               undo_restore(curundo, curundo->getdata(C), obedit->data);
        }
        else if(step==1) {
                
@@ -249,7 +249,7 @@ void undo_editmode_step(bContext *C, int step)
                else {
                        if(G.f & G_DEBUG) printf("undo %s\n", curundo->name);
                        curundo= curundo->prev;
-                       undo_restore(curundo, curundo->getdata(C));
+                       undo_restore(curundo, curundo->getdata(C), obedit->data);
                }
        }
        else {
@@ -257,7 +257,7 @@ void undo_editmode_step(bContext *C, int step)
                
                if(curundo==NULL || curundo->next==NULL) error("No more steps to redo");
                else {
-                       undo_restore(curundo->next, curundo->getdata(C));
+                       undo_restore(curundo->next, curundo->getdata(C), obedit->data);
                        curundo= curundo->next;
                        if(G.f & G_DEBUG) printf("redo %s\n", curundo->name);
                }
@@ -265,7 +265,7 @@ void undo_editmode_step(bContext *C, int step)
        
        /* special case for editmesh, mode must be copied back to the scene */
        if(obedit->type == OB_MESH) {
-               EM_selectmode_to_scene(CTX_data_scene(C), obedit);
+               EDBM_selectmode_to_scene(CTX_data_scene(C), obedit);
        }
 
        DAG_id_flush_update(&obedit->id, OB_RECALC_DATA);