[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