Revision: 27793
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27793
Author:   blendix
Date:     2010-03-27 16:35:34 +0100 (Sat, 27 Mar 2010)

Log Message:
-----------
Second attempt at committing the different render slot implementation. This
has a fix that hopefully solves the problem on mac/win. Also fixes #21322,
render slots not working well with FSA.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_image.h
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/blenkernel/intern/sequencer.c
    trunk/blender/source/blender/blenloader/intern/readfile.c
    trunk/blender/source/blender/blenloader/intern/writefile.c
    trunk/blender/source/blender/editors/object/object_bake.c
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/editors/render/render_opengl.c
    trunk/blender/source/blender/editors/render/render_preview.c
    trunk/blender/source/blender/editors/space_file/writeimage.c
    trunk/blender/source/blender/editors/space_image/image_buttons.c
    trunk/blender/source/blender/editors/space_image/image_draw.c
    trunk/blender/source/blender/editors/space_image/image_ops.c
    trunk/blender/source/blender/editors/space_node/node_edit.c
    trunk/blender/source/blender/makesdna/DNA_image_types.h
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_composite.c
    trunk/blender/source/blender/nodes/intern/CMP_nodes/CMP_image.c
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/envmap.c
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/creator/creator.c

Modified: trunk/blender/source/blender/blenkernel/BKE_image.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_image.h 2010-03-27 14:54:22 UTC 
(rev 27792)
+++ trunk/blender/source/blender/blenkernel/BKE_image.h 2010-03-27 15:35:34 UTC 
(rev 27793)
@@ -141,6 +141,9 @@
 /* for multilayer images as well as for render-viewer */
 struct RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, 
struct Image *ima);
 void BKE_image_release_renderresult(struct Scene *scene, struct Image *ima);
+
+/* for multiple slot render, call this before render */
+void BKE_image_backup_render(struct Scene *scene, struct Image *ima);
        
 /* goes over all textures that use images */
 void   BKE_image_free_all_textures(void);

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c   2010-03-27 
14:54:22 UTC (rev 27792)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c   2010-03-27 
15:35:34 UTC (rev 27793)
@@ -295,9 +295,9 @@
        /* XXX ugly global still, but we can't do preview while rendering */
        if(G.rendering==0) {
                
-               Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT);
+               Render *re= RE_GetRender("_Shade View_");
                if(re==NULL) {
-                       re= RE_NewRender("_Shade View_", RE_SLOT_DEFAULT);
+                       re= RE_NewRender("_Shade View_");
                
                        RE_Database_Baking(re, scene, 0, 0);    /* 0= no faces 
*/
                }
@@ -311,7 +311,7 @@
 /* called on file reading */
 void fastshade_free_render(void)
 {
-       Render *re= RE_GetRender("_Shade View_", RE_SLOT_DEFAULT);
+       Render *re= RE_GetRender("_Shade View_");
        
        if(re) {
                RE_Database_Free(re);

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c      2010-03-27 
14:54:22 UTC (rev 27792)
+++ trunk/blender/source/blender/blenkernel/intern/image.c      2010-03-27 
15:35:34 UTC (rev 27793)
@@ -229,7 +229,7 @@
        
        if(ima->anim) IMB_free_anim(ima->anim);
        ima->anim= NULL;
-       
+
        if(ima->rr) {
                RE_FreeRenderResult(ima->rr);
                ima->rr= NULL;
@@ -243,6 +243,8 @@
 /* called by library too, do not free ima itself */
 void free_image(Image *ima)
 {
+       int a;
+
        image_free_buffers(ima);
        if (ima->packedfile) {
                freePackedFile(ima->packedfile);
@@ -253,9 +255,11 @@
        if (ima->preview) {
                BKE_previewimg_free(&ima->preview);
        }
-       if (ima->render_text) {
-               MEM_freeN(ima->render_text);
-               ima->render_text= NULL;
+       for(a=0; a<IMA_MAX_RENDER_SLOT; a++) {
+               if(ima->renders[a]) {
+                       RE_FreeRenderResult(ima->renders[a]);
+                       ima->renders[a]= NULL;
+               }
        }
 }
 
@@ -1005,7 +1009,7 @@
        }
 
        {
-               Render *re= RE_GetRender(scene->id.name, RE_SLOT_RENDERING);
+               Render *re= RE_GetRender(scene->id.name);
                RenderStats *stats= re ? RE_GetStats(re):NULL;
 
                if (stats && (scene->r.stamp & R_STAMP_RENDERTIME)) {
@@ -1511,22 +1515,50 @@
        return rpass;
 }
 
-RenderResult *BKE_image_acquire_renderresult(struct Scene *scene, Image *ima)
+RenderResult *BKE_image_acquire_renderresult(Scene *scene, Image *ima)
 {
-       if(ima->rr)
+       if(ima->rr) {
                return ima->rr;
-       else if(ima->type==IMA_TYPE_R_RESULT)
-               return RE_AcquireResultRead(RE_GetRender(scene->id.name, 
RE_SLOT_VIEW));
-       return NULL;
+       }
+       else if(ima->type==IMA_TYPE_R_RESULT) {
+               if(ima->render_slot == ima->last_render_slot)
+                       return 
RE_AcquireResultRead(RE_GetRender(scene->id.name));
+               else
+                       return ima->renders[ima->render_slot];
+       }
+       else
+               return NULL;
 }
 
-void BKE_image_release_renderresult(struct Scene *scene, Image *ima)
+void BKE_image_release_renderresult(Scene *scene, Image *ima)
 {
        if(ima->rr);
-       else if(ima->type==IMA_TYPE_R_RESULT)
-               RE_ReleaseResult(RE_GetRender(scene->id.name, RE_SLOT_VIEW));
+       else if(ima->type==IMA_TYPE_R_RESULT) {
+               if(ima->render_slot == ima->last_render_slot)
+                       RE_ReleaseResult(RE_GetRender(scene->id.name));
+       }
 }
 
+void BKE_image_backup_render(Scene *scene, Image *ima)
+{
+       /* called right before rendering, ima->renders contains render
+          result pointers for everything but the current render */
+       Render *re= RE_GetRender(scene->id.name);
+       int slot= ima->render_slot, last= ima->last_render_slot;
+
+       if(slot != last) {
+               if(ima->renders[slot]) {
+                       RE_FreeRenderResult(ima->renders[slot]);
+                       ima->renders[slot]= NULL;
+               }
+
+               ima->renders[last]= NULL;
+               RE_SwapResult(re, &ima->renders[last]);
+       }
+
+       ima->last_render_slot= slot;
+}
+
 /* after imbuf load, openexr type can return with a exrhandle open */
 /* in that case we have to build a render-result */
 static void image_create_multilayer(Image *ima, ImBuf *ibuf, int framenr)
@@ -1839,6 +1871,7 @@
        float dither;
        int channels, layer, pass;
        ImBuf *ibuf;
+       int from_render= (ima->render_slot == ima->last_render_slot);
 
        if(!(iuser && iuser->scene))
                return NULL;
@@ -1847,14 +1880,29 @@
        if(!lock_r)
                return NULL;
 
-       re= RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW);
+       re= RE_GetRender(iuser->scene->id.name);
 
        channels= 4;
        layer= (iuser)? iuser->layer: 0;
        pass= (iuser)? iuser->pass: 0;
+
+       if(from_render)
+               RE_AcquireResultImage(re, &rres);
+       else if(ima->renders[ima->render_slot])
+               rres= *(ima->renders[ima->render_slot]);
+       else
+               memset(&rres, 0, sizeof(RenderResult));
        
+       if(!(rres.rectx > 0 && rres.recty > 0)) {
+               RE_ReleaseResultImage(re);
+               return NULL;
+       }
+
+       /* release is done in BKE_image_release_ibuf using lock_r */
+       if(from_render)
+               *lock_r= re;
+
        /* this gives active layer, composite or seqence result */
-       RE_AcquireResultImage(re, &rres);
        rect= (unsigned int *)rres.rect32;
        rectf= rres.rectf;
        rectz= rres.rectz;
@@ -1885,11 +1933,6 @@
                                        rectz= rpass->rect;
                }
        }
-       
-       if(!(rectf || rect)) {
-               RE_ReleaseResultImage(re);
-               return NULL;
-       }
 
        ibuf= image_get_ibuf(ima, IMA_NO_INDEX, 0);
 
@@ -1898,6 +1941,10 @@
                ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 32, 0, 0);
                image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
        }
+
+       if(!(rectf || rect))
+               return ibuf;
+
        ibuf->x= rres.rectx;
        ibuf->y= rres.recty;
        
@@ -1915,9 +1962,6 @@
 
        ima->ok= IMA_OK_LOADED;
 
-       /* release is done in BKE_image_release_ibuf using lock_r */
-       *lock_r= re;
-
        return ibuf;
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c  2010-03-27 
14:54:22 UTC (rev 27792)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c  2010-03-27 
15:35:34 UTC (rev 27793)
@@ -2175,9 +2175,9 @@
                                RenderResult rres;
 
                                if(rendering)
-                                       re= RE_NewRender(" do_build_seq_ibuf", 
RE_SLOT_DEFAULT);
+                                       re= RE_NewRender(" do_build_seq_ibuf");
                                else
-                                       re= RE_NewRender(sce->id.name, 
RE_SLOT_VIEW);
+                                       re= RE_NewRender(sce->id.name);
 
                                RE_BlenderFrame(re, sce, NULL, sce->lay, frame);
 

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c   2010-03-27 
14:54:22 UTC (rev 27792)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c   2010-03-27 
15:35:34 UTC (rev 27793)
@@ -1183,6 +1183,7 @@
 {
        Image *ima= oldmain->image.first;
        Scene *sce= oldmain->scene.first;
+       int a;
        
        fd->imamap= oldnewmap_new();
        
@@ -1192,6 +1193,9 @@
                        oldnewmap_insert(fd->imamap, ibuf, ibuf, 0);
                if(ima->gputexture)
                        oldnewmap_insert(fd->imamap, ima->gputexture, 
ima->gputexture, 0);
+               for(a=0; a<IMA_MAX_RENDER_SLOT; a++)
+                       if(ima->renders[a])
+                               oldnewmap_insert(fd->imamap, ima->renders[a], 
ima->renders[a], 0);
        }
        for(; sce; sce= sce->id.next) {
                if(sce->nodetree) {
@@ -1209,7 +1213,7 @@
        OldNew *entry= fd->imamap->entries;
        Image *ima= oldmain->image.first;
        Scene *sce= oldmain->scene.first;
-       int i;
+       int i, a;
        
        /* used entries were restored, so we put them to zero */
        for (i=0; i<fd->imamap->nentries; i++, entry++) {
@@ -1231,6 +1235,8 @@
                }
 
                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) {
@@ -2653,7 +2659,8 @@
        ima->anim= NULL;
        ima->rr= NULL;
        ima->repbind= NULL;
-       ima->render_text= newdataadr(fd, ima->render_text);
+       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);

Modified: trunk/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/writefile.c  2010-03-27 
14:54:22 UTC (rev 27792)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c  2010-03-27 
15:35:34 UTC (rev 27793)
@@ -1625,10 +1625,6 @@
                        }
 
                        write_previews(wd, ima->preview);
-
-                       /* exception: render text only saved in undo files 
(wd->current) */
-                       if (ima->render_text && wd->current)
-                               writedata(wd, DATA, IMA_RW_MAXTEXT, 
ima->render_text);
                }
                ima= ima->id.next;
        }

Modified: trunk/blender/source/blender/editors/object/object_bake.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_bake.c   2010-03-27 
14:54:22 UTC (rev 27792)
+++ trunk/blender/source/blender/editors/object/object_bake.c   2010-03-27 
15:35:34 UTC (rev 27793)
@@ -140,7 +140,7 @@
        bkr->sa= biggest_image_area(CTX_wm_screen(C)); /* can be NULL */
        bkr->scene= scene;
        bkr->actob= (scene->r.bake_flag & R_BAKE_TO_ACTIVE) ? OBACT : NULL;
-       bkr->re= RE_NewRender("_Bake View_", RE_SLOT_DEFAULT);
+       bkr->re= RE_NewRender("_Bake View_");
 
        if(scene->r.bake_mode==RE_BAKE_AO) {
                /* If raytracing or AO is disabled, switch it on temporarily 
for baking. */

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c       
2010-03-27 14:54:22 UTC (rev 27792)
+++ trunk/blender/source/blender/editors/render/render_internal.c       
2010-03-27 15:35:34 UTC (rev 27793)
@@ -391,15 +391,20 @@
 static int screen_render_exec(bContext *C, wmOperator *op)
 {
        Scene *scene= CTX_data_scene(C);
-       Render *re= RE_GetRender(scene->id.name, RE_SLOT_VIEW);

@@ Diff output truncated at 10240 characters. @@

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

Reply via email to