Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2009-07-22 00:28:32 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2009-07-22 00:28:32 +0400
commitc354ea0ef12a2b214456b39832a141ed22479734 (patch)
treedc7126266bf5ac201f3e2086516733623873c5ee /source/blender/makesrna/intern/rna_render.c
parent6b8dae0874d774888374992fc3923affb451c45a (diff)
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.
Diffstat (limited to 'source/blender/makesrna/intern/rna_render.c')
-rw-r--r--source/blender/makesrna/intern/rna_render.c140
1 files changed, 139 insertions, 1 deletions
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 7eacb4079e5..0ed4e9fb80f 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -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 @@ static int rna_RenderPass_rect_length(PointerRNA *ptr)
#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 @@ static void rna_def_render_pass(BlenderRNA *brna)
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);