diff options
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_engine.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 5d5bd7ea9ba..7d1f40ba5d8 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -401,7 +401,7 @@ static void eevee_id_world_update(void *vedata, World *wo) EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; LightCache *lcache = stl->g_data->light_cache; - if (lcache == NULL || lcache == stl->lookdev_lightcache) { + if (ELEM(lcache, NULL, stl->lookdev_lightcache)) { /* Avoid Lookdev viewport clearing the update flag (see T67741). */ return; } @@ -459,12 +459,28 @@ static void eevee_render_to_image(void *vedata, EEVEE_render_modules_init(vedata, engine, depsgraph); int initial_frame = CFRA; - int steps = max_ii(1, scene->eevee.motion_blur_steps); - int time_steps_tot = (do_motion_blur) ? steps : 1; + float initial_subframe = SUBFRA; + float shuttertime = (do_motion_blur) ? scene->eevee.motion_blur_shutter : 0.0f; + int time_steps_tot = (do_motion_blur) ? max_ii(1, scene->eevee.motion_blur_steps) : 1; g_data->render_tot_samples = divide_ceil_u(scene->eevee.taa_render_samples, time_steps_tot); - /* Centered on frame for now. */ - float time = CFRA - scene->eevee.motion_blur_shutter / 2.0f; - float time_step = scene->eevee.motion_blur_shutter / time_steps_tot; + /* Compute start time. The motion blur will cover `[time ...time + shuttertime]`. */ + float time = initial_frame + initial_subframe; + switch (scene->eevee.motion_blur_position) { + case SCE_EEVEE_MB_START: + /* No offset. */ + break; + case SCE_EEVEE_MB_CENTER: + time -= shuttertime * 0.5f; + break; + case SCE_EEVEE_MB_END: + time -= shuttertime; + break; + default: + BLI_assert(!"Invalid motion blur position enum!"); + break; + } + + float time_step = shuttertime / time_steps_tot; for (int i = 0; i < time_steps_tot && !RE_engine_test_break(engine); i++) { float time_prev = time; float time_curr = time + time_step * 0.5f; @@ -562,9 +578,9 @@ static void eevee_render_to_image(void *vedata, /* Restore original viewport size. */ DRW_render_viewport_size_set((int[2]){g_data->size_orig[0], g_data->size_orig[1]}); - if (CFRA != initial_frame) { + if (CFRA != initial_frame || SUBFRA != initial_subframe) { /* Restore original frame number. This is because the render pipeline expects it. */ - RE_engine_frame_set(engine, initial_frame, 0.0f); + RE_engine_frame_set(engine, initial_frame, initial_subframe); } } |