[Bf-blender-cvs] [7330b347d77] tmp-overlay-engine: Fix In Front object selectability
Clément Foucault
noreply at git.blender.org
Tue Nov 26 16:06:14 CET 2019
Commit: 7330b347d770a0cfd7432b27c40ee7f000ed529a
Author: Clément Foucault
Date: Tue Nov 26 15:14:55 2019 +0100
Branches: tmp-overlay-engine
https://developer.blender.org/rB7330b347d770a0cfd7432b27c40ee7f000ed529a
Fix In Front object selectability
We use the same trick as before but we now isolate it to a drawmanager
state to avoid loosing track of the state.
===================================================================
M source/blender/draw/engines/overlay/overlay_armature.c
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_extra.c
M source/blender/draw/engines/overlay/overlay_metaball.c
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_manager_exec.c
===================================================================
diff --git a/source/blender/draw/engines/overlay/overlay_armature.c b/source/blender/draw/engines/overlay/overlay_armature.c
index 75a056a467a..622fd5909e7 100644
--- a/source/blender/draw/engines/overlay/overlay_armature.c
+++ b/source/blender/draw/engines/overlay/overlay_armature.c
@@ -183,9 +183,10 @@ void OVERLAY_armature_cache_init(OVERLAY_Data *vedata)
cb->custom_shapes_ghash = BLI_ghash_ptr_new(__func__);
+ DRWState infront_state = (DRW_state_is_select() && (i == 1)) ? DRW_STATE_IN_FRONT_SELECT : 0;
state = DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_LESS_EQUAL | DRW_STATE_CULL_BACK |
(pd->armature.transparent ? DRW_STATE_BLEND_ALPHA : DRW_STATE_WRITE_DEPTH);
- DRW_PASS_CREATE(*p_armature_ps, state | pd->clipping_state);
+ DRW_PASS_CREATE(*p_armature_ps, state | pd->clipping_state | infront_state);
DRWPass *armature_ps = *p_armature_ps;
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index e0f3ea4b0b1..833f4c49b14 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -385,9 +385,6 @@ static void OVERLAY_draw_scene(void *vedata)
GPU_framebuffer_clear_depth(fbl->overlay_in_front_fb, 1.0f);
}
}
- else if (DRW_state_is_select()) {
- /* TODO fix in_front selectability */
- }
OVERLAY_wireframe_in_front_draw(vedata);
OVERLAY_armature_in_front_draw(vedata);
diff --git a/source/blender/draw/engines/overlay/overlay_extra.c b/source/blender/draw/engines/overlay/overlay_extra.c
index a1ce8de8b5d..f22a2984ac1 100644
--- a/source/blender/draw/engines/overlay/overlay_extra.c
+++ b/source/blender/draw/engines/overlay/overlay_extra.c
@@ -75,8 +75,9 @@ void OVERLAY_extra_cache_init(OVERLAY_Data *vedata)
OVERLAY_ExtraCallBuffers *cb = &pd->extra_call_buffers[i];
DRWPass **p_extra_ps = &psl->extra_ps[i];
+ DRWState infront_state = (DRW_state_is_select() && (i == 1)) ? DRW_STATE_IN_FRONT_SELECT : 0;
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
- DRW_PASS_CREATE(*p_extra_ps, state | pd->clipping_state);
+ DRW_PASS_CREATE(*p_extra_ps, state | pd->clipping_state | infront_state);
DRWPass *extra_ps = *p_extra_ps;
diff --git a/source/blender/draw/engines/overlay/overlay_metaball.c b/source/blender/draw/engines/overlay/overlay_metaball.c
index 34a44f0c4fa..a634aed812c 100644
--- a/source/blender/draw/engines/overlay/overlay_metaball.c
+++ b/source/blender/draw/engines/overlay/overlay_metaball.c
@@ -42,8 +42,9 @@ void OVERLAY_metaball_cache_init(OVERLAY_Data *vedata)
#define BUF_INSTANCE DRW_shgroup_call_buffer_instance
for (int i = 0; i < 2; i++) {
+ DRWState infront_state = (DRW_state_is_select() && (i == 1)) ? DRW_STATE_IN_FRONT_SELECT : 0;
DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
- DRW_PASS_CREATE(psl->metaball_ps[i], state | pd->clipping_state);
+ DRW_PASS_CREATE(psl->metaball_ps[i], state | pd->clipping_state | infront_state);
/* Reuse armature shader as it's perfect to outline ellipsoids. */
struct GPUVertFormat *format = formats->instance_bone;
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 9852afb7960..40f4da7e870 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -346,6 +346,7 @@ typedef enum {
/** Use dual source blending. WARNING: Only one color buffer allowed. */
DRW_STATE_BLEND_CUSTOM = (1 << 23),
+ DRW_STATE_IN_FRONT_SELECT = (1 << 25),
DRW_STATE_LOGIC_INVERT = (1 << 26),
DRW_STATE_SHADOW_OFFSET = (1 << 27),
DRW_STATE_CLIP_PLANES = (1 << 28),
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index d313568e2e2..02667ad9d4a 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -321,6 +321,23 @@ void drw_state_set(DRWState state)
}
}
+ /* In Front objects selection */
+ {
+ int test;
+ if ((test = CHANGED_TO(DRW_STATE_IN_FRONT_SELECT))) {
+ if (test == 1) {
+ /* XXX `GPU_depth_range` is not a perfect solution
+ * since very distant geometries can still be occluded.
+ * Also the depth test precision of these geometries is impaired.
+ * However, it solves the selection for the vast majority of cases. */
+ GPU_depth_range(0.0f, 0.01f);
+ }
+ else {
+ GPU_depth_range(0.0f, 1.0f);
+ }
+ }
+ }
+
/* Logic Ops */
{
int test;
More information about the Bf-blender-cvs
mailing list