diff options
Diffstat (limited to 'source/blender/render/intern/source/external_engine.c')
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 72 |
1 files changed, 50 insertions, 22 deletions
diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index fef453efce2..fd9d95c63b6 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -44,6 +44,7 @@ #include "BKE_camera.h" #include "BKE_global.h" +#include "BKE_colortools.h" #include "BKE_report.h" #include "BKE_scene.h" @@ -361,32 +362,56 @@ void RE_engine_set_error_message(RenderEngine *engine, const char *msg) Render *re = engine->re; if (re != NULL) { RenderResult *rr = RE_AcquireResultRead(re); - if (rr->error != NULL) { - MEM_freeN(rr->error); + if (rr) { + if (rr->error != NULL) { + MEM_freeN(rr->error); + } + rr->error = BLI_strdup(msg); } - rr->error = BLI_strdup(msg); RE_ReleaseResult(re); } } +const char *RE_engine_active_view_get(RenderEngine *engine) +{ + Render *re = engine->re; + return RE_GetActiveRenderView(re); +} + void RE_engine_active_view_set(RenderEngine *engine, const char *viewname) { Render *re = engine->re; RE_SetActiveRenderView(re, viewname); } -float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera) +float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera, int use_spherical_stereo) { Render *re = engine->re; + + /* when using spherical stereo, get camera shift without multiview, leaving stereo to be handled by the engine */ + if (use_spherical_stereo) + re = NULL; + return BKE_camera_multiview_shift_x(re ? &re->r : NULL, camera, re->viewname); } -void RE_engine_get_camera_model_matrix(RenderEngine *engine, Object *camera, float *r_modelmat) +void RE_engine_get_camera_model_matrix(RenderEngine *engine, Object *camera, int use_spherical_stereo, float *r_modelmat) { Render *re = engine->re; + + /* when using spherical stereo, get model matrix without multiview, leaving stereo to be handled by the engine */ + if (use_spherical_stereo) + re = NULL; + BKE_camera_multiview_model_matrix(re ? &re->r : NULL, camera, re->viewname, (float (*)[4])r_modelmat); } +int RE_engine_get_spherical_stereo(RenderEngine *engine, Object *camera) +{ + Render *re = engine->re; + return BKE_camera_multiview_spherical_stereo(re ? &re->r : NULL, camera) ? 1 : 0; +} + rcti* RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_free) { static rcti tiles_static[BLENDER_MAX_THREADS]; @@ -412,15 +437,18 @@ rcti* RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_ /* Just in case we're using crazy network rendering with more * slaves as BLENDER_MAX_THREADS. */ - if (tiles == tiles_static) - tiles = MEM_mallocN(allocation_step * sizeof(rcti), "current engine tiles"); - else - tiles = MEM_reallocN(tiles, (total_tiles + allocation_step) * sizeof(rcti)); - allocation_size += allocation_step; + if (tiles == tiles_static) { + /* Can not realloc yet, tiles are pointing to a + * stack memory. + */ + tiles = MEM_mallocN(allocation_size * sizeof(rcti), "current engine tiles"); + } + else { + tiles = MEM_reallocN(tiles, allocation_size * sizeof(rcti)); + } *r_needs_free = true; } - tiles[total_tiles] = pa->disprect; if (pa->crop) { @@ -448,13 +476,7 @@ void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene) { re->scene = scene; re->main = bmain; - re->r = scene->r; - - /* prevent crash when freeing the scene - * but it potentially leaves unfreed memory blocks - * not sure how to fix this yet -- dfelinto */ - BLI_listbase_clear(&re->r.layers); - BLI_listbase_clear(&re->r.views); + render_copy_renderdata(&re->r, &scene->r); } bool RE_bake_has_engine(Render *re) @@ -467,7 +489,8 @@ bool RE_bake_engine( Render *re, Object *object, const int object_id, const BakePixel pixel_array[], const size_t num_pixels, const int depth, - const ScenePassType pass_type, float result[]) + const ScenePassType pass_type, const int pass_filter, + float result[]) { RenderEngineType *type = RE_engines_find(re->r.engine); RenderEngine *engine; @@ -503,7 +526,7 @@ bool RE_bake_engine( type->update(engine, re->main, re->scene); if (type->bake) - type->bake(engine, re->scene, object, pass_type, object_id, pixel_array, num_pixels, depth, result); + type->bake(engine, re->scene, object, pass_type, pass_filter, object_id, pixel_array, num_pixels, depth, result); engine->tile_x = 0; engine->tile_y = 0; @@ -596,7 +619,7 @@ int RE_engine_render(Render *re, int do_all) if (re->r.scemode & R_SINGLE_LAYER) { srl = BLI_findlink(&re->r.layers, re->r.actlay); if (srl) { - non_excluded_lay |= ~srl->lay_exclude; + non_excluded_lay |= ~(srl->lay_exclude & ~srl->lay_zmask); /* in this case we must update all because animation for * the scene has not been updated yet, and so may not be @@ -608,7 +631,7 @@ int RE_engine_render(Render *re, int do_all) else { for (srl = re->r.layers.first; srl; srl = srl->next) { if (!(srl->layflag & SCE_LAY_DISABLE)) { - non_excluded_lay |= ~srl->lay_exclude; + non_excluded_lay |= ~(srl->lay_exclude & ~srl->lay_zmask); if (render_layer_exclude_animated(re->scene, srl)) non_excluded_lay |= ~0; @@ -642,6 +665,11 @@ int RE_engine_render(Render *re, int do_all) if (re->draw_lock) { re->draw_lock(re->dlh, 0); } + /* Too small image is handled earlier, here it could only happen if + * there was no sufficient memory to allocate all passes. + */ + BKE_report(re->reports, RPT_ERROR, "Failed allocate render result, out of memory"); + G.is_break = true; return 1; } |