[Bf-committers] [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

Campbell Barton cbarton at metavr.com
Sat Aug 18 10:28:03 CEST 2007


wouldn't it be better to just omit the object from the iterator when 
they don't render? isnt that how objects on disabled layers are dealt with?

are there any cases where you want to get the object that isnt rendered?

Aaron Moore wrote:
> 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. @@
> 
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
> 


-- 
Campbell J Barton (ideasman42)


More information about the Bf-committers mailing list