Revision: 35455
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35455
Author:   ton
Date:     2011-03-10 17:34:27 +0000 (Thu, 10 Mar 2011)
Log Message:
-----------
Bugfix #26424

More problems with Undo and Render Slots (Image editor)

- Undo storage for operator is now back, but only when new
  buffers were added (not when viewing existing)

- A real bug: On undo/redo, the stored buffers were never
  retrieved, but always freed entirely.

Note however that when you undo back to a state before you
rendered (or added slots), the render buffers that didn't
exist back then also get freed. A redo doesn't bring it back.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/editors/space_image/image_ops.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2011-03-10 
16:36:16 UTC (rev 35454)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2011-03-10 
17:34:27 UTC (rev 35455)
@@ -1200,7 +1200,7 @@
        OldNew *entry= fd->imamap->entries;
        Image *ima= oldmain->image.first;
        Scene *sce= oldmain->scene.first;
-       int i, a;
+       int i;
        
        /* used entries were restored, so we put them to zero */
        for (i=0; i<fd->imamap->nentries; i++, entry++) {
@@ -1220,10 +1220,10 @@
                                ima->gputexture= NULL;
                        }
                }
+               for(i=0; i<IMA_MAX_RENDER_SLOT; i++)
+                       ima->renders[i]= newimaadr(fd, ima->renders[i]);
 
                ima->gputexture= newimaadr(fd, ima->gputexture);
-               for(a=0; a<IMA_MAX_RENDER_SLOT; a++)
-                       ima->renders[a]= newimaadr(fd, ima->renders[a]);
        }
        for(; sce; sce= sce->id.next) {
                if(sce->nodetree) {
@@ -2773,9 +2773,19 @@
        ima->anim= NULL;
        ima->rr= NULL;
        ima->repbind= NULL;
-       memset(ima->renders, 0, sizeof(ima->renders));
-       ima->last_render_slot= ima->render_slot;
        
+       /* undo system, try to restore render buffers */
+       if(fd->imamap) {
+               int a;
+               
+               for(a=0; a<IMA_MAX_RENDER_SLOT; a++)
+                       ima->renders[a]= newimaadr(fd, ima->renders[a]);
+       }
+       else {
+               memset(ima->renders, 0, sizeof(ima->renders));
+               ima->last_render_slot= ima->render_slot;
+       }
+       
        ima->packedfile = direct_link_packedfile(fd, ima->packedfile);
        ima->preview = direct_link_preview_image(fd, ima->preview);
        ima->ok= 1;

Modified: trunk/blender/source/blender/editors/space_image/image_ops.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/image_ops.c        
2011-03-10 16:36:16 UTC (rev 35454)
+++ trunk/blender/source/blender/editors/space_image/image_ops.c        
2011-03-10 17:34:27 UTC (rev 35455)
@@ -2133,6 +2133,10 @@
        
        WM_event_add_notifier(C, NC_IMAGE|ND_DRAW, NULL);
 
+       /* no undo push for browsing existing */
+       if(ima->renders[ima->render_slot])
+               return OPERATOR_CANCELLED;
+       
        return OPERATOR_FINISHED;
 }
 
@@ -2146,7 +2150,8 @@
        ot->exec= cycle_render_slot_exec;
        ot->poll= cycle_render_slot_poll;
 
-       /* no registry or undo flags, this is a UI option */
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
 
        RNA_def_boolean(ot->srna, "reverse", 0, "Cycle in Reverse", "");
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to