Blender  V3.3
bmesh_walkers.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #pragma once
4 
9 /*
10  * NOTE: do NOT modify topology while walking a mesh!
11  */
12 
13 typedef enum {
16 } BMWOrder;
17 
18 typedef enum {
21 } BMWFlag;
22 
23 /*Walkers*/
24 typedef struct BMWalker {
25  char begin_htype; /* only for validating input */
26  void (*begin)(struct BMWalker *walker, void *start);
27  void *(*step)(struct BMWalker *walker);
28  void *(*yield)(struct BMWalker *walker);
32 
33  /* runtime */
34  int layer;
35 
39 
40  /* these masks are to be tested against elements BMO_elem_flag_test(),
41  * should never be accessed directly only through BMW_init() and bmw_mask_check_*() functions */
42  short mask_vert;
43  short mask_edge;
44  short mask_face;
45 
47 
48  struct GSet *visit_set;
50  int depth;
52 
53 /* define to make BMW_init more clear */
54 #define BMW_MASK_NOP 0
55 
62 void BMW_init(struct BMWalker *walker,
63  BMesh *bm,
64  int type,
65  short mask_vert,
66  short mask_edge,
67  short mask_face,
68  BMWFlag flag,
69  int layer);
70 void *BMW_begin(BMWalker *walker, void *start);
74 void *BMW_step(struct BMWalker *walker);
80 void BMW_end(struct BMWalker *walker);
86 int BMW_current_depth(BMWalker *walker);
87 
88 /* These are used by custom walkers. */
96 void *BMW_current_state(BMWalker *walker);
106 void *BMW_state_add(BMWalker *walker);
113 void BMW_state_remove(BMWalker *walker);
119 void *BMW_walk(BMWalker *walker);
126 void BMW_reset(BMWalker *walker);
127 
128 #define BMW_ITER(ele, walker, data) \
129  for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_begin(walker, (BM_CHECK_TYPE_ELEM(data), data)); ele; \
130  BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
131 
132 /*
133  * example of usage, walking over an island of tool flagged faces:
134  *
135  * BMWalker walker;
136  * BMFace *f;
137  *
138  * BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
139  *
140  * for (f = BMW_begin(&walker, some_start_face); f; f = BMW_step(&walker)) {
141  * // do something with f
142  * }
143  * BMW_end(&walker);
144  */
145 
146 enum {
156  /* BMW_RING, */
162  /* end of array index enum vals */
163 
164  /* Do not initialize function pointers and struct size in #BMW_init. */
167 };
168 
169 /* use with BMW_init, so as not to confuse with restrict flags */
170 #define BMW_NIL_LAY 0
struct GSet GSet
Definition: BLI_ghash.h:340
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMWOrder
Definition: bmesh_walkers.h:13
@ BMW_DEPTH_FIRST
Definition: bmesh_walkers.h:14
@ BMW_BREADTH_FIRST
Definition: bmesh_walkers.h:15
void BMW_reset(BMWalker *walker)
Reset Walker.
int BMW_current_depth(BMWalker *walker)
Walker Current Depth.
void * BMW_begin(BMWalker *walker, void *start)
Definition: bmesh_walkers.c:40
BMWFlag
Definition: bmesh_walkers.h:18
@ BMW_FLAG_NOP
Definition: bmesh_walkers.h:19
@ BMW_FLAG_TEST_HIDDEN
Definition: bmesh_walkers.h:20
void * BMW_current_state(BMWalker *walker)
Current Walker State.
void BMW_end(struct BMWalker *walker)
End Walker.
@ 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_walk(BMWalker *walker)
Main Walking Function.
void * BMW_state_add(BMWalker *walker)
Add a new Walker State.
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.
Definition: bmesh_walkers.c:49
void * BMW_step(struct BMWalker *walker)
Step Walker.
SyclQueue void void size_t num_bytes void
int structsize
Definition: bmesh_walkers.h:29
struct GSet * visit_set_alt
Definition: bmesh_walkers.h:49
ListBase states
Definition: bmesh_walkers.h:38
BMWOrder order
Definition: bmesh_walkers.h:30
BMWFlag flag
Definition: bmesh_walkers.h:46
short mask_face
Definition: bmesh_walkers.h:44
int valid_mask
Definition: bmesh_walkers.h:31
struct GSet * visit_set
Definition: bmesh_walkers.h:48
BMesh * bm
Definition: bmesh_walkers.h:36
short mask_edge
Definition: bmesh_walkers.h:43
short mask_vert
Definition: bmesh_walkers.h:42
char begin_htype
Definition: bmesh_walkers.h:25
BLI_mempool * worklist
Definition: bmesh_walkers.h:37
void(* begin)(struct BMWalker *walker, void *start)
Definition: bmesh_walkers.h:26