[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