Commit: 143f4e52c55e346f5f47752d4929061c47346e3f
Author: Dalai Felinto
Date:   Wed Dec 20 15:28:12 2017 -0200
Branches: greasepencil-object
https://developer.blender.org/rB143f4e52c55e346f5f47752d4929061c47346e3f

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.

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

M       source/blender/draw/DRW_engine.h
M       source/blender/draw/engines/eevee/eevee_engine.c
M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/editors/space_view3d/view3d_draw.c

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

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 b717a867492..8c58e67f535 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 */
@@ -3424,7 +3425,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;
@@ -3511,7 +3515,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;
 
@@ -3525,6 +3529,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 */
@@ -3825,6 +3830,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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to