[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