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.
This commit is contained in:
2018-03-01 17:14:35 +11:00
parent b5cc55c822
commit eeae50fc1c
4 changed files with 32 additions and 5 deletions

View File

@@ -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);

View File

@@ -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();

View File

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

View File

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