Blender  V2.93
bmesh_walkers.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16 
17 #pragma once
18 
23 /*
24  * NOTE: do NOT modify topology while walking a mesh!
25  */
26 
27 typedef enum {
30 } BMWOrder;
31 
32 typedef enum {
35 } BMWFlag;
36 
37 /*Walkers*/
38 typedef struct BMWalker {
39  char begin_htype; /* only for validating input */
40  void (*begin)(struct BMWalker *walker, void *start);
41  void *(*step)(struct BMWalker *walker);
42  void *(*yield)(struct BMWalker *walker);
46 
47  /* runtime */
48  int layer;
49 
53 
54  /* these masks are to be tested against elements BMO_elem_flag_test(),
55  * should never be accessed directly only through BMW_init() and bmw_mask_check_*() functions */
56  short mask_vert;
57  short mask_edge;
58  short mask_face;
59 
61 
62  struct GSet *visit_set;
64  int depth;
66 
67 /* define to make BMW_init more clear */
68 #define BMW_MASK_NOP 0
69 
70 void BMW_init(struct BMWalker *walker,
71  BMesh *bm,
72  int type,
73  short mask_vert,
74  short mask_edge,
75  short mask_face,
76  BMWFlag flag,
77  int layer);
78 void *BMW_begin(BMWalker *walker, void *start);
79 void *BMW_step(struct BMWalker *walker);
80 void BMW_end(struct BMWalker *walker);
81 int BMW_current_depth(BMWalker *walker);
82 
83 /*these are used by custom walkers*/
84 void *BMW_current_state(BMWalker *walker);
85 void *BMW_state_add(BMWalker *walker);
86 void BMW_state_remove(BMWalker *walker);
87 void *BMW_walk(BMWalker *walker);
88 void BMW_reset(BMWalker *walker);
89 
90 #define BMW_ITER(ele, walker, data) \
91  for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_begin(walker, (BM_CHECK_TYPE_ELEM(data), data)); ele; \
92  BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
93 
94 /*
95  * example of usage, walking over an island of tool flagged faces:
96  *
97  * BMWalker walker;
98  * BMFace *f;
99  *
100  * BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
101  *
102  * for (f = BMW_begin(&walker, some_start_face); f; f = BMW_step(&walker)) {
103  * // do something with f
104  * }
105  * BMW_end(&walker);
106  */
107 
108 enum {
118  /* BMW_RING, */
124  /* end of array index enum vals */
125 
126  /* Do not initialize function pointers and struct size in #BMW_init. */
129 };
130 
131 /* use with BMW_init, so as not to confuse with restrict flags */
132 #define BMW_NIL_LAY 0
struct GSet GSet
Definition: BLI_ghash.h:189
_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:27
@ BMW_DEPTH_FIRST
Definition: bmesh_walkers.h:28
@ BMW_BREADTH_FIRST
Definition: bmesh_walkers.h:29
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:55
BMWFlag
Definition: bmesh_walkers.h:32
@ BMW_FLAG_NOP
Definition: bmesh_walkers.h:33
@ BMW_FLAG_TEST_HIDDEN
Definition: bmesh_walkers.h:34
@ 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_current_state(BMWalker *walker)
Current Walker State.
void BMW_end(struct BMWalker *walker)
End Walker.
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:70
void * BMW_step(struct BMWalker *walker)
Step Walker.
int structsize
Definition: bmesh_walkers.h:43
struct GSet * visit_set_alt
Definition: bmesh_walkers.h:63
ListBase states
Definition: bmesh_walkers.h:52
BMWOrder order
Definition: bmesh_walkers.h:44
BMWFlag flag
Definition: bmesh_walkers.h:60
short mask_face
Definition: bmesh_walkers.h:58
int valid_mask
Definition: bmesh_walkers.h:45
struct GSet * visit_set
Definition: bmesh_walkers.h:62
BMesh * bm
Definition: bmesh_walkers.h:50
short mask_edge
Definition: bmesh_walkers.h:57
short mask_vert
Definition: bmesh_walkers.h:56
char begin_htype
Definition: bmesh_walkers.h:39
BLI_mempool * worklist
Definition: bmesh_walkers.h:51
void(* begin)(struct BMWalker *walker, void *start)
Definition: bmesh_walkers.h:40