[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26959] trunk/blender/source: Render Slots : change the implementation by moving it from the render to the
Brecht Van Lommel
brecht at blender.org
Tue Feb 16 16:49:22 CET 2010
Revision: 26959
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26959
Author: blendix
Date: 2010-02-16 16:49:22 +0100 (Tue, 16 Feb 2010)
Log Message:
-----------
Render Slots: change the implementation by moving it from the render to the
image code, this should be clearer and makes reusing the Render struct later
on easier.
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_preview.c
trunk/blender/source/blender/editors/screen/screen_ops.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-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/blenkernel/BKE_image.h 2010-02-16 15:49:22 UTC (rev 26959)
@@ -142,6 +142,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-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c 2010-02-16 15:49:22 UTC (rev 26959)
@@ -321,9 +321,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 */
}
@@ -337,7 +337,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-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/blenkernel/intern/image.c 2010-02-16 15:49:22 UTC (rev 26959)
@@ -236,7 +236,7 @@
if(ima->anim) IMB_free_anim(ima->anim);
ima->anim= NULL;
-
+
if(ima->rr) {
RE_FreeRenderResult(ima->rr);
ima->rr= NULL;
@@ -250,6 +250,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);
@@ -260,9 +262,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;
+ }
}
}
@@ -1088,7 +1092,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)) {
@@ -1594,22 +1598,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)
@@ -1917,17 +1949,26 @@
{
Render *re= NULL;
RenderResult *rr= NULL;
+ int from_render= (ima->render_slot == ima->last_render_slot);
/* if we the caller is not going to release the lock, don't give the image */
if(!lock_r)
return NULL;
if(iuser && iuser->scene) {
- re= RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW);
- rr= RE_AcquireResultRead(re);
+ re= RE_GetRender(iuser->scene->id.name);
- /* release is done in BKE_image_release_ibuf using lock_r */
- *lock_r= re;
+ /* for the last render we get result for Render itself,
+ for others a RenderResult is stored in the Image */
+ if(from_render) {
+ rr= RE_AcquireResultRead(re);
+ /* release is done in BKE_image_release_ibuf using lock_r */
+ *lock_r= re;
+ }
+ else {
+ rr= ima->renders[ima->render_slot];
+ *lock_r= NULL;
+ }
}
if(rr==NULL)
@@ -1955,9 +1996,15 @@
channels= 4;
layer= (iuser)? iuser->layer: 0;
pass= (iuser)? iuser->pass: 0;
+
+ memset(&rres, 0, sizeof(rres));
/* this gives active layer, composite or seqence result */
- RE_AcquireResultImage(RE_GetRender(iuser->scene->id.name, RE_SLOT_VIEW), &rres);
+ if(from_render)
+ RE_AcquireResultImage(RE_GetRender(iuser->scene->id.name), &rres);
+ else if(rr)
+ rres= *rr;
+
rect= (unsigned int *)rres.rect32;
rectf= rres.rectf;
rectz= rres.rectz;
@@ -2012,13 +2059,15 @@
ibuf->flags |= IB_zbuffloat;
ibuf->dither= dither;
- RE_ReleaseResultImage(re);
+ if(from_render)
+ RE_ReleaseResultImage(re);
ima->ok= IMA_OK_LOADED;
return ibuf;
}
- RE_ReleaseResultImage(re);
+ if(from_render)
+ RE_ReleaseResultImage(re);
}
return NULL;
Modified: trunk/blender/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sequencer.c 2010-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/blenkernel/intern/sequencer.c 2010-02-16 15:49:22 UTC (rev 26959)
@@ -2093,9 +2093,9 @@
oldcfra = seq->scene->r.cfra;
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);
/* prevent eternal loop */
doseq= scene->r.scemode & R_DOSEQ;
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2010-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2010-02-16 15:49:22 UTC (rev 26959)
@@ -1191,6 +1191,7 @@
{
Image *ima= oldmain->image.first;
Scene *sce= oldmain->scene.first;
+ int a;
fd->imamap= oldnewmap_new();
@@ -1200,6 +1201,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) {
@@ -1217,7 +1221,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++) {
@@ -1239,6 +1243,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) {
@@ -2660,7 +2666,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-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/blenloader/intern/writefile.c 2010-02-16 15:49:22 UTC (rev 26959)
@@ -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-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/editors/object/object_bake.c 2010-02-16 15:49:22 UTC (rev 26959)
@@ -141,7 +141,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_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c 2010-02-16 15:45:19 UTC (rev 26958)
+++ trunk/blender/source/blender/editors/render/render_preview.c 2010-02-16 15:49:22 UTC (rev 26959)
@@ -474,7 +474,7 @@
}
}
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list