[Bf-blender-cvs] [41979fc03b9] blender-v2.92-release: Fix T84160: Wrong DOF when camera is overriden

Richard Antalik noreply at git.blender.org
Tue Jan 26 17:51:13 CET 2021


Commit: 41979fc03b93ba8d55002311569536bf8c9ee983
Author: Richard Antalik
Date:   Tue Jan 26 17:40:35 2021 +0100
Branches: blender-v2.92-release
https://developer.blender.org/rB41979fc03b93ba8d55002311569536bf8c9ee983

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

===================================================================

M	source/blender/draw/engines/workbench/workbench_data.c
M	source/blender/draw/engines/workbench/workbench_effect_dof.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/engines/workbench/workbench_private.h
M	source/blender/draw/engines/workbench/workbench_render.c

===================================================================

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



More information about the Bf-blender-cvs mailing list