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
This commit is contained in:
parent
981380cf6d
commit
41979fc03b
Notes:
blender-bot
2023-11-20 12:14:32 +01:00
Referenced by issue #84160, wrong depth of field by rendering an animation from Video Editor
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue