diff options
author | Mai Lavelle <mai.lavelle@gmail.com> | 2017-01-11 18:43:11 +0300 |
---|---|---|
committer | Mai Lavelle <mai.lavelle@gmail.com> | 2017-01-13 04:41:24 +0300 |
commit | 41dd0c4554fca73432ee3d41131e169cce3abb7b (patch) | |
tree | 2c226da490fca3c1b06cb2d779437a6028f0c64e | |
parent | 11c9e0eb97b0dc8b16a1ce21d78c6a8ad7ddd8ae (diff) |
Add get_ideal_tile_size function to RenderEngine
This allows render engines to specify an ideal tile size to use while
rendering. The function is optional, if provided the returned tile size
will override the scene settings, if not provided the original behavior
will be used.
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 11 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_render.c | 36 | ||||
-rw-r--r-- | source/blender/render/extern/include/RE_engine.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 4 | ||||
-rw-r--r-- | source/blender/render/intern/source/initrender.c | 16 |
5 files changed, 62 insertions, 7 deletions
diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index f23e587e55d..74b38bdb88f 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -3534,8 +3534,15 @@ static bool view3d_main_region_draw_engine(const bContext *C, Scene *scene, engine = RE_engine_create_ex(type, true); - engine->tile_x = scene->r.tilex; - engine->tile_y = scene->r.tiley; + int tile_x = scene->r.tilex; + int tile_y = scene->r.tiley; + + if(type->get_ideal_tile_size) { + type->get_ideal_tile_size(engine, scene, &tile_x, &tile_y); + } + + engine->tile_x = tile_x; + engine->tile_y = tile_y; type->view_update(engine, C); diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index d69ae2b78bb..8f6ebace13a 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -256,6 +256,29 @@ static void engine_update_script_node(RenderEngine *engine, struct bNodeTree *nt RNA_parameter_list_free(&list); } +static void engine_get_ideal_tile_size(RenderEngine *engine, struct Scene *scene, int *tile_x, int *tile_y) +{ + extern FunctionRNA rna_RenderEngine_get_ideal_tile_size_func; + PointerRNA ptr; + ParameterList list; + FunctionRNA *func; + void *tile_x_res, *tile_y_res; + + RNA_pointer_create(NULL, engine->type->ext.srna, engine, &ptr); + func = &rna_RenderEngine_get_ideal_tile_size_func; + + RNA_parameter_list_create(&list, &ptr, func); + RNA_parameter_set_lookup(&list, "scene", &scene); + engine->type->ext.call(NULL, &ptr, func, &list); + + RNA_parameter_get_lookup(&list, "tile_x", &tile_x_res); + RNA_parameter_get_lookup(&list, "tile_y", &tile_y_res); + *tile_x = *(int*)tile_x_res; + *tile_y = *(int*)tile_y_res; + + RNA_parameter_list_free(&list); +} + /* RenderEngine registration */ static void rna_RenderEngine_unregister(Main *UNUSED(bmain), StructRNA *type) @@ -276,7 +299,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo RenderEngineType *et, dummyet = {NULL}; RenderEngine dummyengine = {NULL}; PointerRNA dummyptr; - int have_function[6]; + int have_function[7]; /* setup dummy engine & engine type to store static properties in */ dummyengine.type = &dummyet; @@ -318,6 +341,7 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo et->view_update = (have_function[3]) ? engine_view_update : NULL; et->view_draw = (have_function[4]) ? engine_view_draw : NULL; et->update_script_node = (have_function[5]) ? engine_update_script_node : NULL; + et->get_ideal_tile_size = (have_function[6]) ? engine_get_ideal_tile_size : NULL; BLI_addtail(&R_engines, et); @@ -484,6 +508,16 @@ static void rna_def_render_engine(BlenderRNA *brna) parm = RNA_def_pointer(func, "node", "Node", "", ""); RNA_def_parameter_flags(parm, 0, PARM_RNAPTR); + /* engine query callbacks */ + func = RNA_def_function(srna, "get_ideal_tile_size", NULL); + RNA_def_function_ui_description(func, "Query ideal tile size"); + RNA_def_function_flag(func, FUNC_REGISTER_OPTIONAL | FUNC_ALLOW_WRITE); + RNA_def_pointer(func, "scene", "Scene", "", ""); + parm = RNA_def_int(func, "tile_x", 0, 0, INT_MAX, "Width", "", 0, INT_MAX); + RNA_def_function_return(func, parm); + parm = RNA_def_int(func, "tile_y", 0, 0, INT_MAX, "Height", "", 0, INT_MAX); + RNA_def_function_return(func, parm); + /* tag for redraw */ func = RNA_def_function(srna, "tag_redraw", "engine_tag_redraw"); RNA_def_function_ui_description(func, "Request redraw for viewport rendering"); diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index f83a210275f..4db899d8f63 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -97,6 +97,8 @@ typedef struct RenderEngineType { void (*update_script_node)(struct RenderEngine *engine, struct bNodeTree *ntree, struct bNode *node); + void (*get_ideal_tile_size)(struct RenderEngine *engine, struct Scene *scene, int *tile_x, int *tile_y); + /* RNA integration */ ExtensionRNA ext; } RenderEngineType; diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index fd9d95c63b6..39044cccfee 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -518,8 +518,8 @@ bool RE_bake_engine( engine->resolution_y = re->winy; RE_parts_init(re, false); - engine->tile_x = re->r.tilex; - engine->tile_y = re->r.tiley; + engine->tile_x = re->partx; + engine->tile_y = re->party; /* update is only called so we create the engine.session */ if (type->update) diff --git a/source/blender/render/intern/source/initrender.c b/source/blender/render/intern/source/initrender.c index 970a3937657..4ea091e335a 100644 --- a/source/blender/render/intern/source/initrender.c +++ b/source/blender/render/intern/source/initrender.c @@ -52,6 +52,8 @@ #include "quicktime_export.h" #endif +#include "RE_engine.h" + /* this module */ #include "renderpipeline.h" #include "render_types.h" @@ -538,9 +540,19 @@ void RE_parts_free(Render *re) void RE_parts_clamp(Render *re) { + RenderEngineType *type = RE_engines_find(re->r.engine); + int tilex, tiley; + + tilex = re->r.tilex; + tiley = re->r.tiley; + + if(re->engine && type->get_ideal_tile_size) { + type->get_ideal_tile_size(re->engine, re->scene, &tilex, &tiley); + } + /* part size */ - re->partx = max_ii(1, min_ii(re->r.tilex, re->rectx)); - re->party = max_ii(1, min_ii(re->r.tiley, re->recty)); + re->partx = max_ii(1, min_ii(tilex, re->rectx)); + re->party = max_ii(1, min_ii(tiley, re->recty)); } void RE_parts_init(Render *re, bool do_crop) |