Commit: eeae50fc1c86d4ec96910800658ba5f5aaa1f206
Author: Campbell Barton
Date:   Thu Mar 1 17:14:35 2018 +1100
Branches: blender2.8
https://developer.blender.org/rBeeae50fc1c86d4ec96910800658ba5f5aaa1f206

DRW: add ability to lock states from changing

Selection code relies on being able to set the depth functions
however passes have their own depth settings.

Add DRW_state_lock to ignore passes settings for particular flags.

This fixes occlusion queries cycling through objects under the cursor.

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

M       source/blender/draw/intern/DRW_render.h
M       source/blender/draw/intern/draw_manager.c
M       source/blender/draw/intern/draw_manager.h
M       source/blender/draw/intern/draw_manager_exec.c

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

diff --git a/source/blender/draw/intern/DRW_render.h 
b/source/blender/draw/intern/DRW_render.h
index 2a119651ffd..c83b67b00e5 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -451,6 +451,7 @@ void DRW_draw_region_engine_info(void);
 
 void DRW_state_reset_ex(DRWState state);
 void DRW_state_reset(void);
+void DRW_state_lock(DRWState state);
 
 void DRW_state_invert_facing(void);
 
diff --git a/source/blender/draw/intern/draw_manager.c 
b/source/blender/draw/intern/draw_manager.c
index 037053399c7..2d0b897a248 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1486,6 +1486,15 @@ void DRW_draw_select_loop(
        DRW_state_reset();
        DRW_draw_callbacks_pre_scene();
 
+
+       DRW_state_lock(
+               DRW_STATE_WRITE_DEPTH |
+               DRW_STATE_DEPTH_ALWAYS |
+               DRW_STATE_DEPTH_LESS |
+               DRW_STATE_DEPTH_EQUAL |
+               DRW_STATE_DEPTH_GREATER |
+               DRW_STATE_DEPTH_ALWAYS);
+
        /* Only 1-2 passes. */
        while (true) {
                if (!select_pass_fn(DRW_SELECT_PASS_PRE, 
select_pass_user_data)) {
@@ -1499,6 +1508,8 @@ void DRW_draw_select_loop(
                }
        }
 
+       DRW_state_lock(0);
+
        DRW_draw_callbacks_post_scene();
 
        DRW_state_reset();
diff --git a/source/blender/draw/intern/draw_manager.h 
b/source/blender/draw/intern/draw_manager.h
index 37646ec6dbb..a037915fff1 100644
--- a/source/blender/draw/intern/draw_manager.h
+++ b/source/blender/draw/intern/draw_manager.h
@@ -265,6 +265,7 @@ typedef struct DRWManager {
 
        /* Managed by `DRW_state_set`, `DRW_state_reset` */
        DRWState state;
+       DRWState state_lock;
        unsigned int stencil_mask;
 
        /* Per viewport */
diff --git a/source/blender/draw/intern/draw_manager_exec.c 
b/source/blender/draw/intern/draw_manager_exec.c
index 5538ed327a4..bc527d0337c 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -61,15 +61,18 @@ void drw_state_set(DRWState state)
        }
 
 #define CHANGED_TO(f) \
-       ((DST.state & (f)) ? \
-               ((state & (f)) ?  0 : -1) : \
-               ((state & (f)) ?  1 :  0))
+       ((((DST.state & (f)) ? \
+          ((state & (f)) ?  0 : -1) : \
+          ((state & (f)) ?  1 :  0))) && \
+        ((DST.state_lock & (f)) == 0))
 
 #define CHANGED_ANY(f) \
-       ((DST.state & (f)) != (state & (f)))
+       (((DST.state & (f)) != (state & (f))) && \
+        ((DST.state_lock & (f)) == 0))
 
 #define CHANGED_ANY_STORE_VAR(f, enabled) \
-       ((DST.state & (f)) != (enabled = (state & (f))))
+       (((DST.state & (f)) != (enabled = (state & (f)))) && \
+        (((DST.state_lock & (f)) == 0)))
 
        /* Depth Write */
        {
@@ -330,6 +333,17 @@ void DRW_state_reset_ex(DRWState state)
        drw_state_set(state);
 }
 
+/**
+ * Use with care, intended so selection code can override passes depth 
settings,
+ * which is important for selection to work properly.
+ *
+ * Should be set in main draw loop, cleared afterwards
+ */
+void DRW_state_lock(DRWState state)
+{
+       DST.state_lock = state;
+}
+
 void DRW_state_reset(void)
 {
        /* Reset blending function */

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

Reply via email to