Blender V5.0
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
10
11#include "bmesh_class.hh"
12
13/*
14 * NOTE: do NOT modify topology while walking a mesh!
15 */
16
21
22enum BMWFlag {
25};
26
27/*Walkers*/
28struct BMWalker {
29 char begin_htype; /* only for validating input */
30 void (*begin)(struct BMWalker *walker, void *start);
31 void *(*step)(struct BMWalker *walker);
32 void *(*yield)(struct BMWalker *walker);
36
37 /* runtime */
38 int layer;
39
43
44 /* these masks are to be tested against elements BMO_elem_flag_test(),
45 * should never be accessed directly only through BMW_init() and bmw_mask_check_*() functions */
46 short mask_vert;
47 short mask_edge;
48 short mask_face;
49
51
52 struct GSet *visit_set;
54 int depth;
55};
56
57/* define to make BMW_init more clear */
58#define BMW_MASK_NOP 0
59
66void BMW_init(struct BMWalker *walker,
67 BMesh *bm,
68 int type,
69 short mask_vert,
70 short mask_edge,
71 short mask_face,
73 int layer);
74void *BMW_begin(BMWalker *walker, void *start);
78void *BMW_step(struct BMWalker *walker);
84void BMW_end(struct BMWalker *walker);
90int BMW_current_depth(BMWalker *walker);
91
92/* These are used by custom walkers. */
100void *BMW_current_state(BMWalker *walker);
110void *BMW_state_add(BMWalker *walker);
117void BMW_state_remove(BMWalker *walker);
123void *BMW_walk(BMWalker *walker);
130void BMW_reset(BMWalker *walker);
131
132#define BMW_ITER(ele, walker, data) \
133 for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_begin(walker, (BM_CHECK_TYPE_ELEM(data), data)); ele; \
134 BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
135
136/*
137 * example of usage, walking over an island of tool flagged faces:
138 *
139 * BMWalker walker;
140 * BMFace *f;
141 *
142 * BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
143 *
144 * for (f = BMW_begin(&walker, some_start_face); f; f = BMW_step(&walker)) {
145 * // do something with f
146 * }
147 * BMW_end(&walker);
148 */
149
150enum {
160 /* BMW_RING, */
166 /* End of array index enum values. */
167
168 /* Do not initialize function pointers and struct size in #BMW_init. */
171};
172
173/* use with BMW_init, so as not to confuse with restrict flags */
174#define BMW_NIL_LAY 0
struct GSet GSet
Definition BLI_ghash.h:337
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
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_state_remove(BMWalker *walker)
Remove Current Walker State.
void BMW_init(struct BMWalker *walker, BMesh *bm, int type, short mask_vert, short mask_edge, short mask_face, BMWFlag flag, int layer)
Initialize 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:145