diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-03-14 11:38:37 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-03-14 11:38:37 +0400 |
commit | 9d896f8f84c69de009b70a31167d4b5327aac8d2 (patch) | |
tree | 541ccd726776c66d02ea148e364f02ff8c97fa95 /source/blender/render | |
parent | 6a51379bf7a6c0aaa9fcb1c4b60a33e903e75931 (diff) |
Border rendering now works for all scenes used in compositor,
before this only active scene would be rendered with border.
When do_render_fields_blur_3d() is finished, it'll modify
render's display rect so it'll correspond bordered render
result placed on black backgrund. Actual border is stored
nowhere, which makes it only way to re-calculate disprect
for all other renders used in compo based on source. Not
so big deal actually.
Also needed to modify Cycles a bit, because before this
patch it used border settings from scene being rendered.
Now made it so render data is passing to external engines.
Using a property inside RenderEngine structure for this.
Not best ever design for passing render data, but this
would prevent API breakage. So now external engines could
access engine.render to access active rendering settings.
Reviewed by Brecht, thanks!
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_engine.h | 3 | ||||
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 5 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 38 |
3 files changed, 42 insertions, 4 deletions
diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index b687acae1f7..5df860750fc 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -33,12 +33,14 @@ #define __RE_ENGINE_H__ #include "DNA_listBase.h" +#include "DNA_scene_types.h" #include "RNA_types.h" struct bNode; struct bNodeTree; struct Object; struct Render; +struct RenderData; struct RenderEngine; struct RenderEngineType; struct RenderLayer; @@ -134,6 +136,7 @@ void RE_engines_exit(void); RenderEngineType *RE_engines_find(const char *idname); void RE_engine_get_current_tiles(struct Render *re, int *total_tiles_r, rcti **tiles_r); +struct RenderData *RE_engine_get_render_data(struct Render *re); #endif /* __RE_ENGINE_H__ */ diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 22a49bcbbc3..4a48b6cc5f4 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -385,6 +385,11 @@ void RE_engine_get_current_tiles(Render *re, int *total_tiles_r, rcti **tiles_r) *tiles_r = tiles; } +RenderData *RE_engine_get_render_data(Render *re) +{ + return &re->r; +} + /* Render */ int RE_engine_render(Render *re, int do_all) diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 6cf9b8a0bbc..3c4eb814d79 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -456,13 +456,43 @@ void RE_InitState(Render *re, Render *source, RenderData *rd, SceneRenderLayer * re->i.starttime = PIL_check_seconds_timer(); re->r = *rd; /* hardcopy */ - + + if (source) { + /* reuse border flags from source renderer */ + re->r.mode &= ~(R_BORDER | R_CROP); + re->r.mode |= source->r.mode & (R_BORDER | R_CROP); + + /* dimensions shall be shared between all renderers */ + re->r.xsch = source->r.xsch; + re->r.ysch = source->r.ysch; + re->r.size = source->r.size; + } + re->winx = winx; re->winy = winy; - if (disprect) { + if (source && (source->r.mode & R_BORDER)) { + /* eeh, doesn't seem original bordered disprect is storing anywhere + * after insertion on black happening in do_render_fields_blur_3d(), + * so for now simply re-calculate disprect using border from source + * renderer (sergey) + */ + + re->disprect.xmin = source->r.border.xmin * winx; + re->disprect.xmax = source->r.border.xmax * winx; + + re->disprect.ymin = source->r.border.ymin * winy; + re->disprect.ymax = source->r.border.ymax * winy; + + re->rectx = BLI_rcti_size_x(&re->disprect); + re->recty = BLI_rcti_size_y(&re->disprect); + + /* copy border itself, since it could be used by external engines */ + re->r.border = source->r.border; + } + else if (disprect) { re->disprect = *disprect; - re->rectx = BLI_rcti_size_x(disprect); - re->recty = BLI_rcti_size_y(disprect); + re->rectx = BLI_rcti_size_x(&re->disprect); + re->recty = BLI_rcti_size_y(&re->disprect); } else { re->disprect.xmin = re->disprect.ymin = 0; |