fix for bug in rip tool, isolated verts would remain selected after ripping.
This commit is contained in:
@@ -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"
|
||||
|
||||
|
||||
@@ -69,6 +69,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
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -29,7 +29,6 @@
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "bmesh.h"
|
||||
#include "tools/bmesh_edgesplit.h"
|
||||
|
||||
#include "intern/bmesh_operators_private.h" /* own include */
|
||||
|
||||
|
||||
@@ -47,7 +47,6 @@
|
||||
#include "BKE_curve.h"
|
||||
|
||||
#include "bmesh.h"
|
||||
#include "tools/bmesh_edgesplit.h"
|
||||
|
||||
#include "intern/bmesh_operators_private.h" /* own include */
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -44,7 +44,6 @@
|
||||
#include "BKE_modifier.h"
|
||||
|
||||
#include "bmesh.h"
|
||||
#include "tools/bmesh_edgesplit.h"
|
||||
|
||||
#include "DNA_object_types.h"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user