[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21781] branches/blender2.5/blender: 2.5: Render

Brecht Van Lommel brecht at blender.org
Tue Jul 21 22:28:32 CEST 2009


Revision: 21781
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21781
Author:   blendix
Date:     2009-07-21 22:28:32 +0200 (Tue, 21 Jul 2009)

Log Message:
-----------
2.5: Render

This adds a RenderEngine type to RNA, which can be subclassed
in python (c++ will follow once we support subclassing there).
It's very basic, but plugs into the pipeline nicely. Two example
scripts:

http://www.pasteall.org/6635/python
http://www.pasteall.org/6636/python

Issues:
* Render runs in a separate thread, and there is unrestricted
  access, so it's possible to crash blender with unsafe access.
* Save buffers and full sample are not supported yet.

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/buttons_scene.py
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_scene_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_render.c
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c
    branches/blender2.5/blender/source/blender/render/CMakeLists.txt
    branches/blender2.5/blender/source/blender/render/SConscript
    branches/blender2.5/blender/source/blender/render/extern/include/RE_pipeline.h
    branches/blender2.5/blender/source/blender/render/intern/source/Makefile
    branches/blender2.5/blender/source/blender/render/intern/source/pipeline.c
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_init_exit.c

Modified: branches/blender2.5/blender/release/ui/buttons_scene.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_scene.py	2009-07-21 20:05:16 UTC (rev 21780)
+++ branches/blender2.5/blender/release/ui/buttons_scene.py	2009-07-21 20:28:32 UTC (rev 21781)
@@ -18,6 +18,8 @@
 		row.item_booleanO("screen.render", "anim", True, text="Animation", icon='ICON_SEQUENCE')
 
 		layout.itemR(rd, "display_mode", text="Display")
+		if rd.multiple_engines:
+			layout.itemR(rd, "engine")
 
 class RENDER_PT_layers(RenderButtonsPanel):
 	__label__ = "Layers"

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-07-21 20:05:16 UTC (rev 21780)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-07-21 20:28:32 UTC (rev 21781)
@@ -2486,20 +2486,25 @@
 	else if(scene->r.scemode & R_SINGLE_LAYER)
 		spos+= sprintf(spos, "Single Layer | ");
 	
-	spos+= sprintf(spos, "Fra:%d  Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface);
-	if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo);
-	if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand);
-	spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory);
+	if(rs->statstr) {
+		spos+= sprintf(spos, "%s ", rs->statstr);
+	}
+	else {
+		spos+= sprintf(spos, "Fra:%d  Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface);
+		if(rs->tothalo) spos+= sprintf(spos, "Ha:%d ", rs->tothalo);
+		if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand);
+		spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory);
+		
+		if(rs->curfield)
+			spos+= sprintf(spos, "Field %d ", rs->curfield);
+		if(rs->curblur)
+			spos+= sprintf(spos, "Blur %d ", rs->curblur);
+	}
 	
-	if(rs->curfield)
-		spos+= sprintf(spos, "Field %d ", rs->curfield);
-	if(rs->curblur)
-		spos+= sprintf(spos, "Blur %d ", rs->curblur);
-	
 	BLI_timestr(rs->lastframetime, info_time_str);
 	spos+= sprintf(spos, "Time:%s ", info_time_str);
 	
-	if(rs->infostr)
+	if(rs->infostr && rs->infostr[0])
 		spos+= sprintf(spos, "| %s ", rs->infostr);
 	
 	/* very weak... but 512 characters is quite safe */

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_scene_types.h	2009-07-21 20:05:16 UTC (rev 21780)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_scene_types.h	2009-07-21 20:28:32 UTC (rev 21781)
@@ -235,7 +235,7 @@
 	 */
 	int mode;
 
-	/* render engine, octree resolution */
+	/* render engine (deprecated), octree resolution */
 	short renderer, ocres;
 
 	/**
@@ -334,6 +334,8 @@
 	float pad2;			//  XXX deprecated since 2.5
 	struct Text *dometext;	//  XXX deprecated since 2.5
 
+	/* render engine */
+	char engine[32];
 } RenderData;
 
 /* control render convert and shading engine */

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_render.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_render.c	2009-07-21 20:05:16 UTC (rev 21780)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_render.c	2009-07-21 20:28:32 UTC (rev 21781)
@@ -34,7 +34,6 @@
 #include "WM_types.h"
 
 #include "RE_pipeline.h"
-#include "RE_render_ext.h"
 
 #ifdef RNA_RUNTIME
 
@@ -47,6 +46,82 @@
 
 #include "WM_api.h"
 
+/* RenderEngine */
+
+static void engine_render(RenderEngine *engine, struct Scene *scene)
+{
+	PointerRNA ptr;
+	ParameterList list;
+	FunctionRNA *func;
+
+	RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr);
+	func= RNA_struct_find_function(&ptr, "render");
+
+	RNA_parameter_list_create(&list, &ptr, func);
+	RNA_parameter_set_lookup(&list, "scene", &scene);
+	engine->type->ext.call(&ptr, func, &list);
+
+	RNA_parameter_list_free(&list);
+}
+
+static void rna_RenderEngine_unregister(const bContext *C, StructRNA *type)
+{
+	RenderEngineType *et= RNA_struct_blender_type_get(type);
+
+	if(!et)
+		return;
+	
+	BLI_freelinkN(&R_engines, et);
+	RNA_struct_free(&BLENDER_RNA, type);
+}
+
+static StructRNA *rna_RenderEngine_register(const bContext *C, ReportList *reports, void *data, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free)
+{
+	RenderEngineType *et, dummyet = {0};
+	RenderEngine dummyengine= {0};
+	PointerRNA dummyptr;
+	int have_function[1];
+
+	/* setup dummy engine & engine type to store static properties in */
+	dummyengine.type= &dummyet;
+	RNA_pointer_create(NULL, &RNA_RenderEngine, &dummyengine, &dummyptr);
+
+	/* validate the python class */
+	if(validate(&dummyptr, data, have_function) != 0)
+		return NULL;
+	
+	/* check if we have registered this engine type before, and remove it */
+	for(et=R_engines.first; et; et=et->next) {
+		if(strcmp(et->idname, dummyet.idname) == 0) {
+			if(et->ext.srna)
+				rna_RenderEngine_unregister(C, et->ext.srna);
+			break;
+		}
+	}
+	
+	/* create a new engine type */
+	et= MEM_callocN(sizeof(RenderEngineType), "python buttons engine");
+	memcpy(et, &dummyet, sizeof(dummyet));
+
+	et->ext.srna= RNA_def_struct(&BLENDER_RNA, et->idname, "RenderEngine"); 
+	et->ext.data= data;
+	et->ext.call= call;
+	et->ext.free= free;
+	RNA_struct_blender_type_set(et->ext.srna, et);
+
+	et->render= (have_function[0])? engine_render: NULL;
+
+	BLI_addtail(&R_engines, et);
+
+	return et->ext.srna;
+}
+
+static StructRNA* rna_RenderEngine_refine(PointerRNA *ptr)
+{
+	RenderEngine *engine= (RenderEngine*)ptr->data;
+	return (engine->type && engine->type->ext.srna)? engine->type->ext.srna: &RNA_RenderEngine;
+}
+
 static void rna_RenderResult_layers_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
 {
 	RenderResult *rr= (RenderResult*)ptr->data;
@@ -96,6 +171,68 @@
 
 #else // RNA_RUNTIME
 
+static void rna_def_render_engine(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+	FunctionRNA *func;
+	
+	srna= RNA_def_struct(brna, "RenderEngine", NULL);
+	RNA_def_struct_sdna(srna, "RenderEngine");
+	RNA_def_struct_ui_text(srna, "Render Engine", "Render engine.");
+	RNA_def_struct_refine_func(srna, "rna_RenderEngine_refine");
+	RNA_def_struct_register_funcs(srna, "rna_RenderEngine_register", "rna_RenderEngine_unregister");
+
+	/* render */
+	func= RNA_def_function(srna, "render", NULL);
+	RNA_def_function_ui_description(func, "Render scene into an image.");
+	RNA_def_function_flag(func, FUNC_REGISTER);
+	RNA_def_pointer(func, "scene", "Scene", "", "");
+
+	func= RNA_def_function(srna, "begin_result", "RE_engine_begin_result");
+	prop= RNA_def_int(func, "x", 0, 0, INT_MAX, "X", "", 0, INT_MAX);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop= RNA_def_int(func, "y", 0, 0, INT_MAX, "Y", "", 0, INT_MAX);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop= RNA_def_int(func, "w", 0, 0, INT_MAX, "Width", "", 0, INT_MAX);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop= RNA_def_int(func, "h", 0, 0, INT_MAX, "Height", "", 0, INT_MAX);
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop= RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+	RNA_def_function_return(func, prop);
+
+	func= RNA_def_function(srna, "update_result", "RE_engine_update_result");
+	prop= RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+
+	func= RNA_def_function(srna, "end_result", "RE_engine_end_result");
+	prop= RNA_def_pointer(func, "result", "RenderResult", "Result", "");
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+
+	func= RNA_def_function(srna, "test_break", "RE_engine_test_break");
+	prop= RNA_def_boolean(func, "do_break", 0, "Break", "");
+	RNA_def_function_return(func, prop);
+
+	func= RNA_def_function(srna, "update_stats", "RE_engine_update_stats");
+	prop= RNA_def_string(func, "stats", "", 0, "Stats", "");
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+	prop= RNA_def_string(func, "info", "", 0, "Info", "");
+	RNA_def_property_flag(prop, PROP_REQUIRED);
+
+	/* registration */
+	RNA_define_verify_sdna(0);
+
+	prop= RNA_def_property(srna, "idname", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "type->idname");
+	RNA_def_property_flag(prop, PROP_REGISTER);
+
+	prop= RNA_def_property(srna, "label", PROP_STRING, PROP_NONE);
+	RNA_def_property_string_sdna(prop, NULL, "type->name");
+	RNA_def_property_flag(prop, PROP_REGISTER);
+
+	RNA_define_verify_sdna(1);
+}
+
 static void rna_def_render_result(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -205,6 +342,7 @@
 
 void RNA_def_render(BlenderRNA *brna)
 {
+	rna_def_render_engine(brna);
 	rna_def_render_result(brna);
 	rna_def_render_layer(brna);
 	rna_def_render_pass(brna);

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c	2009-07-21 20:05:16 UTC (rev 21780)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_scene.c	2009-07-21 20:28:32 UTC (rev 21781)
@@ -60,6 +60,8 @@
 
 #include "BLI_threads.h"
 
+#include "RE_pipeline.h"
+
 PointerRNA rna_Scene_objects_get(CollectionPropertyIterator *iter)
 {
 	ListBaseIterator *internal= iter->internal;
@@ -163,6 +165,48 @@
 	*max= MAX2(0, *max);
 }
 
+static void rna_SceneRenderData_engine_set(PointerRNA *ptr, int value)
+{
+	RenderData *rd= (RenderData*)ptr->data;
+	RenderEngineType *type= BLI_findlink(&R_engines, value);
+
+	if(type)
+		BLI_strncpy(rd->engine, type->idname, sizeof(rd->engine));
+}
+
+static EnumPropertyItem *rna_SceneRenderData_engine_itemf(bContext *C, PointerRNA *ptr, int *free)
+{
+	RenderEngineType *type;
+	EnumPropertyItem *item= NULL;
+	EnumPropertyItem tmp = {0, "", 0, "", ""};
+	int a=0, totitem= 0;
+
+	for(type=R_engines.first; type; type=type->next, a++) {
+		tmp.value= a;
+		tmp.identifier= type->idname;
+		tmp.name= type->name;
+		RNA_enum_item_add(&item, &totitem, &tmp);
+	}
+	
+	RNA_enum_item_end(&item, &totitem);
+	*free= 1;
+
+	return item;
+}
+
+static int rna_SceneRenderData_engine_get(PointerRNA *ptr)
+{
+	RenderData *rd= (RenderData*)ptr->data;
+	RenderEngineType *type;
+	int a= 0;
+
+	for(type=R_engines.first; type; type=type->next, a++)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list