diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2017-12-20 20:28:12 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2017-12-20 21:05:47 +0300 |
commit | e3ef782af5d5255093d00cdc261d93dd3d8a5c40 (patch) | |
tree | 8c5d79b7988e418fc9565dfdd7177488df4da26b | |
parent | 03a589125f95fe4a8e8b2bb915453e6b0a2446bb (diff) |
Fix for T53599: OpenGL render with transparent background
I had to make Eevee draw its scene in the scene pass (before it was doing it
in the background pass). This is not ideal since reference images require
a separation between scene and background.
But it's the best way to solve it now. Clay is working fine.
-rw-r--r-- | source/blender/draw/DRW_engine.h | 1 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_engine.c | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 1 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 20 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/view3d_draw.c | 2 |
5 files changed, 23 insertions, 5 deletions
diff --git a/source/blender/draw/DRW_engine.h b/source/blender/draw/DRW_engine.h index ba0f8681f10..7efd9639874 100644 --- a/source/blender/draw/DRW_engine.h +++ b/source/blender/draw/DRW_engine.h @@ -95,6 +95,7 @@ void DRW_draw_render_loop_offscreen( struct Depsgraph *graph, struct RenderEngineType *engine_type, struct ARegion *ar, struct View3D *v3d, + const bool draw_background, struct GPUOffScreen *ofs); void DRW_draw_select_loop( struct Depsgraph *graph, diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c index 1466ed6adb7..b5806c9f8af 100644 --- a/source/blender/draw/engines/eevee/eevee_engine.c +++ b/source/blender/draw/engines/eevee/eevee_engine.c @@ -56,7 +56,7 @@ static void eevee_engine_init(void *ved) /* Alloc transient pointers */ stl->g_data = MEM_callocN(sizeof(*stl->g_data), __func__); } - stl->g_data->background_alpha = 1.0f; + stl->g_data->background_alpha = DRW_state_draw_background() ? 1.0f : 0.0f; stl->g_data->valid_double_buffer = (txl->color_double_buffer != NULL); DRWFboTexture tex = {&txl->color, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_MIPMAP}; @@ -414,8 +414,8 @@ DrawEngineType draw_engine_eevee_type = { &eevee_cache_init, &eevee_cache_populate, &eevee_cache_finish, + NULL, &eevee_draw_scene, - NULL, //&EEVEE_draw_scene &eevee_view_update, &eevee_id_update, }; diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 0753dbc7a1a..868c9ed1ebf 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -431,6 +431,7 @@ bool DRW_state_is_image_render(void); bool DRW_state_is_scene_render(void); bool DRW_state_show_text(void); bool DRW_state_draw_support(void); +bool DRW_state_draw_background(void); struct DRWTextStore *DRW_state_text_cache_get(void); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index e17aef34d47..80e11c2ac8b 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -354,6 +354,7 @@ static struct DRWGlobalState { unsigned int is_depth : 1; unsigned int is_image_render : 1; unsigned int is_scene_render : 1; + unsigned int draw_background : 1; } options; /* Current rendering context */ @@ -3416,7 +3417,10 @@ void DRW_draw_render_loop_ex( /* Start Drawing */ DRW_state_reset(); - drw_engines_draw_background(); + + if (DRW_state_draw_background()) { + drw_engines_draw_background(); + } /* WIP, single image drawn over the camera view (replace) */ bool do_bg_image = false; @@ -3503,7 +3507,7 @@ void DRW_draw_render_loop( void DRW_draw_render_loop_offscreen( struct Depsgraph *graph, RenderEngineType *engine_type, - ARegion *ar, View3D *v3d, GPUOffScreen *ofs) + ARegion *ar, View3D *v3d, const bool draw_background, GPUOffScreen *ofs) { RegionView3D *rv3d = ar->regiondata; @@ -3517,6 +3521,7 @@ void DRW_draw_render_loop_offscreen( /* Reset before using it. */ memset(&DST, 0x0, sizeof(DST)); DST.options.is_image_render = true; + DST.options.draw_background = draw_background; DRW_draw_render_loop_ex(graph, engine_type, ar, v3d, NULL); /* restore */ @@ -3817,6 +3822,17 @@ bool DRW_state_draw_support(void) ((v3d->flag2 & V3D_RENDER_OVERRIDE) == 0); } +/** + * Whether we should render the background + */ +bool DRW_state_draw_background(void) +{ + if (DRW_state_is_image_render() == false) { + return true; + } + return DST.options.draw_background; +} + /** \} */ diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 6ea2ff10af2..4a00329bd09 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2060,7 +2060,7 @@ void ED_view3d_draw_offscreen( /* XXX, should take depsgraph as arg */ Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, view_layer, false); BLI_assert(depsgraph != NULL); - DRW_draw_render_loop_offscreen(depsgraph, eval_ctx->engine_type, ar, v3d, ofs); + DRW_draw_render_loop_offscreen(depsgraph, eval_ctx->engine_type, ar, v3d, do_sky, ofs); } /* restore size */ |