[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