From 6b2989ae7524f6728aa4cdfd2134fbf3dcd31315 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Tue, 2 Jan 2018 14:15:33 +0100 Subject: [PATCH] DRW: Fix small changes to transparent background. Fix changes introduced e3ef782af5d5 Eevee is in charge of rendering so it should be its task to have it's buffer initialized --- .../blender/draw/engines/eevee/eevee_engine.c | 20 +++++++++++++++---- source/blender/draw/intern/draw_manager.c | 8 ++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 31ce5d4174d..b5dfe8aef90 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -158,7 +158,12 @@ static void eevee_cache_finish(void *vedata) EEVEE_lightprobes_cache_finish(sldata, vedata); } -static void eevee_draw_scene(void *vedata) +/* As renders in an HDR offscreen buffer, we need draw everything once + * during the background pass. This way the other drawing callback between + * the background and the scene pass are visible. + * Note: we could break it up in two passes using some depth test + * to reduce the fillrate */ +static void eevee_draw_background(void *vedata) { EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl; EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl; @@ -207,7 +212,14 @@ static void eevee_draw_scene(void *vedata) DRW_framebuffer_texture_detach(dtxl->depth); DRW_framebuffer_texture_attach(fbl->main, dtxl->depth, 0, 0); DRW_framebuffer_bind(fbl->main); - DRW_framebuffer_clear(false, true, true, NULL, 1.0f); + if (DRW_state_draw_background()) { + DRW_framebuffer_clear(false, true, true, NULL, 1.0f); + } + else { + /* We need to clear the alpha chanel in this case. */ + float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f}; + DRW_framebuffer_clear(true, true, true, clear_col, 1.0f); + } if (((stl->effects->enabled_effects & EFFECT_TAA) != 0) && stl->effects->taa_current_sample > 1) { DRW_viewport_matrix_override_set(stl->effects->overide_persmat, DRW_MAT_PERS); @@ -418,8 +430,8 @@ DrawEngineType draw_engine_eevee_type = { &eevee_cache_init, &eevee_cache_populate, &eevee_cache_finish, - NULL, - &eevee_draw_scene, + &eevee_draw_background, + NULL, /* Everything is drawn in the background pass (see comment on function) */ &eevee_view_update, &eevee_id_update, }; diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 76a92be98d9..19535847160 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -2899,7 +2899,9 @@ static void drw_engines_draw_background(void) } /* No draw_background found, doing default background */ - DRW_draw_background(); + if (DRW_state_draw_background()) { + DRW_draw_background(); + } } static void drw_engines_draw_scene(void) @@ -3429,9 +3431,7 @@ void DRW_draw_render_loop_ex( /* Start Drawing */ DRW_state_reset(); - if (DRW_state_draw_background()) { - drw_engines_draw_background(); - } + drw_engines_draw_background(); /* WIP, single image drawn over the camera view (replace) */ bool do_bg_image = false;