[Bf-blender-cvs] [eeae50fc1c8] blender2.8: DRW: add ability to lock states from changing

Campbell Barton noreply at git.blender.org
Thu Mar 1 07:12:22 CET 2018


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 */



More information about the Bf-blender-cvs mailing list