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:
authorMai Lavelle <mai.lavelle@gmail.com>2017-01-11 18:43:11 +0300
committerMai Lavelle <mai.lavelle@gmail.com>2017-01-13 04:41:24 +0300
commit41dd0c4554fca73432ee3d41131e169cce3abb7b (patch)
tree2c226da490fca3c1b06cb2d779437a6028f0c64e
parent11c9e0eb97b0dc8b16a1ce21d78c6a8ad7ddd8ae (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.c11
-rw-r--r--source/blender/makesrna/intern/rna_render.c36
-rw-r--r--source/blender/render/extern/include/RE_engine.h2
-rw-r--r--source/blender/render/intern/source/external_engine.c4
-rw-r--r--source/blender/render/intern/source/initrender.c16
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)