73
* \brief Select Mode Clean
75
* Remove isolated selected elements when in a mode doesn't support them.
76
* eg: in edge-mode a selected vertex must be connected to a selected edge.
78
* \note this could be made apart of #BM_mesh_select_mode_flush_ex
80
void BM_mesh_select_mode_clean_ex(BMesh *bm, const short selectmode)
82
if (selectmode & SCE_SELECT_VERTEX) {
85
else if (selectmode & SCE_SELECT_EDGE) {
90
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
91
BM_elem_flag_disable(v, BM_ELEM_SELECT);
98
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
99
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
100
BM_vert_select_set(bm, e->v1, true);
101
BM_vert_select_set(bm, e->v2, true);
106
else if (selectmode & SCE_SELECT_FACE) {
109
if (bm->totvertsel) {
111
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
112
BM_elem_flag_disable(v, BM_ELEM_SELECT);
117
if (bm->totedgesel) {
119
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
120
BM_elem_flag_disable(e, BM_ELEM_SELECT);
125
if (bm->totfacesel) {
127
BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
128
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
129
BMLoop *l_iter, *l_first;
130
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
132
BM_edge_select_set(bm, l_iter->e, true);
133
} while ((l_iter = l_iter->next) != l_first);
140
void BM_mesh_select_mode_clean(BMesh *bm)
142
BM_mesh_select_mode_clean_ex(bm, bm->selectmode);
73
146
* \brief Select Mode Flush
75
148
* Makes sure to flush selections 'upwards'
329
402
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel -= 1;
330
403
BM_elem_flag_disable(e, BM_ELEM_SELECT);
332
if (bm->selectmode == SCE_SELECT_EDGE ||
333
bm->selectmode == SCE_SELECT_FACE ||
334
bm->selectmode == (SCE_SELECT_EDGE | SCE_SELECT_FACE))
405
if ((bm->selectmode & SCE_SELECT_VERTEX) == 0) {
338
407
BMVert *verts[2] = {e->v1, e->v2};
411
/* check if the vert is used by a selected edge */
342
412
for (i = 0; i < 2; i++) {
413
bool deselect = true;
345
415
for (e2 = BM_iter_new(&iter, bm, BM_EDGES_OF_VERT, verts[i]); e2; e2 = BM_iter_step(&iter)) {
501
571
BLI_assert((htype & ~BM_ALL_NOLOOP) == 0);
503
573
if (htype & BM_VERT) {
504
for (ele = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL); ele; ele = BM_iter_step(&iter)) {
574
BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
505
575
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) continue;
506
576
if (BM_elem_flag_test_bool(ele, hflag) == test_for_enabled) tot++;
509
579
if (htype & BM_EDGE) {
510
for (ele = BM_iter_new(&iter, bm, BM_EDGES_OF_MESH, NULL); ele; ele = BM_iter_step(&iter)) {
580
BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
511
581
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) continue;
512
582
if (BM_elem_flag_test_bool(ele, hflag) == test_for_enabled) tot++;
515
585
if (htype & BM_FACE) {
516
for (ele = BM_iter_new(&iter, bm, BM_FACES_OF_MESH, NULL); ele; ele = BM_iter_step(&iter)) {
586
BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
517
587
if (respecthide && BM_elem_flag_test(ele, BM_ELEM_HIDDEN)) continue;
518
588
if (BM_elem_flag_test_bool(ele, hflag) == test_for_enabled) tot++;
819
static BMEditSelection *bm_select_history_create(BMHeader *ele)
821
BMEditSelection *ese = (BMEditSelection *) MEM_callocN(sizeof(BMEditSelection), "BMEdit Selection");
822
ese->htype = ele->htype;
823
ese->ele = (BMElem *)ele;
750
827
/* --- macro wrapped funcs --- */
751
828
bool _bm_select_history_check(BMesh *bm, const BMHeader *ele)
768
845
void _bm_select_history_store_notest(BMesh *bm, BMHeader *ele)
770
BMEditSelection *ese = (BMEditSelection *) MEM_callocN(sizeof(BMEditSelection), "BMEdit Selection");
771
ese->htype = ele->htype;
772
ese->ele = (BMElem *)ele;
847
BMEditSelection *ese = bm_select_history_create(ele);
773
848
BLI_addtail(&(bm->selected), ese);
779
854
BM_select_history_store_notest(bm, (BMElem *)ele);
859
void _bm_select_history_store_after_notest(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele)
861
BMEditSelection *ese = bm_select_history_create(ele);
862
BLI_insertlinkafter(&(bm->selected), ese_ref, ese);
865
void _bm_select_history_store_after(BMesh *bm, BMEditSelection *ese_ref, BMHeader *ele)
867
if (!BM_select_history_check(bm, (BMElem *)ele)) {
868
BM_select_history_store_after_notest(bm, ese_ref, (BMElem *)ele);
782
871
/* --- end macro wrapped funcs --- */
792
881
void BM_select_history_validate(BMesh *bm)
794
BMEditSelection *ese, *nextese;
796
ese = bm->selected.first;
883
BMEditSelection *ese, *ese_next;
885
for (ese = bm->selected.first; ese; ese = ese_next) {
886
ese_next = ese->next;
800
887
if (!BM_elem_flag_test(ese->ele, BM_ELEM_SELECT)) {
801
888
BLI_freelinkN(&(bm->selected), ese);