Blender V4.3
bmesh_delete.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2007 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
11#include "BLI_utildefines.h"
12
13#include "bmesh.hh"
14
15/* BMO functions */
16
17/* -------------------------------------------------------------------- */
25static void bmo_remove_tagged_faces(BMesh *bm, const short oflag)
26{
27 BMFace *f, *f_next;
28 BMIter iter;
29
30 BM_ITER_MESH_MUTABLE (f, f_next, &iter, bm, BM_FACES_OF_MESH) {
31 if (BMO_face_flag_test(bm, f, oflag)) {
32 BM_face_kill(bm, f);
33 }
34 }
35}
36
37static void bmo_remove_tagged_edges(BMesh *bm, const short oflag)
38{
39 BMEdge *e, *e_next;
40 BMIter iter;
41
42 BM_ITER_MESH_MUTABLE (e, e_next, &iter, bm, BM_EDGES_OF_MESH) {
45 }
46 }
47}
48
49static void bmo_remove_tagged_verts(BMesh *bm, const short oflag)
50{
51 BMVert *v, *v_next;
52 BMIter iter;
53
54 BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
57 }
58 }
59}
60
61static void bmo_remove_tagged_verts_loose(BMesh *bm, const short oflag)
62{
63 BMVert *v, *v_next;
64 BMIter iter;
65
66 BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
67 if (BMO_vert_flag_test(bm, v, oflag) && (v->e == nullptr)) {
69 }
70 }
71}
72
73void BMO_mesh_delete_oflag_tagged(BMesh *bm, const short oflag, const char htype)
74{
75 if (htype & BM_FACE) {
77 }
78 if (htype & BM_EDGE) {
80 }
81 if (htype & BM_VERT) {
83 }
84}
85
86void BMO_mesh_delete_oflag_context(BMesh *bm, const short oflag, const int type)
87{
88 BMEdge *e;
89
90 BMIter eiter;
91 BMIter fiter;
92
93 switch (type) {
94 case DEL_VERTS: {
96
97 break;
98 }
99 case DEL_EDGES: {
100 /* flush down to vert */
101 BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
102 if (BMO_edge_flag_test(bm, e, oflag)) {
105 }
106 }
109
110 break;
111 }
112 case DEL_EDGESFACES: {
114
115 break;
116 }
117 case DEL_ONLYFACES: {
119
120 break;
121 }
122 case DEL_ONLYTAGGED: {
124
125 break;
126 }
127 case DEL_FACES:
129 /* go through and mark all edges and all verts of all faces for delete */
130 BMFace *f;
131 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
132 if (BMO_face_flag_test(bm, f, oflag)) {
133 BMLoop *l_first = BM_FACE_FIRST_LOOP(f);
134 BMLoop *l_iter;
135
136 l_iter = l_first;
137 do {
138 BMO_vert_flag_enable(bm, l_iter->v, oflag);
139 BMO_edge_flag_enable(bm, l_iter->e, oflag);
140 } while ((l_iter = l_iter->next) != l_first);
141 }
142 }
143 /* now go through and mark all remaining faces all edges for keeping */
144 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
145 if (!BMO_face_flag_test(bm, f, oflag)) {
146 BMLoop *l_first = BM_FACE_FIRST_LOOP(f);
147 BMLoop *l_iter;
148
149 l_iter = l_first;
150 do {
151 BMO_vert_flag_disable(bm, l_iter->v, oflag);
152 BMO_edge_flag_disable(bm, l_iter->e, oflag);
153 } while ((l_iter = l_iter->next) != l_first);
154 }
155 }
156 /* also mark all the vertices of remaining edges for keeping */
157 BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
158
159 /* Only exception to normal 'DEL_FACES' logic. */
160 if (type == DEL_FACES_KEEP_BOUNDARY) {
161 if (BM_edge_is_boundary(e)) {
163 }
164 }
165
166 if (!BMO_edge_flag_test(bm, e, oflag)) {
169 }
170 }
171
172 /* now delete marked face */
174 /* delete marked edge */
176 /* remove loose vertices */
178
179 break;
180 }
181 }
182}
183
186/* BM functions
187 *
188 * NOTE: this is just a duplicate of the code above (bad!)
189 * but for now keep in sync, its less hassle than having to create bmesh operator flags,
190 * each time we need to remove some geometry.
191 */
192
193/* -------------------------------------------------------------------- */
197static void bm_remove_tagged_faces(BMesh *bm, const char hflag)
198{
199 BMFace *f, *f_next;
200 BMIter iter;
201
202 BM_ITER_MESH_MUTABLE (f, f_next, &iter, bm, BM_FACES_OF_MESH) {
203 if (BM_elem_flag_test(f, hflag)) {
204 BM_face_kill(bm, f);
205 }
206 }
207}
208
209static void bm_remove_tagged_edges(BMesh *bm, const char hflag)
210{
211 BMEdge *e, *e_next;
212 BMIter iter;
213
214 BM_ITER_MESH_MUTABLE (e, e_next, &iter, bm, BM_EDGES_OF_MESH) {
215 if (BM_elem_flag_test(e, hflag)) {
216 BM_edge_kill(bm, e);
217 }
218 }
219}
220
221static void bm_remove_tagged_verts(BMesh *bm, const char hflag)
222{
223 BMVert *v, *v_next;
224 BMIter iter;
225
226 BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
227 if (BM_elem_flag_test(v, hflag)) {
228 BM_vert_kill(bm, v);
229 }
230 }
231}
232
233static void bm_remove_tagged_verts_loose(BMesh *bm, const char hflag)
234{
235 BMVert *v, *v_next;
236 BMIter iter;
237
238 BM_ITER_MESH_MUTABLE (v, v_next, &iter, bm, BM_VERTS_OF_MESH) {
239 if (BM_elem_flag_test(v, hflag) && (v->e == nullptr)) {
240 BM_vert_kill(bm, v);
241 }
242 }
243}
244
245void BM_mesh_delete_hflag_tagged(BMesh *bm, const char hflag, const char htype)
246{
247 if (htype & BM_FACE) {
249 }
250 if (htype & BM_EDGE) {
252 }
253 if (htype & BM_VERT) {
255 }
256}
257
258void BM_mesh_delete_hflag_context(BMesh *bm, const char hflag, const int type)
259{
260
261 BMIter eiter;
262 BMIter fiter;
263
264 switch (type) {
265 case DEL_VERTS: {
267
268 break;
269 }
270 case DEL_EDGES: {
271 /* flush down to vert */
272 BMEdge *e;
273 BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
274 if (BM_elem_flag_test(e, hflag)) {
275 BM_elem_flag_enable(e->v1, hflag);
276 BM_elem_flag_enable(e->v2, hflag);
277 }
278 }
281
282 break;
283 }
284 case DEL_EDGESFACES: {
286
287 break;
288 }
289 case DEL_ONLYFACES: {
291
292 break;
293 }
294 case DEL_ONLYTAGGED: {
296
297 break;
298 }
299 case DEL_FACES: {
300 /* go through and mark all edges and all verts of all faces for delete */
301 BMFace *f;
302 BMEdge *e;
303 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
304 if (BM_elem_flag_test(f, hflag)) {
305 BMLoop *l_first = BM_FACE_FIRST_LOOP(f);
306 BMLoop *l_iter;
307
308 l_iter = l_first;
309 do {
310 BM_elem_flag_enable(l_iter->v, hflag);
311 BM_elem_flag_enable(l_iter->e, hflag);
312 } while ((l_iter = l_iter->next) != l_first);
313 }
314 }
315 /* now go through and mark all remaining faces all edges for keeping */
316 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
317 if (!BM_elem_flag_test(f, hflag)) {
318 BMLoop *l_first = BM_FACE_FIRST_LOOP(f);
319 BMLoop *l_iter;
320
321 l_iter = l_first;
322 do {
323 BM_elem_flag_disable(l_iter->v, hflag);
324 BM_elem_flag_disable(l_iter->e, hflag);
325 } while ((l_iter = l_iter->next) != l_first);
326 }
327 }
328 /* also mark all the vertices of remaining edges for keeping */
329 BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
330 if (!BM_elem_flag_test(e, hflag)) {
331 BM_elem_flag_disable(e->v1, hflag);
332 BM_elem_flag_disable(e->v2, hflag);
333 }
334 }
335 /* now delete marked face */
337 /* delete marked edge */
339 /* remove loose vertices */
341
342 break;
343 }
344 }
345}
346
#define BM_ALL_NOLOOP
#define BM_FACE_FIRST_LOOP(p)
void BM_vert_kill(BMesh *bm, BMVert *v)
void BM_face_kill(BMesh *bm, BMFace *f)
void BM_edge_kill(BMesh *bm, BMEdge *e)
static void bm_remove_tagged_verts(BMesh *bm, const char hflag)
static void bmo_remove_tagged_edges(BMesh *bm, const short oflag)
static void bm_remove_tagged_edges(BMesh *bm, const char hflag)
void BMO_mesh_delete_oflag_tagged(BMesh *bm, const short oflag, const char htype)
void BM_mesh_delete_hflag_context(BMesh *bm, const char hflag, const int type)
void BM_mesh_delete_hflag_tagged(BMesh *bm, const char hflag, const char htype)
static void bm_remove_tagged_verts_loose(BMesh *bm, const char hflag)
static void bmo_remove_tagged_faces(BMesh *bm, const short oflag)
static void bmo_remove_tagged_verts(BMesh *bm, const short oflag)
static void bm_remove_tagged_faces(BMesh *bm, const char hflag)
void BMO_mesh_delete_oflag_context(BMesh *bm, const short oflag, const int type)
static void bmo_remove_tagged_verts_loose(BMesh *bm, const short oflag)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_EDGES_OF_MESH
@ BM_VERTS_OF_MESH
@ BM_FACES_OF_MESH
#define BM_ITER_MESH_MUTABLE(ele, ele_next, iter, bm, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
#define BM_FACE
#define BM_EDGE
#define BM_VERT
#define BMO_vert_flag_disable(bm, e, oflag)
#define BMO_edge_flag_test(bm, e, oflag)
#define BMO_edge_flag_enable(bm, e, oflag)
#define BMO_vert_flag_enable(bm, e, oflag)
#define BMO_vert_flag_test(bm, e, oflag)
@ DEL_ONLYTAGGED
@ DEL_FACES_KEEP_BOUNDARY
@ DEL_EDGESFACES
@ DEL_ONLYFACES
#define BMO_edge_flag_disable(bm, e, oflag)
#define BMO_face_flag_test(bm, e, oflag)
ATTR_WARN_UNUSED_RESULT const BMFlagLayer const short oflag
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
struct BMVert * v
struct BMEdge * e
struct BMLoop * next
struct BMEdge * e