diff options
author | mano-wii <germano.costa@ig.com.br> | 2019-05-16 05:05:08 +0300 |
---|---|---|
committer | mano-wii <germano.costa@ig.com.br> | 2019-05-16 05:19:59 +0300 |
commit | 4a766732e63c9c705b264b8d433db53b74db98db (patch) | |
tree | 71f8bd5245337bda953f8a95ccfdcd9ea3ae2fb4 /source/blender | |
parent | 68c12c80e501803f88b62f5f6f0f6a56bb53f303 (diff) |
Fix unreported: Presselection cycle not working in multiple meshes editing.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/include/ED_mesh.h | 4 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_select.c | 99 |
2 files changed, 63 insertions, 40 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h index c6d25e6f988..29bf8115a39 100644 --- a/source/blender/editors/include/ED_mesh.h +++ b/source/blender/editors/include/ED_mesh.h @@ -173,7 +173,7 @@ struct BMEdge *EDBM_edge_find_nearest_ex(struct ViewContext *vc, float *r_dist, float *r_dist_center, const bool use_select_bias, - const bool use_cycle, + bool use_cycle, struct BMEdge **r_eed_zbuf, struct Base **bases, uint bases_len, @@ -184,7 +184,7 @@ struct BMFace *EDBM_face_find_nearest_ex(struct ViewContext *vc, float *r_dist, float *r_dist_center, const bool use_select_bias, - const bool use_cycle, + bool use_cycle, struct BMFace **r_efa_zbuf, struct Base **bases, uint bases_len, diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index 5344537e2d1..36019443eb8 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -606,26 +606,32 @@ BMVert *EDBM_vert_find_nearest_ex(ViewContext *vc, struct NearestVertUserData data = {{0}}; const struct NearestVertUserData_Hit *hit; const eV3DProjTest clip_flag = V3D_PROJ_TEST_CLIP_DEFAULT; + BMesh *prev_select_bm = NULL; - static int prev_select_index = 0; - static const BMVert *prev_select_elem = NULL; - - if ((use_cycle == false) || - (prev_select_elem && - (prev_select_elem != BM_vert_at_index_find_or_table(vc->em->bm, prev_select_index)))) { - prev_select_index = 0; - prev_select_elem = NULL; - } + static struct { + int index; + const BMVert *elem; + const BMesh *bm; + } prev_select = {0}; data.mval_fl[0] = vc->mval[0]; data.mval_fl[1] = vc->mval[1]; data.use_select_bias = use_select_bias; data.use_cycle = use_cycle; - data.cycle_index_prev = prev_select_index; for (; base_index < bases_len; base_index++) { Base *base_iter = bases[base_index]; ED_view3d_viewcontext_init_object(vc, base_iter->object); + if (use_cycle && prev_select.bm == vc->em->bm && + prev_select.elem == BM_vert_at_index_find_or_table(vc->em->bm, prev_select.index)) { + data.cycle_index_prev = prev_select.index; + /* No need to compare in the rest of the loop. */ + use_cycle = false; + } + else { + data.cycle_index_prev = 0; + } + data.hit.dist = data.hit_cycle.dist = data.hit.dist_bias = data.hit_cycle.dist_bias = *r_dist; @@ -639,11 +645,13 @@ BMVert *EDBM_vert_find_nearest_ex(ViewContext *vc, *r_base_index = base_index; } *r_dist = hit->dist; + prev_select_bm = vc->em->bm; } } - prev_select_elem = hit->vert; - prev_select_index = hit->index; + prev_select.index = hit->index; + prev_select.elem = hit->vert; + prev_select.bm = prev_select_bm; return hit->vert; } @@ -774,7 +782,7 @@ BMEdge *EDBM_edge_find_nearest_ex(ViewContext *vc, float *r_dist, float *r_dist_center, const bool use_select_bias, - const bool use_cycle, + bool use_cycle, BMEdge **r_eed_zbuf, Base **bases, uint bases_len, @@ -848,27 +856,33 @@ BMEdge *EDBM_edge_find_nearest_ex(ViewContext *vc, const struct NearestEdgeUserData_Hit *hit; /* interpolate along the edge before doing a clipping plane test */ const eV3DProjTest clip_flag = V3D_PROJ_TEST_CLIP_DEFAULT & ~V3D_PROJ_TEST_CLIP_BB; + BMesh *prev_select_bm = NULL; - static int prev_select_index = 0; - static const BMEdge *prev_select_elem = NULL; - - if ((use_cycle == false) || - (prev_select_elem && - (prev_select_elem != BM_edge_at_index_find_or_table(vc->em->bm, prev_select_index)))) { - prev_select_index = 0; - prev_select_elem = NULL; - } + static struct { + int index; + const BMEdge *elem; + const BMesh *bm; + } prev_select = {0}; data.vc = *vc; data.mval_fl[0] = vc->mval[0]; data.mval_fl[1] = vc->mval[1]; data.use_select_bias = use_select_bias; data.use_cycle = use_cycle; - data.cycle_index_prev = prev_select_index; for (; base_index < bases_len; base_index++) { Base *base_iter = bases[base_index]; ED_view3d_viewcontext_init_object(vc, base_iter->object); + if (use_cycle && prev_select.bm == vc->em->bm && + prev_select.elem == BM_edge_at_index_find_or_table(vc->em->bm, prev_select.index)) { + data.cycle_index_prev = prev_select.index; + /* No need to compare in the rest of the loop. */ + use_cycle = false; + } + else { + data.cycle_index_prev = 0; + } + data.hit.dist = data.hit_cycle.dist = data.hit.dist_bias = data.hit_cycle.dist_bias = *r_dist; @@ -882,6 +896,7 @@ BMEdge *EDBM_edge_find_nearest_ex(ViewContext *vc, *r_base_index = base_index; } *r_dist = hit->dist; + prev_select_bm = vc->em->bm; } } @@ -889,8 +904,9 @@ BMEdge *EDBM_edge_find_nearest_ex(ViewContext *vc, *r_dist_center = hit->dist_center; } - prev_select_elem = hit->edge; - prev_select_index = hit->index; + prev_select.index = hit->index; + prev_select.elem = hit->edge; + prev_select.bm = prev_select_bm; return hit->edge; } @@ -978,7 +994,7 @@ BMFace *EDBM_face_find_nearest_ex(ViewContext *vc, float *r_dist, float *r_dist_center, const bool use_select_bias, - const bool use_cycle, + bool use_cycle, BMFace **r_efa_zbuf, Base **bases, uint bases_len, @@ -1050,26 +1066,31 @@ BMFace *EDBM_face_find_nearest_ex(ViewContext *vc, struct NearestFaceUserData data = {{0}}; const struct NearestFaceUserData_Hit *hit; const eV3DProjTest clip_flag = V3D_PROJ_TEST_CLIP_DEFAULT; + BMesh *prev_select_bm = NULL; - static int prev_select_index = 0; - static const BMFace *prev_select_elem = NULL; - - if ((use_cycle == false) || - (prev_select_elem && - (prev_select_elem != BM_face_at_index_find_or_table(vc->em->bm, prev_select_index)))) { - prev_select_index = 0; - prev_select_elem = NULL; - } + static struct { + int index; + const BMFace *elem; + const BMesh *bm; + } prev_select = {0}; data.mval_fl[0] = vc->mval[0]; data.mval_fl[1] = vc->mval[1]; data.use_select_bias = use_select_bias; data.use_cycle = use_cycle; - data.cycle_index_prev = prev_select_index; for (; base_index < bases_len; base_index++) { Base *base_iter = bases[base_index]; ED_view3d_viewcontext_init_object(vc, base_iter->object); + if (use_cycle && prev_select.bm == vc->em->bm && + prev_select.elem == BM_face_at_index_find_or_table(vc->em->bm, prev_select.index)) { + data.cycle_index_prev = prev_select.index; + /* No need to compare in the rest of the loop. */ + use_cycle = false; + } + else { + data.cycle_index_prev = 0; + } data.hit.dist = data.hit_cycle.dist = data.hit.dist_bias = data.hit_cycle.dist_bias = *r_dist; @@ -1084,6 +1105,7 @@ BMFace *EDBM_face_find_nearest_ex(ViewContext *vc, *r_base_index = base_index; } *r_dist = hit->dist; + prev_select_bm = vc->em->bm; } } @@ -1091,8 +1113,9 @@ BMFace *EDBM_face_find_nearest_ex(ViewContext *vc, *r_dist_center = hit->dist; } - prev_select_elem = hit->face; - prev_select_index = hit->index; + prev_select.index = hit->index; + prev_select.elem = hit->face; + prev_select.bm = prev_select_bm; return hit->face; } |