diff options
-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) |