Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-09-16 02:32:04 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-09-16 02:40:45 +0300
commitfafc1fbd7fb36e284fbcbd8aa9060dd96c48d4e6 (patch)
tree8d40b3b4b9c1138f800c2640866f17ce8e8a6fd4
parent6624c4c225142742082c2d89f3f72ee937616864 (diff)
Fix T80107 Selection: Regression in Box selection
The Draw State now needs to be in sync with what the selection code set. We query the state just before locking it.
-rw-r--r--source/blender/draw/intern/draw_manager.c8
-rw-r--r--source/blender/draw/intern/draw_manager_exec.c32
2 files changed, 35 insertions, 5 deletions
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 835f0808d44..f6585550842 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2409,24 +2409,22 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
DRW_hair_update();
- DRW_state_lock(DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_ALWAYS | DRW_STATE_DEPTH_LESS_EQUAL |
- 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)) {
break;
}
+ DRW_state_lock(DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_TEST_ENABLED);
drw_engines_draw_scene();
+ DRW_state_lock(0);
+
if (!select_pass_fn(DRW_SELECT_PASS_POST, select_pass_user_data)) {
break;
}
}
- DRW_state_lock(0);
-
DRW_state_reset();
drw_engines_disable();
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 84f618c1c15..444ecbc1e54 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -294,6 +294,38 @@ static void drw_state_validate(void)
void DRW_state_lock(DRWState state)
{
DST.state_lock = state;
+
+ /* We must get the current state to avoid overriding it. */
+ /* Not complete, but that just what we need for now. */
+ if (state & DRW_STATE_WRITE_DEPTH) {
+ SET_FLAG_FROM_TEST(DST.state, GPU_depth_mask_get(), DRW_STATE_WRITE_DEPTH);
+ }
+ if (state & DRW_STATE_DEPTH_TEST_ENABLED) {
+ DST.state &= ~DRW_STATE_DEPTH_TEST_ENABLED;
+
+ switch (GPU_depth_test_get()) {
+ case GPU_DEPTH_ALWAYS:
+ DST.state |= DRW_STATE_DEPTH_ALWAYS;
+ break;
+ case GPU_DEPTH_LESS:
+ DST.state |= DRW_STATE_DEPTH_LESS;
+ break;
+ case GPU_DEPTH_LESS_EQUAL:
+ DST.state |= DRW_STATE_DEPTH_LESS_EQUAL;
+ break;
+ case GPU_DEPTH_EQUAL:
+ DST.state |= DRW_STATE_DEPTH_EQUAL;
+ break;
+ case GPU_DEPTH_GREATER:
+ DST.state |= DRW_STATE_DEPTH_GREATER;
+ break;
+ case GPU_DEPTH_GREATER_EQUAL:
+ DST.state |= DRW_STATE_DEPTH_GREATER_EQUAL;
+ break;
+ default:
+ break;
+ }
+ }
}
void DRW_state_reset(void)