Blender V4.3
bmesh_walkers.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
11/*
12 * NOTE: do NOT modify topology while walking a mesh!
13 */
14
19
20typedef enum {
23} BMWFlag;
24
25/*Walkers*/
26typedef struct BMWalker {
27 char begin_htype; /* only for validating input */
28 void (*begin)(struct BMWalker *walker, void *start);
29 void *(*step)(struct BMWalker *walker);
30 void *(*yield)(struct BMWalker *walker);
34
35 /* runtime */
36 int layer;
37
41
42 /* these masks are to be tested against elements BMO_elem_flag_test(),
43 * should never be accessed directly only through BMW_init() and bmw_mask_check_*() functions */
44 short mask_vert;
45 short mask_edge;
46 short mask_face;
47
49
50 struct GSet *visit_set;
52 int depth;
54
55/* define to make BMW_init more clear */
56#define BMW_MASK_NOP 0
57
64void BMW_init(struct BMWalker *walker,
65 BMesh *bm,
66 int type,
67 short mask_vert,
68 short mask_edge,
69 short mask_face,
71 int layer);
72void *BMW_begin(BMWalker *walker, void *start);
76void *BMW_step(struct BMWalker *walker);
82void BMW_end(struct BMWalker *walker);
88int BMW_current_depth(BMWalker *walker);
89
90/* These are used by custom walkers. */
98void *BMW_current_state(BMWalker *walker);
108void *BMW_state_add(BMWalker *walker);
115void BMW_state_remove(BMWalker *walker);
121void *BMW_walk(BMWalker *walker);
128void BMW_reset(BMWalker *walker);
129
130#define BMW_ITER(ele, walker, data) \
131 for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_begin(walker, (BM_CHECK_TYPE_ELEM(data), data)); ele; \
132 BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
133
134/*
135 * example of usage, walking over an island of tool flagged faces:
136 *
137 * BMWalker walker;
138 * BMFace *f;
139 *
140 * BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
141 *
142 * for (f = BMW_begin(&walker, some_start_face); f; f = BMW_step(&walker)) {
143 * // do something with f
144 * }
145 * BMW_end(&walker);
146 */
147
148enum {
158 /* BMW_RING, */
164 /* End of array index enum values. */
165
166 /* Do not initialize function pointers and struct size in #BMW_init. */
169};
170
171/* use with BMW_init, so as not to confuse with restrict flags */
172#define BMW_NIL_LAY 0
struct GSet GSet
Definition BLI_ghash.h:341
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMWOrder
@ BMW_DEPTH_FIRST
@ BMW_BREADTH_FIRST
void * BMW_begin(BMWalker *walker, void *start)
void * BMW_step(struct BMWalker *walker)
Step Walker.
void * BMW_state_add(BMWalker *walker)
Add a new Walker State.
void * BMW_current_state(BMWalker *walker)
Current Walker State.
void * BMW_walk(BMWalker *walker)
Main Walking Function.
void BMW_reset(BMWalker *walker)
Reset Walker.
int BMW_current_depth(BMWalker *walker)
Walker Current Depth.
BMWFlag
@ BMW_FLAG_NOP
@ BMW_FLAG_TEST_HIDDEN
@ BMW_EDGERING
@ BMW_CONNECTED_VERTEX
@ BMW_FACELOOP
@ BMW_ISLAND_MANIFOLD
@ BMW_EDGELOOP
@ BMW_FACE_SHELL
@ BMW_EDGELOOP_NONMANIFOLD
@ BMW_VERT_SHELL
@ BMW_CUSTOM
@ BMW_ISLANDBOUND
@ BMW_MAXWALKERS
@ BMW_LOOP_SHELL_WIRE
@ BMW_LOOP_SHELL
@ BMW_ISLAND
@ BMW_EDGEBOUNDARY
@ BMW_LOOPDATA_ISLAND
void BMW_end(struct BMWalker *walker)
End Walker.
void BMW_state_remove(BMWalker *walker)
Remove Current Walker State.
struct BMWalker BMWalker
void BMW_init(struct BMWalker *walker, BMesh *bm, int type, short mask_vert, short mask_edge, short mask_face, BMWFlag flag, int layer)
Init Walker.
struct GSet * visit_set_alt
ListBase states
BMWOrder order
BMWFlag flag
short mask_face
struct GSet * visit_set
BMesh * bm
short mask_edge
short mask_vert
char begin_htype
BLI_mempool * worklist
void(* begin)(struct BMWalker *walker, void *start)
uint8_t flag
Definition wm_window.cc:138