[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13501] trunk/blender/source/blender: Fix: render could crash when you enable 'do composite' without having
Ton Roosendaal
ton at blender.org
Thu Jan 31 16:35:24 CET 2008
Revision: 13501
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13501
Author: ton
Date: 2008-01-31 16:35:24 +0100 (Thu, 31 Jan 2008)
Log Message:
-----------
Fix: render could crash when you enable 'do composite' without having
nodes in scene.
Feature: SHIFT+R in compositor reloads all full sample buffers, composites
and merges with filter. (ALso in Node menu).
Modified Paths:
--------------
trunk/blender/source/blender/include/BSE_node.h
trunk/blender/source/blender/render/extern/include/RE_pipeline.h
trunk/blender/source/blender/render/intern/source/pipeline.c
trunk/blender/source/blender/src/editnode.c
trunk/blender/source/blender/src/header_node.c
Modified: trunk/blender/source/blender/include/BSE_node.h
===================================================================
--- trunk/blender/source/blender/include/BSE_node.h 2008-01-31 15:28:16 UTC (rev 13500)
+++ trunk/blender/source/blender/include/BSE_node.h 2008-01-31 15:35:24 UTC (rev 13501)
@@ -73,6 +73,7 @@
void snode_make_group_editable(struct SpaceNode *snode, struct bNode *gnode);
void node_hide(struct SpaceNode *snode);
void node_read_renderlayers(struct SpaceNode *snode);
+void node_read_fullsamplelayers(struct SpaceNode *snode);
void clear_scene_in_nodes(struct Scene *sce);
void node_make_link(struct SpaceNode *snode);
Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h 2008-01-31 15:28:16 UTC (rev 13500)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h 2008-01-31 15:35:24 UTC (rev 13501)
@@ -38,6 +38,7 @@
struct RenderData;
struct NodeBlurData;
struct Object;
+struct bNodeTree;
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
/* this include is what is exposed of render to outside world */
@@ -187,6 +188,9 @@
void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
+/* do a full sample buffer compo */
+void RE_MergeFullSample(struct Render *re, struct Scene *sce, struct bNodeTree *ntree);
+
/* ancient stars function... go away! */
void RE_make_stars(struct Render *re, void (*initfunc)(void),
void (*vertexfunc)(float*), void (*termfunc)(void));
Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c 2008-01-31 15:28:16 UTC (rev 13500)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c 2008-01-31 15:35:24 UTC (rev 13501)
@@ -2022,14 +2022,18 @@
float *rectf;
int sample;
+ /* filtmask needs it */
+ R= *re;
+
/* we accumulate in here */
rectf= MEM_mapallocN(re->rectx*re->recty*sizeof(float)*4, "fullsample rgba");
- for(sample=0; sample<re->osa; sample++) {
+ for(sample=0; sample<re->r.osa; sample++) {
RenderResult rres;
int x, y, mask;
/* set all involved renders on the samplebuffers (first was done by render itself) */
+ /* also function below assumes this */
if(sample) {
Render *re1;
@@ -2083,8 +2087,41 @@
re->result->rectf= rectf;
}
+void RE_MergeFullSample(Render *re, Scene *sce, bNodeTree *ntree)
+{
+ Scene *scene;
+ bNode *node;
+
+ /* first call RE_ReadRenderResult on every renderlayer scene. this creates Render structs */
+
+ /* tag scenes unread */
+ for(scene= G.main->scene.first; scene; scene= scene->id.next)
+ scene->id.flag |= LIB_DOIT;
+
+ for(node= ntree->nodes.first; node; node= node->next) {
+ if(node->type==CMP_NODE_R_LAYERS) {
+ Scene *nodescene= (Scene *)node->id;
+
+ if(nodescene==NULL) nodescene= sce;
+ if(nodescene->id.flag & LIB_DOIT) {
+ nodescene->r.mode |= R_OSA; /* render struct needs tables */
+ RE_ReadRenderResult(sce, nodescene);
+ nodescene->id.flag &= ~LIB_DOIT;
+ }
+ }
+ }
+
+ /* own render result should be read/allocated */
+ if(G.scene->id.flag & LIB_DOIT)
+ RE_ReadRenderResult(G.scene, G.scene);
+
+ /* and now we can draw (result is there) */
+ re->display_init(re->result);
+ re->display_clear(re->result);
+
+ do_merge_fullsample(re, ntree);
+}
-
/* returns fully composited render-result on given time step (in RenderData) */
static void do_render_composite_fields_blur_3d(Render *re)
{
@@ -2111,7 +2148,7 @@
ntreeCompositTagAnimated(ntree);
}
- if(re->r.scemode & R_DOCOMP) {
+ if(ntree && re->r.scemode & R_DOCOMP) {
/* checks if there are render-result nodes that need scene */
if((re->r.scemode & R_SINGLE_LAYER)==0)
ntree_render_scenes(re);
@@ -2621,7 +2658,10 @@
if(scenode)
scene= scenode;
- re= RE_NewRender(scene->id.name);
+ /* get render: it can be called from UI with draw callbacks */
+ re= RE_GetRender(scene->id.name);
+ if(re==NULL)
+ re= RE_NewRender(scene->id.name);
RE_InitState(re, &scene->r, winx, winy, &disprect);
re->scene= scene;
Modified: trunk/blender/source/blender/src/editnode.c
===================================================================
--- trunk/blender/source/blender/src/editnode.c 2008-01-31 15:28:16 UTC (rev 13500)
+++ trunk/blender/source/blender/src/editnode.c 2008-01-31 15:35:24 UTC (rev 13501)
@@ -2012,6 +2012,22 @@
snode_handle_recalc(snode);
}
+void node_read_fullsamplelayers(SpaceNode *snode)
+{
+ Render *re= RE_NewRender(G.scene->id.name);
+
+ waitcursor(1);
+
+ BIF_init_render_callbacks(re, 1);
+ RE_MergeFullSample(re, G.scene, snode->nodetree);
+ BIF_end_render_callbacks();
+
+ allqueue(REDRAWNODE, 1);
+ allqueue(REDRAWIMAGE, 1);
+
+ waitcursor(0);
+}
+
/* called from header_info, when deleting a scene
* goes over all scenes other than the input, checks if they have
* render layer nodes referencing the to-be-deleted scene, and
@@ -2337,7 +2353,12 @@
case RKEY:
if(G.qual==LR_CTRLKEY) {
node_rename(snode);
- } else{
+ }
+ else if(G.qual==LR_SHIFTKEY) {
+ if(okee("Read saved Full Sample Layers"))
+ node_read_fullsamplelayers(snode);
+ }
+ else {
if(okee("Read saved Render Layers"))
node_read_renderlayers(snode);
}
Modified: trunk/blender/source/blender/src/header_node.c
===================================================================
--- trunk/blender/source/blender/src/header_node.c 2008-01-31 15:28:16 UTC (rev 13500)
+++ trunk/blender/source/blender/src/header_node.c 2008-01-31 15:35:24 UTC (rev 13501)
@@ -519,6 +519,10 @@
case 12: /* rename */
node_rename(snode);
break;
+ case 13: /* read saved full sample layers */
+ node_read_fullsamplelayers(snode);
+ break;
+
}
if(fromlib==-1) error_libdata();
@@ -562,6 +566,7 @@
if(snode->treetype==NTREE_COMPOSIT) {
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Execute Composite|E", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 10, "");
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Render Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 8, "");
+ uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Read Saved Full Sample Results|R", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 13, "");
}
uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Show Cyclic Dependencies|C", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 9, "");
More information about the Bf-blender-cvs
mailing list