diff options
author | Richard Antalik <richardantalik@gmail.com> | 2021-01-26 19:40:35 +0300 |
---|---|---|
committer | Richard Antalik <richardantalik@gmail.com> | 2021-01-26 19:50:44 +0300 |
commit | 41979fc03b93ba8d55002311569536bf8c9ee983 (patch) | |
tree | ae441191f2e23084c168b24c4f1414529183ac1b /source | |
parent | 981380cf6d086517cc1b5dfc60e9bde6253e5bd7 (diff) |
Fix T84160: Wrong DOF when camera is overriden
Workbench engine used active camera to setup DOF effect even when
camera was overridden.
Store camera override in `WORKBENCH_PrivateData` and use it in
`workbench_dof_engine_init()`
Reviewed By: brecht
Differential Revision: https://developer.blender.org/D9952
Diffstat (limited to 'source')
5 files changed, 19 insertions, 8 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_data.c b/source/blender/draw/engines/workbench/workbench_data.c index c566b35cd34..4f689fd55a5 100644 --- a/source/blender/draw/engines/workbench/workbench_data.c +++ b/source/blender/draw/engines/workbench/workbench_data.c @@ -137,6 +137,15 @@ static void workbench_studiolight_data_update(WORKBENCH_PrivateData *wpd, WORKBE wd->use_specular = workbench_is_specular_highlight_enabled(wpd); } +void workbench_private_data_alloc(WORKBENCH_StorageList *stl) +{ + if (!stl->wpd) { + stl->wpd = MEM_callocN(sizeof(*stl->wpd), __func__); + stl->wpd->taa_sample_len_previous = -1; + stl->wpd->view_updated = true; + } +} + void workbench_private_data_init(WORKBENCH_PrivateData *wpd) { const DRWContextState *draw_ctx = DRW_context_state_get(); diff --git a/source/blender/draw/engines/workbench/workbench_effect_dof.c b/source/blender/draw/engines/workbench/workbench_effect_dof.c index fcee8c270dd..73cd501190f 100644 --- a/source/blender/draw/engines/workbench/workbench_effect_dof.c +++ b/source/blender/draw/engines/workbench/workbench_effect_dof.c @@ -133,14 +133,14 @@ void workbench_dof_engine_init(WORKBENCH_Data *vedata) const DRWContextState *draw_ctx = DRW_context_state_get(); RegionView3D *rv3d = draw_ctx->rv3d; View3D *v3d = draw_ctx->v3d; - Scene *scene = draw_ctx->scene; + Object *camera; if (v3d && rv3d) { camera = (rv3d->persp == RV3D_CAMOB) ? v3d->camera : NULL; } else { - camera = scene->camera; + camera = wpd->cam_original_ob; } Camera *cam = camera != NULL ? camera->data : NULL; diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c index 37dbfe4d2a6..bd5b61b26e9 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.c +++ b/source/blender/draw/engines/workbench/workbench_engine.c @@ -53,12 +53,7 @@ void workbench_engine_init(void *ved) workbench_shader_library_ensure(); - if (!stl->wpd) { - stl->wpd = MEM_callocN(sizeof(*stl->wpd), __func__); - stl->wpd->taa_sample_len_previous = -1; - stl->wpd->view_updated = true; - } - + workbench_private_data_alloc(stl); WORKBENCH_PrivateData *wpd = stl->wpd; workbench_private_data_init(wpd); workbench_update_world_ubo(wpd); diff --git a/source/blender/draw/engines/workbench/workbench_private.h b/source/blender/draw/engines/workbench/workbench_private.h index f3ff0616668..d157c260fbd 100644 --- a/source/blender/draw/engines/workbench/workbench_private.h +++ b/source/blender/draw/engines/workbench/workbench_private.h @@ -70,6 +70,7 @@ extern struct DrawEngineType draw_engine_workbench; #define OBJECT_ID_PASS_ENABLED(wpd) (OBJECT_OUTLINE_ENABLED(wpd) || CURVATURE_ENABLED(wpd)) #define NORMAL_ENCODING_ENABLED() (true) +struct Object; struct RenderEngine; struct RenderLayer; struct rcti; @@ -351,6 +352,9 @@ typedef struct WORKBENCH_PrivateData { float dof_rotation; float dof_ratio; + /* Camera override for rendering. */ + struct Object *cam_original_ob; + /** True if any volume needs to be rendered. */ bool volumes_do; /** Convenience boolean. */ @@ -504,6 +508,7 @@ DRWShadingGroup *workbench_image_setup_ex(WORKBENCH_PrivateData *wpd, workbench_image_setup_ex(wpd, ob, mat_nr, ima, iuser, interp, WORKBENCH_DATATYPE_HAIR) /* workbench_data.c */ +void workbench_private_data_alloc(WORKBENCH_StorageList *stl); void workbench_private_data_init(WORKBENCH_PrivateData *wpd); void workbench_update_world_ubo(WORKBENCH_PrivateData *wpd); void workbench_update_material_ubos(WORKBENCH_PrivateData *wpd); diff --git a/source/blender/draw/engines/workbench/workbench_render.c b/source/blender/draw/engines/workbench/workbench_render.c index 2c3b5a5f935..cec372ba732 100644 --- a/source/blender/draw/engines/workbench/workbench_render.c +++ b/source/blender/draw/engines/workbench/workbench_render.c @@ -175,6 +175,8 @@ void workbench_render(void *ved, RenderEngine *engine, RenderLayer *render_layer return; } + workbench_private_data_alloc(data->stl); + data->stl->wpd->cam_original_ob = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re)); workbench_engine_init(data); workbench_cache_init(data); |