diff options
-rw-r--r-- | source/blender/bmesh/bmesh.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_marking.c | 73 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_marking.h | 3 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_split_edges.c | 1 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_subdivide_edgering.c | 1 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_rip.c | 7 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_edgesplit.c | 1 |
7 files changed, 80 insertions, 7 deletions
diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h index 022dfe452e7..d1d93bbfd1d 100644 --- a/source/blender/bmesh/bmesh.h +++ b/source/blender/bmesh/bmesh.h @@ -271,6 +271,7 @@ extern "C" { #include "tools/bmesh_bevel.h" #include "tools/bmesh_decimate.h" +#include "tools/bmesh_edgesplit.h" #include "tools/bmesh_path.h" #include "tools/bmesh_triangulate.h" diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c index dfae7251c72..bec301acaa9 100644 --- a/source/blender/bmesh/intern/bmesh_marking.c +++ b/source/blender/bmesh/intern/bmesh_marking.c @@ -70,6 +70,79 @@ static void recount_totsels(BMesh *bm) } /** + * \brief Select Mode Clean + * + * Remove isolated selected elements when in a mode doesn't support them. + * eg: in edge-mode a selected vertex must be connected to a selected edge. + * + * \note this could be made apart of #BM_mesh_select_mode_flush_ex + */ +void BM_mesh_select_mode_clean_ex(BMesh *bm, const short selectmode) +{ + if (selectmode & SCE_SELECT_VERTEX) { + /* pass */ + } + else if (selectmode & SCE_SELECT_EDGE) { + BMIter iter; + + if (bm->totvertsel) { + BMVert *v; + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + BM_elem_flag_disable(v, BM_ELEM_SELECT); + } + bm->totvertsel = 0; + } + + if (bm->totedgesel) { + BMEdge *e; + BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { + if (BM_elem_flag_test(e, BM_ELEM_SELECT)) { + BM_vert_select_set(bm, e->v1, true); + BM_vert_select_set(bm, e->v2, true); + } + } + } + } + else if (selectmode & SCE_SELECT_FACE) { + BMIter iter; + + if (bm->totvertsel) { + BMVert *v; + BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { + BM_elem_flag_disable(v, BM_ELEM_SELECT); + } + bm->totvertsel = 0; + } + + if (bm->totedgesel) { + BMEdge *e; + BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { + BM_elem_flag_disable(e, BM_ELEM_SELECT); + } + bm->totedgesel = 0; + } + + if (bm->totfacesel) { + BMFace *f; + BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { + if (BM_elem_flag_test(f, BM_ELEM_SELECT)) { + BMLoop *l_iter, *l_first; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + BM_edge_select_set(bm, l_iter->e, true); + } while ((l_iter = l_iter->next) != l_first); + } + } + } + } +} + +void BM_mesh_select_mode_clean(BMesh *bm) +{ + BM_mesh_select_mode_clean_ex(bm, bm->selectmode); +} + +/** * \brief Select Mode Flush * * Makes sure to flush selections 'upwards' diff --git a/source/blender/bmesh/intern/bmesh_marking.h b/source/blender/bmesh/intern/bmesh_marking.h index b7040e63458..062de4f69e1 100644 --- a/source/blender/bmesh/intern/bmesh_marking.h +++ b/source/blender/bmesh/intern/bmesh_marking.h @@ -59,6 +59,9 @@ void BM_vert_select_set(BMesh *bm, BMVert *v, const bool select); void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select); void BM_face_select_set(BMesh *bm, BMFace *f, const bool select); +void BM_mesh_select_mode_clean_ex(BMesh *bm, const short selectmode); +void BM_mesh_select_mode_clean(BMesh *bm); + void BM_mesh_select_mode_set(BMesh *bm, int selectmode); void BM_mesh_select_mode_flush_ex(BMesh *bm, const short selectmode); void BM_mesh_select_mode_flush(BMesh *bm); diff --git a/source/blender/bmesh/operators/bmo_split_edges.c b/source/blender/bmesh/operators/bmo_split_edges.c index 88c1c3dca44..7eea4c4878d 100644 --- a/source/blender/bmesh/operators/bmo_split_edges.c +++ b/source/blender/bmesh/operators/bmo_split_edges.c @@ -29,7 +29,6 @@ #include "BLI_utildefines.h" #include "bmesh.h" -#include "tools/bmesh_edgesplit.h" #include "intern/bmesh_operators_private.h" /* own include */ diff --git a/source/blender/bmesh/operators/bmo_subdivide_edgering.c b/source/blender/bmesh/operators/bmo_subdivide_edgering.c index 9cc418d61ed..fa39ae68cdf 100644 --- a/source/blender/bmesh/operators/bmo_subdivide_edgering.c +++ b/source/blender/bmesh/operators/bmo_subdivide_edgering.c @@ -47,7 +47,6 @@ #include "BKE_curve.h" #include "bmesh.h" -#include "tools/bmesh_edgesplit.h" #include "intern/bmesh_operators_private.h" /* own include */ diff --git a/source/blender/editors/mesh/editmesh_rip.c b/source/blender/editors/mesh/editmesh_rip.c index 253aef7d5fe..59fe2a67057 100644 --- a/source/blender/editors/mesh/editmesh_rip.c +++ b/source/blender/editors/mesh/editmesh_rip.c @@ -50,8 +50,6 @@ #include "ED_transform.h" #include "ED_view3d.h" -#include "tools/bmesh_edgesplit.h" - #include "mesh_intern.h" /* own include */ /** @@ -941,6 +939,9 @@ static int edbm_rip_invoke__edge(bContext *C, wmOperator *op, const wmEvent *eve ar, projectMat, fmval); MEM_freeN(eloop_pairs); + /* deselect loose verts */ + BM_mesh_select_mode_clean_ex(bm, SCE_SELECT_EDGE); + if (do_fill && fill_uloop_pairs) { edbm_tagged_loop_pairs_do_fill_faces(bm, fill_uloop_pairs); MEM_freeN(fill_uloop_pairs); @@ -951,8 +952,6 @@ static int edbm_rip_invoke__edge(bContext *C, wmOperator *op, const wmEvent *eve return OPERATOR_CANCELLED; } - EDBM_selectmode_flush(em); - return OPERATOR_FINISHED; } diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c index d79360c58ef..b3d3e65e120 100644 --- a/source/blender/modifiers/intern/MOD_edgesplit.c +++ b/source/blender/modifiers/intern/MOD_edgesplit.c @@ -44,7 +44,6 @@ #include "BKE_modifier.h" #include "bmesh.h" -#include "tools/bmesh_edgesplit.h" #include "DNA_object_types.h" |