Changeset View
Changeset View
Standalone View
Standalone View
source/blender/bmesh/operators/bmo_dissolve.c
| Show First 20 Lines • Show All 236 Lines • ▼ Show 20 Lines | void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op) | ||||
| if (use_verts) { | if (use_verts) { | ||||
| BMIter viter; | BMIter viter; | ||||
| BMVert *v, *v_next; | BMVert *v, *v_next; | ||||
| BM_ITER_MESH_MUTABLE (v, v_next, &viter, bm, BM_VERTS_OF_MESH) { | BM_ITER_MESH_MUTABLE (v, v_next, &viter, bm, BM_VERTS_OF_MESH) { | ||||
| if (BMO_vert_flag_test(bm, v, VERT_MARK)) { | if (BMO_vert_flag_test(bm, v, VERT_MARK)) { | ||||
| if (BM_vert_is_edge_pair(v)) { | if (BM_vert_is_edge_pair(v)) { | ||||
| BM_vert_collapse_edge(bm, v->e, v, true, true); | BM_vert_collapse_edge(bm, v->e, v, true, true, true); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (BMO_error_occurred(bm)) { | if (BMO_error_occurred(bm)) { | ||||
| goto cleanup; | goto cleanup; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 68 Lines • ▼ Show 20 Lines | void bmo_dissolve_edges_exec(BMesh *bm, BMOperator *op) | ||||
| BMO_ITER (e, &eiter, op->slots_in, "edges", BM_EDGE) { | BMO_ITER (e, &eiter, op->slots_in, "edges", BM_EDGE) { | ||||
| BMLoop *l_a, *l_b; | BMLoop *l_a, *l_b; | ||||
| if (BM_edge_loop_pair(e, &l_a, &l_b)) { | if (BM_edge_loop_pair(e, &l_a, &l_b)) { | ||||
| BMFace *f_new; | BMFace *f_new; | ||||
| /* join faces */ | /* join faces */ | ||||
| f_new = BM_faces_join_pair(bm, l_a, l_b, false); | f_new = BM_faces_join_pair(bm, l_a, l_b, false); | ||||
| if (f_new && BM_face_find_double(f_new)) { | |||||
| BM_face_kill(bm, f_new); | |||||
| f_new = NULL; | |||||
| } | |||||
| if (f_new) { | if (f_new) { | ||||
| /* maintain active face */ | /* maintain active face */ | ||||
| if (act_face && bm->act_face == NULL) { | if (act_face && bm->act_face == NULL) { | ||||
| bm->act_face = f_new; | bm->act_face = f_new; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| Show All 12 Lines | BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) { | ||||
| } | } | ||||
| } | } | ||||
| /* done with cleanup */ | /* done with cleanup */ | ||||
| if (use_verts) { | if (use_verts) { | ||||
| BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) { | BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) { | ||||
| if (BMO_vert_flag_test(bm, v, VERT_MARK)) { | if (BMO_vert_flag_test(bm, v, VERT_MARK)) { | ||||
| if (BM_vert_is_edge_pair(v)) { | if (BM_vert_is_edge_pair(v)) { | ||||
| BM_vert_collapse_edge(bm, v->e, v, true, true); | BM_vert_collapse_edge(bm, v->e, v, true, true, true); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op) | void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) { | ||||
| if (!BMO_vert_flag_test(bm, v, VERT_MARK_PAIR)) { | if (!BMO_vert_flag_test(bm, v, VERT_MARK_PAIR)) { | ||||
| BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) { | BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) { | ||||
| BMLoop *l_a, *l_b; | BMLoop *l_a, *l_b; | ||||
| if (BM_edge_loop_pair(e, &l_a, &l_b)) { | if (BM_edge_loop_pair(e, &l_a, &l_b)) { | ||||
| BMFace *f_new; | BMFace *f_new; | ||||
| /* join faces */ | /* join faces */ | ||||
| f_new = BM_faces_join_pair(bm, l_a, l_b, false); | f_new = BM_faces_join_pair(bm, l_a, l_b, false); | ||||
| if (f_new && BM_face_find_double(f_new)) { | |||||
| BM_face_kill(bm, f_new); | |||||
| f_new = NULL; | |||||
| } | |||||
| if (f_new) { | |||||
| /* maintain active face */ | /* maintain active face */ | ||||
| if (act_face && bm->act_face == NULL) { | if (act_face && bm->act_face == NULL) { | ||||
| bm->act_face = f_new; | bm->act_face = f_new; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| /* Cleanup geometry (#BM_faces_join_pair, but it removes geometry we're looping on) | /* Cleanup geometry (#BM_faces_join_pair, but it removes geometry we're looping on) | ||||
| * so do this in a separate pass instead. */ | * so do this in a separate pass instead. */ | ||||
| BM_ITER_MESH_MUTABLE (e, e_next, &iter, bm, BM_EDGES_OF_MESH) { | BM_ITER_MESH_MUTABLE (e, e_next, &iter, bm, BM_EDGES_OF_MESH) { | ||||
| if ((e->l == NULL) && BMO_edge_flag_test(bm, e, EDGE_ISGC)) { | if ((e->l == NULL) && BMO_edge_flag_test(bm, e, EDGE_ISGC)) { | ||||
| BM_edge_kill(bm, e); | BM_edge_kill(bm, e); | ||||
| } | } | ||||
| } | } | ||||
| /* final cleanup */ | /* final cleanup */ | ||||
| BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) { | BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) { | ||||
| if (BM_vert_is_edge_pair(v)) { | if (BM_vert_is_edge_pair(v)) { | ||||
| BM_vert_collapse_edge(bm, v->e, v, false, true); | BM_vert_collapse_edge(bm, v->e, v, false, true, true); | ||||
| } | } | ||||
| } | } | ||||
| BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) { | BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) { | ||||
| if ((v->e == NULL) && BMO_vert_flag_test(bm, v, VERT_ISGC)) { | if ((v->e == NULL) && BMO_vert_flag_test(bm, v, VERT_ISGC)) { | ||||
| BM_vert_kill(bm, v); | BM_vert_kill(bm, v); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 161 Lines • Show Last 20 Lines | |||||