[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27800] trunk/blender/source/blender: External render engines can now render previews as well, disabled by

Brecht Van Lommel brecht at blender.org
Sun Mar 28 15:48:11 CEST 2010


Revision: 27800
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27800
Author:   blendix
Date:     2010-03-28 15:48:11 +0200 (Sun, 28 Mar 2010)

Log Message:
-----------
External render engines can now render previews as well, disabled by
default, set RenderEngine property bl_preview = True to enable it.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_preview.c
    trunk/blender/source/blender/makesrna/intern/rna_render.c
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/source/envmap.c
    trunk/blender/source/blender/render/intern/source/pipeline.c
    trunk/blender/source/blender/render/intern/source/sss.c

Modified: trunk/blender/source/blender/editors/render/render_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c	2010-03-28 13:45:19 UTC (rev 27799)
+++ trunk/blender/source/blender/editors/render/render_preview.c	2010-03-28 13:48:11 UTC (rev 27800)
@@ -299,6 +299,7 @@
 			sce->r.alphamode= R_ADDSKY;
 
 		sce->r.cfra= scene->r.cfra;
+		strcpy(sce->r.engine, scene->r.engine);
 		
 		if(id_type==ID_MA) {
 			Material *mat= (Material *)id;
@@ -780,7 +781,7 @@
 		/* OK, can we enter render code? */
 		if(ri->status==(PR_DISPRECT|PR_DBASE|PR_PROJECTED|PR_ROTATED)) {
 			//printf("curtile %d tottile %d\n", ri->curtile, ri->tottile);
-			RE_TileProcessor(ri->re, ri->curtile, 0);
+			RE_TileProcessor(ri->re); //, ri->curtile, 0);
 	
 			if(ri->rect==NULL)
 				ri->rect= MEM_mallocN(sizeof(int)*ri->pr_rectx*ri->pr_recty, "preview view3d rect");
@@ -915,7 +916,9 @@
 	else sizex= sp->sizex;
 
 	/* allocates or re-uses render result */
-	RE_InitState(re, NULL, &sce->r, NULL, sizex, sp->sizey, NULL);
+	sce->r.xsch= sizex;
+	sce->r.ysch= sp->sizey;
+	sce->r.size= 100;
 
 	/* callbacs are cleared on GetRender() */
 	if(sp->pr_method==PR_BUTS_RENDER) {
@@ -928,10 +931,7 @@
 		((Camera *)sce->camera->data)->lens *= (float)sp->sizey/(float)sizex;
 
 	/* entire cycle for render engine */
-	RE_SetCamera(re, sce->camera);
-	RE_Database_FromScene(re, sce, sce->lay, 1);
-	RE_TileProcessor(re, 0, 1);	// actual render engine
-	RE_Database_Free(re);
+	RE_PreviewRender(re, sce);
 
 	((Camera *)sce->camera->data)->lens= oldlens;
 

Modified: trunk/blender/source/blender/makesrna/intern/rna_render.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_render.c	2010-03-28 13:45:19 UTC (rev 27799)
+++ trunk/blender/source/blender/makesrna/intern/rna_render.c	2010-03-28 13:48:11 UTC (rev 27800)
@@ -279,6 +279,10 @@
 	RNA_def_property_string_sdna(prop, NULL, "type->name");
 	RNA_def_property_flag(prop, PROP_REGISTER);
 
+	prop= RNA_def_property(srna, "bl_preview", PROP_BOOLEAN, PROP_NONE);
+	RNA_def_property_boolean_sdna(prop, NULL, "type->flag", RE_DO_PREVIEW);
+	RNA_def_property_flag(prop, PROP_REGISTER_OPTIONAL);
+
 	RNA_define_verify_sdna(1);
 }
 

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2010-03-28 13:45:19 UTC (rev 27799)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2010-03-28 13:48:11 UTC (rev 27800)
@@ -202,12 +202,15 @@
 void RE_init_threadcount(Render *re);
 
 /* the main processor, assumes all was set OK! */
-void RE_TileProcessor(struct Render *re, int firsttile, int threaded);
+void RE_TileProcessor(struct Render *re);
 
 /* only RE_NewRender() needed, main Blender render calls */
 void RE_BlenderFrame(struct Render *re, struct Scene *scene, struct SceneRenderLayer *srl, unsigned int lay, int frame);
 void RE_BlenderAnim(struct Render *re, struct Scene *scene, unsigned int lay, int sfra, int efra, int tfra, struct ReportList *reports);
 
+/* main preview render call */
+void RE_PreviewRender(struct Render *re, struct Scene *scene);
+
 void RE_ReadRenderResult(struct Scene *scene, struct Scene *scenode);
 void RE_WriteRenderResult(RenderResult *rr, char *filename, int compress);
 struct RenderResult *RE_MultilayerConvert(void *exrhandle, int rectx, int recty);
@@ -252,6 +255,7 @@
 
 #define RE_INTERNAL		1
 #define RE_GAME			2
+#define RE_DO_PREVIEW	4
 
 extern ListBase R_engines;
 

Modified: trunk/blender/source/blender/render/intern/source/envmap.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/envmap.c	2010-03-28 13:45:19 UTC (rev 27799)
+++ trunk/blender/source/blender/render/intern/source/envmap.c	2010-03-28 13:48:11 UTC (rev 27800)
@@ -447,7 +447,7 @@
 		env_set_imats(envre);
 				
 		if(re->test_break(re->tbh)==0) {
-			RE_TileProcessor(envre, 0, 0);
+			RE_TileProcessor(envre);
 		}
 		
 		/* rotate back */

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2010-03-28 13:45:19 UTC (rev 27799)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2010-03-28 13:48:11 UTC (rev 27800)
@@ -1456,61 +1456,6 @@
 	return NULL;
 }
 
-/* returns with render result filled, not threaded, used for preview now only */
-static void render_tile_processor(Render *re, int firsttile)
-{
-	RenderPart *pa;
-	
-	if(re->test_break(re->tbh))
-		return;
-
-	BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
-
-	/* hrmf... exception, this is used for preview render, re-entrant, so render result has to be re-used */
-	if(re->result==NULL || re->result->layers.first==NULL) {
-		if(re->result) RE_FreeRenderResult(re->result);
-		re->result= new_render_result(re, &re->disprect, 0, RR_USEMEM);
-	}
-
-	BLI_rw_mutex_unlock(&re->resultmutex);
-	
-	re->stats_draw(re->sdh, &re->i);
- 
-	if(re->result==NULL)
-		return;
-	
-	initparts(re);
-
-	/* assuming no new data gets added to dbase... */
-	R= *re;
-	
-	for(pa= re->parts.first; pa; pa= pa->next) {
-		if(firsttile) {
-			re->i.partsdone++;	/* was reset in initparts */
-			firsttile--;
-		}
-		else {
-			do_part_thread(pa);
-			
-			if(pa->result) {
-				if(!re->test_break(re->tbh)) {
-					if(render_display_draw_enabled(re))
-						re->display_draw(re->ddh, pa->result, NULL);
-					
-					re->i.partsdone++;
-					re->stats_draw(re->sdh, &re->i);
-				}
-				RE_FreeRenderResult(pa->result);
-				pa->result= NULL;
-			}		
-			if(re->test_break(re->tbh))
-				break;
-		}
-	}
-
-	freeparts(re);
-}
-
 /* calculus for how much 1 pixel rendered should rotate the 3d geometry */
 /* is not that simple, needs to be corrected for errors of larger viewplane sizes */
 /* called in initrender.c, initparts() and convertblender.c, for speedvectors */
@@ -1784,43 +1729,20 @@
 }
 
 /* currently only called by preview renders and envmap */
-void RE_TileProcessor(Render *re, int firsttile, int threaded)
+void RE_TileProcessor(Render *re)
 {
-	/* the partsdone variable has to be reset to firsttile, to survive esc before it was set to zero */
-	
-	re->i.partsdone= firsttile;
-
-	if(!re->sss_points)
-		re->i.starttime= PIL_check_seconds_timer();
-
-	if(threaded)
-		threaded_tile_processor(re);
-	else
-		render_tile_processor(re, firsttile);
-		
-	if(!re->sss_points)
-		re->i.lastframetime= PIL_check_seconds_timer()- re->i.starttime;
-	re->stats_draw(re->sdh, &re->i);
+	threaded_tile_processor(re);
 }
 
-
 /* ************  This part uses API, for rendering Blender scenes ********** */
 
-static void external_render_3d(Render *re, RenderEngineType *type);
+static int external_render_3d(Render *re);
 
 static void do_render_3d(Render *re)
 {
-	RenderEngineType *type;
-
 	/* try external */
-	for(type=R_engines.first; type; type=type->next)
-		if(strcmp(type->idname, re->r.engine) == 0)
-			break;
-
-	if(type && type->render) {
-		external_render_3d(re, type);
+	if(external_render_3d(re))
 		return;
-	}
 
 	/* internal */
 	
@@ -2988,6 +2910,23 @@
 	G.rendering= 0;
 }
 
+void RE_PreviewRender(Render *re, Scene *sce)
+{
+	int winx, winy;
+
+	winx= (sce->r.size*sce->r.xsch)/100;
+	winy= (sce->r.size*sce->r.ysch)/100;
+
+	RE_InitState(re, NULL, &sce->r, NULL, winx, winy, NULL);
+
+	re->scene = sce;
+	re->lay = sce->lay;
+
+	RE_SetCamera(re, sce->camera);
+
+	do_render_3d(re);
+}
+
 /* note; repeated win/disprect calc... solve that nicer, also in compo */
 
 /* only the temp file! */
@@ -3193,10 +3132,20 @@
 	}
 }
 
-static void external_render_3d(Render *re, RenderEngineType *type)
+static int external_render_3d(Render *re)
 {
+	RenderEngineType *type;
 	RenderEngine engine;
 
+	for(type=R_engines.first; type; type=type->next)
+		if(strcmp(type->idname, re->r.engine) == 0)
+			break;
+
+	if(!(type && type->render))
+		return 0;
+	if((re->r.scemode & R_PREVIEWBUTS) && !(type->flag & RE_DO_PREVIEW))
+		return 0;
+
 	BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
 	if(re->result==NULL || !(re->r.scemode & R_PREVIEWBUTS)) {
 		RE_FreeRenderResult(re->result);
@@ -3209,7 +3158,7 @@
 	BLI_rw_mutex_unlock(&re->resultmutex);
 	
 	if(re->result==NULL)
-		return;
+		return 1;
 
 	/* external */
 	memset(&engine, 0, sizeof(engine));
@@ -3237,5 +3186,7 @@
 		read_render_result(re, 0);
 	}
 	BLI_rw_mutex_unlock(&re->resultmutex);
+
+	return 1;
 }
 

Modified: trunk/blender/source/blender/render/intern/source/sss.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/sss.c	2010-03-28 13:45:19 UTC (rev 27799)
+++ trunk/blender/source/blender/render/intern/source/sss.c	2010-03-28 13:48:11 UTC (rev 27800)
@@ -878,7 +878,7 @@
 		re->result= NULL;
 	BLI_rw_mutex_unlock(&re->resultmutex);
 
-	RE_TileProcessor(re, 0, 1);
+	RE_TileProcessor(re);
 	
 	BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
 	if(!(re->r.scemode & R_PREVIEWBUTS)) {





More information about the Bf-blender-cvs mailing list