diff options
Diffstat (limited to 'source/blender/makesrna/intern/rna_render.c')
-rw-r--r-- | source/blender/makesrna/intern/rna_render.c | 140 |
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); |