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:
-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)