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