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