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:
authorRichard Antalik <richardantalik@gmail.com>2021-01-26 19:40:35 +0300
committerRichard Antalik <richardantalik@gmail.com>2021-01-26 19:50:44 +0300
commit41979fc03b93ba8d55002311569536bf8c9ee983 (patch)
treeae441191f2e23084c168b24c4f1414529183ac1b /source/blender
parent981380cf6d086517cc1b5dfc60e9bde6253e5bd7 (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/blender')
-rw-r--r--source/blender/draw/engines/workbench/workbench_data.c9
-rw-r--r--source/blender/draw/engines/workbench/workbench_effect_dof.c4
-rw-r--r--source/blender/draw/engines/workbench/workbench_engine.c7
-rw-r--r--source/blender/draw/engines/workbench/workbench_private.h5
-rw-r--r--source/blender/draw/engines/workbench/workbench_render.c2
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);