[Bf-blender-cvs] [d78bd78c141] tmp-overlay-engine: Overlay Engine: Fix background image and sort empty images by Z depth

Clément Foucault noreply at git.blender.org
Mon Nov 18 20:15:35 CET 2019


Commit: d78bd78c141cc16ec5dde4c1547cdf39ba22db12
Author: Clément Foucault
Date:   Mon Nov 18 20:12:21 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rBd78bd78c141cc16ec5dde4c1547cdf39ba22db12

Overlay Engine: Fix background image and sort empty images by Z depth

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

M	source/blender/draw/engines/overlay/overlay_image.c
M	source/blender/draw/engines/overlay/overlay_private.h
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager_data.c

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

diff --git a/source/blender/draw/engines/overlay/overlay_image.c b/source/blender/draw/engines/overlay/overlay_image.c
index d9af32b860f..a6915de8245 100644
--- a/source/blender/draw/engines/overlay/overlay_image.c
+++ b/source/blender/draw/engines/overlay/overlay_image.c
@@ -42,9 +42,13 @@ void OVERLAY_image_cache_init(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
   OVERLAY_PrivateData *pd = vedata->stl->pd;
+  DRWState state;
 
-  DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ALPHA_UNDER_PREMUL;
-  DRW_PASS_CREATE(psl->image_background_ps, state);
+  state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_GREATER | DRW_STATE_BLEND_ALPHA_UNDER_PREMUL;
+  DRW_PASS_CREATE(psl->image_background_under_ps, state);
+
+  state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_BLEND_ALPHA;
+  DRW_PASS_CREATE(psl->image_background_over_ps, state);
 
   state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS;
   DRW_PASS_CREATE(psl->image_empties_ps, state | pd->clipping_state);
@@ -311,19 +315,28 @@ void OVERLAY_image_camera_cache_populate(OVERLAY_Data *vedata, Object *ob)
       image_camera_background_matrix_get(cam, bgpic, draw_ctx, aspect, mat);
 
       mul_m4_m4m4(mat, norm_obmat, mat);
-
-      DRWPass *pass = (bgpic->flag & CAM_BGIMG_FLAG_FOREGROUND) ? psl->image_foreground_ps :
-                                                                  psl->image_background_ps;
-      GPUShader *sh = OVERLAY_shader_image();
-      DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
-      float color[4] = {1.0f, 1.0f, 1.0f, bgpic->alpha};
-      DRW_shgroup_uniform_texture(grp, "imgTexture", tex);
-      DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult);
-      DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", true);
-      DRW_shgroup_uniform_bool_copy(grp, "imgLinear", !DRW_state_do_color_management());
-      DRW_shgroup_uniform_bool_copy(grp, "depthSet", true);
-      DRW_shgroup_uniform_vec4_copy(grp, "color", color);
-      DRW_shgroup_call_obmat(grp, DRW_cache_empty_image_plane_get(), mat);
+      const bool is_foreground = (bgpic->flag & CAM_BGIMG_FLAG_FOREGROUND) != 0;
+
+      /* When drawing background we do 2 passes.
+       * - One alpha over, which works where background is visible.
+       * - One alpha under, works under partially visible objects. (only in cycles)
+       * This approach is not ideal and should be revisited.
+       **/
+      for (int i = 0; i < (is_foreground ? 1 : 2); i++) {
+        DRWPass *pass = is_foreground ? psl->image_foreground_ps :
+                                        ((i == 0) ? psl->image_background_under_ps :
+                                                    psl->image_background_over_ps);
+        GPUShader *sh = OVERLAY_shader_image();
+        DRWShadingGroup *grp = DRW_shgroup_create(sh, pass);
+        float color[4] = {1.0f, 1.0f, 1.0f, bgpic->alpha};
+        DRW_shgroup_uniform_texture(grp, "imgTexture", tex);
+        DRW_shgroup_uniform_bool_copy(grp, "imgPremultiplied", use_alpha_premult);
+        DRW_shgroup_uniform_bool_copy(grp, "imgAlphaBlend", true);
+        DRW_shgroup_uniform_bool_copy(grp, "imgLinear", !DRW_state_do_color_management());
+        DRW_shgroup_uniform_bool_copy(grp, "depthSet", true);
+        DRW_shgroup_uniform_vec4_copy(grp, "color", color);
+        DRW_shgroup_call_obmat(grp, DRW_cache_empty_image_plane_get(), mat);
+      }
     }
   }
 }
@@ -405,16 +418,22 @@ void OVERLAY_image_empty_cache_populate(OVERLAY_Data *vedata, Object *ob)
   }
 }
 
-void OVERLAY_image_cache_finish(OVERLAY_Data *UNUSED(vedata))
+void OVERLAY_image_cache_finish(OVERLAY_Data *vedata)
 {
-  /* Order by Z depth. */
+  OVERLAY_PassList *psl = vedata->psl;
+
+  DRW_pass_sort_shgroup_reverse(psl->image_background_under_ps);
+  DRW_pass_sort_shgroup_z(psl->image_empties_blend_ps);
+  DRW_pass_sort_shgroup_z(psl->image_empties_front_ps);
+  DRW_pass_sort_shgroup_z(psl->image_empties_back_ps);
 }
 
 void OVERLAY_image_draw(OVERLAY_Data *vedata)
 {
   OVERLAY_PassList *psl = vedata->psl;
   /* TODO better ordering with other passes. */
-  DRW_draw_pass(psl->image_background_ps);
+  DRW_draw_pass(psl->image_background_over_ps);
+  DRW_draw_pass(psl->image_background_under_ps);
   DRW_draw_pass(psl->image_empties_back_ps);
 
   DRW_draw_pass(psl->image_empties_ps);
diff --git a/source/blender/draw/engines/overlay/overlay_private.h b/source/blender/draw/engines/overlay/overlay_private.h
index 2404d7389d8..566901ec65b 100644
--- a/source/blender/draw/engines/overlay/overlay_private.h
+++ b/source/blender/draw/engines/overlay/overlay_private.h
@@ -68,7 +68,8 @@ typedef struct OVERLAY_PassList {
   DRWPass *extra_centers_ps;
   DRWPass *facing_ps;
   DRWPass *grid_ps;
-  DRWPass *image_background_ps;
+  DRWPass *image_background_under_ps;
+  DRWPass *image_background_over_ps;
   DRWPass *image_empties_ps;
   DRWPass *image_empties_back_ps;
   DRWPass *image_empties_blend_ps;
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 3165995fc79..069fbc2992a 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -550,6 +550,7 @@ void DRW_pass_foreach_shgroup(DRWPass *pass,
                               void (*callback)(void *userData, DRWShadingGroup *shgrp),
                               void *userData);
 void DRW_pass_sort_shgroup_z(DRWPass *pass);
+void DRW_pass_sort_shgroup_reverse(DRWPass *pass);
 
 bool DRW_pass_is_empty(DRWPass *pass);
 
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index 87aef7221b8..ff6fdde80a2 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -1950,4 +1950,14 @@ void DRW_pass_sort_shgroup_z(DRWPass *pass)
   pass->shgroups.last = last;
 }
 
+/**
+ * Reverse Shading group submission order.
+ */
+void DRW_pass_sort_shgroup_reverse(DRWPass *pass)
+{
+  pass->shgroups.last = pass->shgroups.first;
+  /* WARNING: Assume that DRWShadingGroup->next is the first member. */
+  BLI_linklist_reverse((LinkNode **)&pass->shgroups.first);
+}
+
 /** \} */



More information about the Bf-blender-cvs mailing list