Revision: 30656 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=30656 Author: blendix Date: 2010-07-23 16:46:31 +0200 (Fri, 23 Jul 2010)
Log Message: ----------- Fix #21028: operator redo creates hundreds of images when texture paint is on. Now operator redo will look for an undo push with the same name in both the paint/sculpt and global undo stack. Modified Paths: -------------- trunk/blender/source/blender/editors/include/ED_sculpt.h trunk/blender/source/blender/editors/sculpt_paint/paint_image.c trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c trunk/blender/source/blender/editors/space_view3d/view3d_draw.c trunk/blender/source/blender/editors/util/undo.c Modified: trunk/blender/source/blender/editors/include/ED_sculpt.h =================================================================== --- trunk/blender/source/blender/editors/include/ED_sculpt.h 2010-07-23 14:35:23 UTC (rev 30655) +++ trunk/blender/source/blender/editors/include/ED_sculpt.h 2010-07-23 14:46:31 UTC (rev 30656) @@ -49,7 +49,7 @@ #define UNDO_PAINT_IMAGE 0 #define UNDO_PAINT_MESH 1 -void ED_undo_paint_step(struct bContext *C, int type, int step); +int ED_undo_paint_step(struct bContext *C, int type, int step, const char *name); void ED_undo_paint_free(void); #endif Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_image.c =================================================================== --- trunk/blender/source/blender/editors/sculpt_paint/paint_image.c 2010-07-23 14:35:23 UTC (rev 30655) +++ trunk/blender/source/blender/editors/sculpt_paint/paint_image.c 2010-07-23 14:46:31 UTC (rev 30656) @@ -4699,7 +4699,7 @@ } settings->imapaint.flag |= IMAGEPAINT_DRAWING; - undo_paint_push_begin(UNDO_PAINT_IMAGE, "Image Paint", + undo_paint_push_begin(UNDO_PAINT_IMAGE, op->type->name, image_undo_restore, image_undo_free); /* create painter */ @@ -5440,7 +5440,7 @@ scene->toolsettings->imapaint.flag |= IMAGEPAINT_DRAWING; - undo_paint_push_begin(UNDO_PAINT_IMAGE, "Image Paint", + undo_paint_push_begin(UNDO_PAINT_IMAGE, op->type->name, image_undo_restore, image_undo_free); /* allocate and initialize spacial data structures */ Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h =================================================================== --- trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h 2010-07-23 14:35:23 UTC (rev 30655) +++ trunk/blender/source/blender/editors/sculpt_paint/paint_intern.h 2010-07-23 14:46:31 UTC (rev 30656) @@ -121,7 +121,7 @@ typedef void (*UndoRestoreCb)(struct bContext *C, struct ListBase *lb); typedef void (*UndoFreeCb)(struct ListBase *lb); -void undo_paint_push_begin(int type, char *name, UndoRestoreCb restore, UndoFreeCb free); +void undo_paint_push_begin(int type, const char *name, UndoRestoreCb restore, UndoFreeCb free); struct ListBase *undo_paint_push_get_list(int type); void undo_paint_push_count_alloc(int type, int size); void undo_paint_push_end(int type); Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c =================================================================== --- trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c 2010-07-23 14:35:23 UTC (rev 30655) +++ trunk/blender/source/blender/editors/sculpt_paint/paint_undo.c 2010-07-23 14:46:31 UTC (rev 30656) @@ -76,7 +76,7 @@ } } -static void undo_stack_push_begin(UndoStack *stack, char *name, UndoRestoreCb restore, UndoFreeCb free) +static void undo_stack_push_begin(UndoStack *stack, const char *name, UndoRestoreCb restore, UndoFreeCb free) { UndoElem *uel; int nr; @@ -145,27 +145,35 @@ } } -static void undo_stack_step(bContext *C, UndoStack *stack, int step) +static int undo_stack_step(bContext *C, UndoStack *stack, int step, const char *name) { UndoElem *undo; if(step==1) { if(stack->current==NULL); else { - if(G.f & G_DEBUG) printf("undo %s\n", stack->current->name); - undo_restore(C, stack, stack->current); - stack->current= stack->current->prev; + if(!name || strcmp(stack->current->name, name) == 0) { + if(G.f & G_DEBUG) printf("undo %s\n", stack->current->name); + undo_restore(C, stack, stack->current); + stack->current= stack->current->prev; + return 1; + } } } else if(step==-1) { if((stack->current!=NULL && stack->current->next==NULL) || stack->elems.first==NULL); else { - undo= (stack->current && stack->current->next)? stack->current->next: stack->elems.first; - undo_restore(C, stack, undo); - stack->current= undo; - if(G.f & G_DEBUG) printf("redo %s\n", undo->name); + if(!name || strcmp(stack->current->name, name) == 0) { + undo= (stack->current && stack->current->next)? stack->current->next: stack->elems.first; + undo_restore(C, stack, undo); + stack->current= undo; + if(G.f & G_DEBUG) printf("redo %s\n", undo->name); + return 1; + } } } + + return 0; } static void undo_stack_free(UndoStack *stack) @@ -181,7 +189,7 @@ /* Exported Functions */ -void undo_paint_push_begin(int type, char *name, UndoRestoreCb restore, UndoFreeCb free) +void undo_paint_push_begin(int type, const char *name, UndoRestoreCb restore, UndoFreeCb free) { if(type == UNDO_PAINT_IMAGE) undo_stack_push_begin(&ImageUndoStack, name, restore, free); @@ -219,12 +227,14 @@ undo_stack_push_end(&MeshUndoStack); } -void ED_undo_paint_step(bContext *C, int type, int step) +int ED_undo_paint_step(bContext *C, int type, int step, const char *name) { if(type == UNDO_PAINT_IMAGE) - undo_stack_step(C, &ImageUndoStack, step); + return undo_stack_step(C, &ImageUndoStack, step, name); else if(type == UNDO_PAINT_MESH) - undo_stack_step(C, &MeshUndoStack, step); + return undo_stack_step(C, &MeshUndoStack, step, name); + + return 0; } void ED_undo_paint_free(void) Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c =================================================================== --- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c 2010-07-23 14:35:23 UTC (rev 30655) +++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c 2010-07-23 14:46:31 UTC (rev 30656) @@ -1063,7 +1063,7 @@ /* *********************** backdraw for selection *************** */ -void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d) +static void backdrawview3d(Scene *scene, ARegion *ar, View3D *v3d) { RegionView3D *rv3d= ar->regiondata; struct Base *base = scene->basact; Modified: trunk/blender/source/blender/editors/util/undo.c =================================================================== --- trunk/blender/source/blender/editors/util/undo.c 2010-07-23 14:35:23 UTC (rev 30655) +++ trunk/blender/source/blender/editors/util/undo.c 2010-07-23 14:46:31 UTC (rev 30656) @@ -116,7 +116,9 @@ SpaceImage *sima= (SpaceImage *)sa->spacedata.first; if((obact && obact->mode & OB_MODE_TEXTURE_PAINT) || sima->flag & SI_DRAWTOOL) { - ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step); + if(!ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step, undoname) && undoname) + if(U.uiflag & USER_GLOBALUNDO) + BKE_undo_name(C, undoname); WM_event_add_notifier(C, NC_WINDOW, NULL); return OPERATOR_FINISHED; @@ -139,10 +141,14 @@ else { int do_glob_undo= 0; - if(obact && obact->mode & OB_MODE_TEXTURE_PAINT) - ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step); - else if(obact && obact->mode & OB_MODE_SCULPT) - ED_undo_paint_step(C, UNDO_PAINT_MESH, step); + if(obact && obact->mode & OB_MODE_TEXTURE_PAINT) { + if(!ED_undo_paint_step(C, UNDO_PAINT_IMAGE, step, undoname) && undoname) + do_glob_undo= 1; + } + else if(obact && obact->mode & OB_MODE_SCULPT) { + if(!ED_undo_paint_step(C, UNDO_PAINT_MESH, step, undoname) && undoname) + do_glob_undo= 1; + } else if(obact && obact->mode & OB_MODE_PARTICLE_EDIT) { if(step==1) PE_undo(CTX_data_scene(C)); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs