498
* Called by operators to remove elements that they have marked for
501
void BMO_remove_tagged_faces(BMesh *bm, const short oflag)
506
BM_ITER_MESH_MUTABLE (f, f_next, &iter, bm, BM_FACES_OF_MESH) {
507
if (BMO_elem_flag_test(bm, f, oflag)) {
513
void BMO_remove_tagged_edges(BMesh *bm, const short oflag)
518
BM_ITER_MESH_MUTABLE (e, e_next, &iter, bm, BM_EDGES_OF_MESH) {
519
if (BMO_elem_flag_test(bm, e, oflag)) {
525
void BMO_remove_tagged_verts(BMesh *bm, const short oflag)
530
BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
531
if (BMO_elem_flag_test(bm, v, oflag)) {
538
* you need to make remove tagged verts/edges/faces
539
* api functions that take a filter callback.....
540
* and this new filter type will be for opstack flags.
541
* This is because the BM_remove_taggedXXX functions bypass iterator API.
542
* - Ops don't care about 'UI' considerations like selection state, hide state, etc.
543
* If you want to work on unhidden selections for instance,
544
* copy output from a 'select context' operator to another operator....
547
static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag)
556
BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
557
if (BMO_elem_flag_test(bm, v, oflag)) {
559
BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) {
560
BMO_elem_flag_enable(bm, e, oflag);
563
BM_ITER_ELEM (f, &itersub, v, BM_FACES_OF_VERT) {
564
BMO_elem_flag_enable(bm, f, oflag);
569
BMO_remove_tagged_faces(bm, oflag);
570
BMO_remove_tagged_edges(bm, oflag);
571
BMO_remove_tagged_verts(bm, oflag);
574
static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag)
582
BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
583
if (BMO_elem_flag_test(bm, e, oflag)) {
584
BM_ITER_ELEM (f, &itersub, e, BM_FACES_OF_EDGE) {
585
BMO_elem_flag_enable(bm, f, oflag);
589
BMO_remove_tagged_faces(bm, oflag);
590
BMO_remove_tagged_edges(bm, oflag);
593
#define DEL_WIREVERT (1 << 10)
596
* \warning oflag applies to different types in some contexts,
597
* not just the type being removed.
599
* \warning take care, uses operator flag DEL_WIREVERT
601
void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
614
bmo_remove_tagged_context_verts(bm, oflag);
620
/* flush down to vert */
621
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
622
if (BMO_elem_flag_test(bm, e, oflag)) {
623
BMO_elem_flag_enable(bm, e->v1, oflag);
624
BMO_elem_flag_enable(bm, e->v2, oflag);
627
bmo_remove_tagged_context_edges(bm, oflag);
628
/* remove loose vertice */
629
BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
630
if (BMO_elem_flag_test(bm, v, oflag) && (!(v->e)))
631
BMO_elem_flag_enable(bm, v, DEL_WIREVERT);
633
BMO_remove_tagged_verts(bm, DEL_WIREVERT);
639
bmo_remove_tagged_context_edges(bm, oflag);
645
BMO_remove_tagged_faces(bm, oflag);
651
BMO_remove_tagged_faces(bm, oflag);
652
BMO_remove_tagged_edges(bm, oflag);
653
BMO_remove_tagged_verts(bm, oflag);
659
/* go through and mark all edges and all verts of all faces for delete */
660
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
661
if (BMO_elem_flag_test(bm, f, oflag)) {
662
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter))
663
BMO_elem_flag_enable(bm, e, oflag);
664
for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter))
665
BMO_elem_flag_enable(bm, v, oflag);
668
/* now go through and mark all remaining faces all edges for keeping */
669
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
670
if (!BMO_elem_flag_test(bm, f, oflag)) {
671
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) {
672
BMO_elem_flag_disable(bm, e, oflag);
674
for (v = BM_iter_new(&viter, bm, BM_VERTS_OF_FACE, f); v; v = BM_iter_step(&viter)) {
675
BMO_elem_flag_disable(bm, v, oflag);
679
/* also mark all the vertices of remaining edges for keeping */
680
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
681
if (!BMO_elem_flag_test(bm, e, oflag)) {
682
BMO_elem_flag_disable(bm, e->v1, oflag);
683
BMO_elem_flag_disable(bm, e->v2, oflag);
686
/* now delete marked face */
687
BMO_remove_tagged_faces(bm, oflag);
688
/* delete marked edge */
689
BMO_remove_tagged_edges(bm, oflag);
690
/* remove loose vertice */
691
BMO_remove_tagged_verts(bm, oflag);
697
/* does this option even belong in here? */
698
BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
699
BMO_elem_flag_enable(bm, f, oflag);
701
BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
702
BMO_elem_flag_enable(bm, e, oflag);
704
BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
705
BMO_elem_flag_enable(bm, v, oflag);
708
BMO_remove_tagged_faces(bm, oflag);
709
BMO_remove_tagged_edges(bm, oflag);
710
BMO_remove_tagged_verts(bm, oflag);
716
497
/*************************************************************/