[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [11655] branches/soc-2007-mosani/source/ blender/render: Wrote in the "RenderAPI_is_rendered" function, so that

Aaron Moore two.a.ron at gmail.com
Sat Aug 18 10:31:49 CEST 2007


Revision: 11655
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=11655
Author:   mosani
Date:     2007-08-18 10:31:48 +0200 (Sat, 18 Aug 2007)

Log Message:
-----------
Wrote in the "RenderAPI_is_rendered" function, so that 
 objects won't render if they're not supposed to.

Modified Paths:
--------------
    branches/soc-2007-mosani/source/blender/render/intern/source/pipeline.c
    branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h
    branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_internal.h
    branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c
    branches/soc-2007-mosani/source/blender/render/render_api/source/RND_internal.c

Modified: branches/soc-2007-mosani/source/blender/render/intern/source/pipeline.c
===================================================================
--- branches/soc-2007-mosani/source/blender/render/intern/source/pipeline.c	2007-08-18 06:46:10 UTC (rev 11654)
+++ branches/soc-2007-mosani/source/blender/render/intern/source/pipeline.c	2007-08-18 08:31:48 UTC (rev 11655)
@@ -2458,6 +2458,7 @@
 	/* do generic setup tasks */
 	re->api_scene = RenderAPI_create_scene( re );
 	re->api_result = RenderAPI_create_result( re );
+	init_render_world( re );
 	
 	/* get render control callbacks */
 	if( G.scene->r.renderer >= 2 ) /* renderer is a plugin */
@@ -2479,18 +2480,13 @@
 	/**** do generic tasks for the rending of a single frame ****/
 	
 	/* create a fresh render result */
-	RE_FreeRenderResult( re->result );
-	re->result = new_render_result( re, &re->disprect, 0, 
-		re->r.scemode & R_EXR_TILE_FILE );
-	BLI_freelistN( &re->api_result->pass_handlers );
-	RenderAPI_create_passes( re->api_result );
+	RenderAPI_update_result( re->api_result );
 	
-	init_render_world( re );
-	
-	if( G.scene->r.renderer == 0 ) /* if blender internal, set threadsafe
-	                                  abort-test callback */
+	if( G.scene->r.renderer == 0 ){ /* if blender internal, set threadsafe
+	                                   abort-test callback */
+		int (*old_test_break)(void) = re->test_break;
 		re->test_break = thread_break;
-		
+	}
 	
 	/**** tell renderer to render a single frame ****/
 	re->render_frame( re->api_scene, re->api_result );

Modified: branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h	2007-08-18 06:46:10 UTC (rev 11654)
+++ branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_helpers.h	2007-08-18 08:31:48 UTC (rev 11655)
@@ -87,7 +87,7 @@
 void RenderAPI_create_object_indexes( RNDScene scene );
 
 /* return true if base is a rendered object */
-int RenderAPI_is_rendered( Base *base );
+int RenderAPI_is_rendered( Scene *scene, Base *base );
 
 /* creates a pointer to holder and pushes it on the end of index */
 void RenderAPI_add_to_index( RenderAPIObjectHolder *holder, ListBase *index );

Modified: branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_internal.h
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_internal.h	2007-08-18 06:46:10 UTC (rev 11654)
+++ branches/soc-2007-mosani/source/blender/render/render_api/include/RenderAPI_internal.h	2007-08-18 08:31:48 UTC (rev 11655)
@@ -44,8 +44,15 @@
 void RenderAPI_switch_plugins( Scene *scene );
 int RenderAPI_has_plugin_renderer( RenderData *render_data );
 
+/*
+ * Functions to create, update for the new frame, 
+ *  and free the render API access points.
+ */
+
 RNDScene RenderAPI_create_scene( struct Render *render );
 RNDResult RenderAPI_create_result( struct Render *render );
+void RenderAPI_update_scene( RNDScene scene );
+void RenderAPI_update_result( RNDResult result );
 void RenderAPI_free_scene( RNDScene scene );
 void RenderAPI_free_result( RNDResult result );
 

Modified: branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c	2007-08-18 06:46:10 UTC (rev 11654)
+++ branches/soc-2007-mosani/source/blender/render/render_api/source/RND_helpers.c	2007-08-18 08:31:48 UTC (rev 11655)
@@ -75,7 +75,7 @@
 	Base *current_base = scene->render->scene->base.first;
 	for( ; current_base; current_base = current_base->next )
 	{
-		if( RenderAPI_is_rendered( current_base ) )
+		if( RenderAPI_is_rendered( scene->render->scene, current_base ) )
 		{
 			if( current_base->object->transflag & OB_DUPLI )
 			{
@@ -108,8 +108,10 @@
 		&scene->geometry_particle_system );
 }
 
-int RenderAPI_is_rendered( Base *base )
+int RenderAPI_is_rendered( Scene *scene, Base *base )
 {
+	if( !(base->lay & scene->lay) ) return 0;
+	if( base->object->restrictflag & OB_RESTRICT_RENDER ) return 0;
 	return 1;
 }
 

Modified: branches/soc-2007-mosani/source/blender/render/render_api/source/RND_internal.c
===================================================================
--- branches/soc-2007-mosani/source/blender/render/render_api/source/RND_internal.c	2007-08-18 06:46:10 UTC (rev 11654)
+++ branches/soc-2007-mosani/source/blender/render/render_api/source/RND_internal.c	2007-08-18 08:31:48 UTC (rev 11655)
@@ -43,7 +43,10 @@
 
 int (**global_test_break)();
 
-static char *plugin_renderer_names[200];
+static char *plugin_renderer_names[200];
+
+/* helper prototypes */
+static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int savebuffers);
 
 void RenderAPI_load_plugins( char renderer_menu[], char force_refresh ){
 	static char done = 0;
@@ -123,6 +126,11 @@
 	return new_scene;
 }
 
+void RenderAPI_update_scene( RNDScene scene )
+{
+	
+}
+
 void RenderAPI_free_scene( RNDScene scene ){
 	RNDObject object_free = NULL;
 	RNDGeometry geometry_free = NULL;
@@ -186,6 +194,16 @@
 	return result;
 }
 
+void RenderAPI_update_result( RNDResult result )
+{
+	RE_FreeRenderResult( result->render->result );
+	result->render->result = new_render_result( result->render, 
+			&result->render->disprect, 0, 
+			result->render->r.scemode & R_EXR_TILE_FILE );
+	BLI_freelistN( &result->render->api_result->pass_handlers );
+	RenderAPI_create_passes( result->render->api_result );
+}
+
 void RenderAPI_free_result( RNDResult result )
 {
 	BLI_freelistN( &result->pass_handlers );
@@ -222,3 +240,127 @@
 	plugin_free_control( renderer_control );
 }
 
+/******************************* helpers ************************************/
+
+/* will read info from Render *re to define layers */
+/* re->winx,winy is coordinate space of entire image, partrct the part within */
+static RenderResult *new_render_result(Render *re, rcti *partrct, int crop, int savebuffers)
+{
+	RenderResult *rr;
+	RenderLayer *rl;
+	SceneRenderLayer *srl;
+	int rectx, recty, nr;
+	
+	rectx= partrct->xmax - partrct->xmin;
+	recty= partrct->ymax - partrct->ymin;
+	
+	if(rectx<=0 || recty<=0)
+		return NULL;
+	
+	rr= MEM_callocN(sizeof(RenderResult), "new render result");
+	rr->rectx= rectx;
+	rr->recty= recty;
+	rr->renrect.xmin= 0; rr->renrect.xmax= rectx-2*crop;
+	/* crop is one or two extra pixels rendered for filtering, is used for merging and display too */
+	rr->crop= crop;
+	
+	/* tilerect is relative coordinates within render disprect. do not subtract crop yet */
+	rr->tilerect.xmin= partrct->xmin - re->disprect.xmin;
+	rr->tilerect.xmax= partrct->xmax - re->disprect.xmax;
+	rr->tilerect.ymin= partrct->ymin - re->disprect.ymin;
+	rr->tilerect.ymax= partrct->ymax - re->disprect.ymax;
+	
+	if(savebuffers) {
+		rr->exrhandle= IMB_exr_get_handle();
+	}
+	
+	/* check renderdata for amount of layers */
+	for(nr=0, srl= re->r.layers.first; srl; srl= srl->next, nr++) {
+		
+		if((re->r.scemode & R_SINGLE_LAYER) && nr!=re->r.actlay)
+			continue;
+		if(srl->layflag & SCE_LAY_DISABLE)
+			continue;
+		
+		rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
+		BLI_addtail(&rr->layers, rl);
+		
+		strcpy(rl->name, srl->name);
+		rl->lay= srl->lay;
+		rl->layflag= srl->layflag;
+		rl->passflag= srl->passflag;
+		rl->pass_xor= srl->pass_xor;
+		rl->light_override= srl->light_override;
+		rl->mat_override= srl->mat_override;
+		
+		if(rr->exrhandle) {
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
+		}
+		else
+			rl->rectf= MEM_mapallocN(rectx*recty*sizeof(float)*4, "Combined rgba");
+		
+		if(srl->passflag  & SCE_PASS_Z)
+			render_layer_add_pass(rr, rl, 1, SCE_PASS_Z);
+		if(srl->passflag  & SCE_PASS_VECTOR)
+			render_layer_add_pass(rr, rl, 4, SCE_PASS_VECTOR);
+		if(srl->passflag  & SCE_PASS_NORMAL)
+			render_layer_add_pass(rr, rl, 3, SCE_PASS_NORMAL);
+		if(srl->passflag  & SCE_PASS_UV) 
+			render_layer_add_pass(rr, rl, 3, SCE_PASS_UV);
+		if(srl->passflag  & SCE_PASS_RGBA)
+			render_layer_add_pass(rr, rl, 4, SCE_PASS_RGBA);
+		if(srl->passflag  & SCE_PASS_DIFFUSE)
+			render_layer_add_pass(rr, rl, 3, SCE_PASS_DIFFUSE);
+		if(srl->passflag  & SCE_PASS_SPEC)
+			render_layer_add_pass(rr, rl, 3, SCE_PASS_SPEC);
+		if(re->r.mode & R_SHADOW)
+			if(srl->passflag  & SCE_PASS_SHADOW)
+				render_layer_add_pass(rr, rl, 3, SCE_PASS_SHADOW);
+		if(re->r.mode & R_RAYTRACE) {
+			if(srl->passflag  & SCE_PASS_AO)
+				render_layer_add_pass(rr, rl, 3, SCE_PASS_AO);
+			if(srl->passflag  & SCE_PASS_REFLECT)
+				render_layer_add_pass(rr, rl, 3, SCE_PASS_REFLECT);
+			if(srl->passflag  & SCE_PASS_REFRACT)
+				render_layer_add_pass(rr, rl, 3, SCE_PASS_REFRACT);
+		}
+		if(re->r.mode & R_RADIO)
+			if(srl->passflag  & SCE_PASS_RADIO)
+				render_layer_add_pass(rr, rl, 3, SCE_PASS_RADIO);
+		if(srl->passflag  & SCE_PASS_INDEXOB)
+			render_layer_add_pass(rr, rl, 1, SCE_PASS_INDEXOB);
+		
+	}
+	/* sss, previewrender and envmap don't do layers, so we make a default one */
+	if(rr->layers.first==NULL) {
+		rl= MEM_callocN(sizeof(RenderLayer), "new render layer");
+		BLI_addtail(&rr->layers, rl);
+		
+		/* duplicate code... */
+		if(rr->exrhandle) {
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.R", 0, 0, NULL);
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.G", 0, 0, NULL);
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.B", 0, 0, NULL);
+			IMB_exr_add_channel(rr->exrhandle, rl->name, "Combined.A", 0, 0, NULL);
+		}
+		else
+			rl->rectf= MEM_mapallocN(rectx*recty*sizeof(float)*4, "Combined rgba");
+		
+		/* note, this has to be in sync with scene.c */
+		rl->lay= (1<<20) -1;
+		rl->layflag= 0x7FFF;	/* solid ztra halo strand */
+		rl->passflag= SCE_PASS_COMBINED;
+		
+		re->r.actlay= 0;
+	}
+	
+	/* border render; calculate offset for use in compositor. compo is centralized coords */
+	rr->xof= re->disprect.xmin + (re->disprect.xmax - re->disprect.xmin)/2 - re->winx/2;

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list