BMesh: optimize edge select
It's called a lot, so avoid using a generic iterator for edges of vert.
This commit is contained in:
@@ -41,6 +41,7 @@
|
|||||||
#include "BLI_listbase.h"
|
#include "BLI_listbase.h"
|
||||||
|
|
||||||
#include "bmesh.h"
|
#include "bmesh.h"
|
||||||
|
#include "bmesh_structure.h"
|
||||||
|
|
||||||
static void recount_totsels(BMesh *bm)
|
static void recount_totsels(BMesh *bm)
|
||||||
{
|
{
|
||||||
@@ -378,28 +379,24 @@ void BM_edge_select_set(BMesh *bm, BMEdge *e, const bool select)
|
|||||||
BM_elem_flag_disable(e, BM_ELEM_SELECT);
|
BM_elem_flag_disable(e, BM_ELEM_SELECT);
|
||||||
|
|
||||||
if ((bm->selectmode & SCE_SELECT_VERTEX) == 0) {
|
if ((bm->selectmode & SCE_SELECT_VERTEX) == 0) {
|
||||||
BMIter iter;
|
|
||||||
BMVert *verts[2] = {e->v1, e->v2};
|
|
||||||
BMEdge *e2;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* check if the vert is used by a selected edge */
|
/* check if the vert is used by a selected edge */
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
bool deselect = true;
|
bool deselect = true;
|
||||||
|
BMVert *v = *((&e->v1) + i);
|
||||||
|
BMEdge *e_other = e;
|
||||||
|
|
||||||
for (e2 = BM_iter_new(&iter, bm, BM_EDGES_OF_VERT, verts[i]); e2; e2 = BM_iter_step(&iter)) {
|
/* start by stepping over the current edge */
|
||||||
if (e2 == e) {
|
while ((e_other = bmesh_disk_edge_next(e_other, v)) != e) {
|
||||||
continue;
|
if (BM_elem_flag_test(e_other, BM_ELEM_SELECT)) {
|
||||||
}
|
|
||||||
|
|
||||||
if (BM_elem_flag_test(e2, BM_ELEM_SELECT)) {
|
|
||||||
deselect = false;
|
deselect = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deselect) {
|
if (deselect) {
|
||||||
BM_vert_select_set(bm, verts[i], false);
|
BM_vert_select_set(bm, v, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user