[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21365] trunk/blender/source/blender/ python/api2_2x/sceneRender.c: == Python ==

Peter Schlaile peter at schlaile.de
Sat Jul 4 16:59:30 CEST 2009


Revision: 21365
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21365
Author:   schlaile
Date:     2009-07-04 16:59:28 +0200 (Sat, 04 Jul 2009)

Log Message:
-----------
== Python ==

This fixes:
* background rendering on scenes different from active scene
* makes scene.render() behave the same in interactive and background mode
* makes saveRenderedImage() work correctly in background mode

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/sceneRender.c

Modified: trunk/blender/source/blender/python/api2_2x/sceneRender.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/sceneRender.c	2009-07-04 12:41:34 UTC (rev 21364)
+++ trunk/blender/source/blender/python/api2_2x/sceneRender.c	2009-07-04 14:59:28 UTC (rev 21365)
@@ -40,6 +40,8 @@
 #include "BKE_screen.h"
 #include "BKE_scene.h"
 #include "BKE_node.h"
+#include "IMB_imbuf_types.h"	/* for the IB_rect define */
+#include "IMB_imbuf.h"
 
 #include "BIF_drawscene.h"
 #include "BIF_renderwin.h"
@@ -480,28 +482,25 @@
 		tstate = PyEval_SaveThread();
 		BIF_do_render( 0 );
 		set_scene( oldsce );
-	}
-	else { /* background mode (blender -b file.blend -P script) */
-		Render *re= RE_NewRender(G.scene->id.name);
+	} else { /* background mode (blender -b file.blend -P script) */
+		Render *re;
 
-		int end_frame = G.scene->r.efra;
+		oldsce = G.scene;
 
-		if (G.scene != self->scene)
-			return EXPP_ReturnPyObjError (PyExc_RuntimeError,
-				"scene to render in bg mode must be the active scene");
+		set_scene_bg( self->scene );
 
-		G.scene->r.efra = G.scene->r.sfra;
+		re = RE_NewRender(G.scene->id.name);
 
+		tstate = PyEval_SaveThread();
+
 		if (G.f & G_DOSCRIPTLINKS)
-			BPY_do_all_scripts(SCRIPT_RENDER, 0);
+			BPY_do_all_scripts(SCRIPT_RENDER, 1);
 
-		tstate = PyEval_SaveThread();
+		RE_BlenderFrame(re, G.scene, G.scene->r.cfra);
 
-		RE_BlenderAnim(re, G.scene, G.scene->r.sfra, G.scene->r.efra, G.scene->frame_step);
-
 		BPY_do_all_scripts(SCRIPT_POSTRENDER, 0);
 
-		G.scene->r.efra = end_frame;
+		set_scene_bg( oldsce );
 	}
 
 	PyEval_RestoreThread(tstate);
@@ -544,10 +543,6 @@
 		return EXPP_ReturnPyObjError( PyExc_TypeError,
 				"expected a filename (string) and optional int" );
 	
-	if (G.background)
-		return EXPP_ReturnPyObjError( PyExc_RuntimeError,
-				"saveRenderedImage does not work in background mode, use renderAnim() instead" );
-	
 	if( strlen(self->renderContext->pic) + strlen(name_str)
 			>= sizeof(filepath) )
 		return EXPP_ReturnPyObjError( PyExc_ValueError,
@@ -558,7 +553,7 @@
 	BLI_strncpy( filepath, self->renderContext->pic, sizeof(filepath) );
 	strcat(filepath, name_str);
 
-	rr = RE_GetResult(RE_GetRender(G.scene->id.name));
+	rr = RE_GetResult(RE_GetRender(self->scene->id.name));
 	if(!rr) {
 		return EXPP_ReturnPyObjError (PyExc_ValueError, "No image rendered");
 	} else {
@@ -567,7 +562,49 @@
 			BLI_splitdirstring(dir, str);
 			strcpy(G.ima, dir);
 		}
-		BIF_save_rendered_image(filepath);
+		if (G.background) {
+			if(self->scene->r.scemode & R_EXTENSION) 
+				if(strlen(filepath)<FILE_MAXDIR+FILE_MAXFILE-5)
+					BKE_add_image_extension(
+						filepath, 
+						self->scene->r.imtype);
+
+
+			BLI_convertstringcode(filepath, G.sce);
+			BLI_convertstringframe(filepath, self->scene->r.cfra); 
+                        /* TODO - is this even used? */
+
+			if(G.scene->r.imtype==R_MULTILAYER) {
+				RE_WriteRenderResult(rr, filepath, 
+						     self->scene->r.quality);
+			} else {
+				RenderResult rres;
+				struct ImBuf *ibuf;
+			
+				RE_GetResultImage(
+					RE_GetRender(self->scene->id.name), 
+					&rres);
+
+				ibuf= IMB_allocImBuf(rres.rectx, rres.recty, 
+						     self->scene->r.planes, 
+						     0, 0);
+				ibuf->rect= (unsigned int *)rres.rect32;
+				ibuf->rect_float= rres.rectf;
+				ibuf->zbuf_float= rres.rectz;
+			
+				/* float factor for random dither, imbuf takes care of it */
+				ibuf->dither= self->scene->r.dither_intensity;
+			
+				BKE_write_ibuf(ibuf, str, 
+					       self->scene->r.imtype, 
+					       self->scene->r.subimtype, 
+					       self->scene->r.quality);
+				IMB_freeImBuf(ibuf);	
+                                /* imbuf knows rects are not part of ibuf */
+			}
+		} else {
+			BIF_save_rendered_image(filepath);
+		}
 	}
 	Py_RETURN_NONE;
 }
@@ -586,24 +623,27 @@
 		set_scene( oldsce );
 	}
 	else { /* background mode (blender -b file.blend -P script) */
-		Render *re= RE_NewRender(G.scene->id.name);
-		
-		if (G.scene != self->scene)
-			return EXPP_ReturnPyObjError (PyExc_RuntimeError,
-				"scene to render in bg mode must be the active scene");
+		Render *re;
 
+		oldsce = G.scene;
+		set_scene_bg( self->scene );
+
+		re = RE_NewRender(G.scene->id.name);
+
 		if (G.scene->r.sfra > G.scene->r.efra)
 			return EXPP_ReturnPyObjError (PyExc_RuntimeError,
 				"start frame must be less or equal to end frame");
 
+		tstate = PyEval_SaveThread();
+
 		if (G.f & G_DOSCRIPTLINKS)
 			BPY_do_all_scripts(SCRIPT_RENDER, 1);
 
-		tstate = PyEval_SaveThread();
 		RE_BlenderAnim(re, G.scene, G.scene->r.sfra, G.scene->r.efra, G.scene->frame_step);
-
 		if (G.f & G_DOSCRIPTLINKS)
 			BPY_do_all_scripts(SCRIPT_POSTRENDER, 1);
+
+		set_scene_bg( oldsce );
 	}
 
 	PyEval_RestoreThread(tstate);





More information about the Bf-blender-cvs mailing list