Blender V4.3
bmesh_iterators_inline.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
11#pragma once
12
13/* inline here optimizes out the switch statement when called with
14 * constant values (which is very common), nicer for loop-in-loop situations */
15
22{
23 return iter->step(iter);
24}
25
34BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *data)
35{
36 // int argtype;
37 iter->itype = itype;
38
39 /* inlining optimizes out this switch when called with the defined type */
40 switch ((BMIterType)itype) {
42 BLI_assert(bm != NULL);
43 BLI_assert(data == NULL);
46 iter->data.elem_of_mesh.pooliter.pool = bm->vpool;
47 break;
49 BLI_assert(bm != NULL);
50 BLI_assert(data == NULL);
53 iter->data.elem_of_mesh.pooliter.pool = bm->epool;
54 break;
56 BLI_assert(bm != NULL);
57 BLI_assert(data == NULL);
60 iter->data.elem_of_mesh.pooliter.pool = bm->fpool;
61 break;
63 BLI_assert(data != NULL);
64 BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
67 iter->data.edge_of_vert.vdata = (BMVert *)data;
68 break;
70 BLI_assert(data != NULL);
71 BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
74 iter->data.face_of_vert.vdata = (BMVert *)data;
75 break;
77 BLI_assert(data != NULL);
78 BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
81 iter->data.loop_of_vert.vdata = (BMVert *)data;
82 break;
84 BLI_assert(data != NULL);
85 BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
88 iter->data.vert_of_edge.edata = (BMEdge *)data;
89 break;
91 BLI_assert(data != NULL);
92 BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
95 iter->data.face_of_edge.edata = (BMEdge *)data;
96 break;
98 BLI_assert(data != NULL);
99 BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
102 iter->data.vert_of_face.pdata = (BMFace *)data;
103 break;
104 case BM_EDGES_OF_FACE:
105 BLI_assert(data != NULL);
106 BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
109 iter->data.edge_of_face.pdata = (BMFace *)data;
110 break;
111 case BM_LOOPS_OF_FACE:
112 BLI_assert(data != NULL);
113 BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
116 iter->data.loop_of_face.pdata = (BMFace *)data;
117 break;
118 case BM_LOOPS_OF_LOOP:
119 BLI_assert(data != NULL);
120 BLI_assert(((BMElem *)data)->head.htype == BM_LOOP);
123 iter->data.loop_of_loop.ldata = (BMLoop *)data;
124 break;
125 case BM_LOOPS_OF_EDGE:
126 BLI_assert(data != NULL);
127 BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
130 iter->data.loop_of_edge.edata = (BMEdge *)data;
131 break;
132 default:
133 /* should never happen */
134 BLI_assert(0);
135 return false;
136 break;
137 }
138
139 iter->begin(iter);
140
141 return true;
142}
143
153 void *BM_iter_new(BMIter *iter, BMesh *bm, const char itype, void *data)
154{
155 if (LIKELY(BM_iter_init(iter, bm, itype, data))) {
156 return BM_iter_step(iter);
157 }
158 else {
159 return NULL;
160 }
161}
162
172#ifdef __BLI_TASK_H__
173
175BLI_INLINE void BM_iter_parallel(BMesh *bm,
176 const char itype,
178 void *userdata,
179 const TaskParallelSettings *settings)
180{
181 /* inlining optimizes out this switch when called with the defined type */
182 switch ((BMIterType)itype) {
183 case BM_VERTS_OF_MESH:
184 BLI_task_parallel_mempool(bm->vpool, userdata, func, settings);
185 break;
186 case BM_EDGES_OF_MESH:
187 BLI_task_parallel_mempool(bm->epool, userdata, func, settings);
188 break;
189 case BM_FACES_OF_MESH:
190 BLI_task_parallel_mempool(bm->fpool, userdata, func, settings);
191 break;
192 default:
193 /* should never happen */
194 BLI_assert(0);
195 break;
196 }
197}
198
199#endif /* __BLI_TASK_H__ */
#define BLI_assert(a)
Definition BLI_assert.h:50
#define ATTR_WARN_UNUSED_RESULT
#define ATTR_NONNULL(...)
#define BLI_INLINE
void BLI_task_parallel_mempool(struct BLI_mempool *mempool, void *userdata, TaskParallelMempoolFunc func, const TaskParallelSettings *settings)
void(* TaskParallelMempoolFunc)(void *userdata, MempoolIterData *iter, const TaskParallelTLS *__restrict tls)
Definition BLI_task.h:211
#define LIKELY(x)
@ BM_LOOP
void * bmiter__elem_of_mesh_step(BMIter__elem_of_mesh *iter)
void * bmiter__vert_of_edge_step(BMIter__vert_of_edge *iter)
void bmiter__edge_of_face_begin(BMIter__edge_of_face *iter)
void * bmiter__face_of_vert_step(BMIter__face_of_vert *iter)
void bmiter__face_of_vert_begin(BMIter__face_of_vert *iter)
void * bmiter__loop_of_face_step(BMIter__loop_of_face *iter)
void bmiter__loop_of_edge_begin(BMIter__loop_of_edge *iter)
void bmiter__face_of_edge_begin(BMIter__face_of_edge *iter)
void bmiter__loop_of_face_begin(BMIter__loop_of_face *iter)
void * bmiter__edge_of_face_step(BMIter__edge_of_face *iter)
void bmiter__edge_of_vert_begin(BMIter__edge_of_vert *iter)
void bmiter__elem_of_mesh_begin(BMIter__elem_of_mesh *iter)
void * bmiter__face_of_edge_step(BMIter__face_of_edge *iter)
void * bmiter__loop_of_edge_step(BMIter__loop_of_edge *iter)
void bmiter__vert_of_face_begin(BMIter__vert_of_face *iter)
void * bmiter__loop_of_vert_step(BMIter__loop_of_vert *iter)
void * bmiter__loop_of_loop_step(BMIter__loop_of_loop *iter)
void bmiter__loop_of_loop_begin(BMIter__loop_of_loop *iter)
void * bmiter__vert_of_face_step(BMIter__vert_of_face *iter)
void * bmiter__edge_of_vert_step(BMIter__edge_of_vert *iter)
void bmiter__loop_of_vert_begin(BMIter__loop_of_vert *iter)
void bmiter__vert_of_edge_begin(BMIter__vert_of_edge *iter)
#define BM_iter_init(iter, bm, itype, data)
BMIterType
BMesh Iterators.
@ BM_LOOPS_OF_LOOP
@ BM_FACES_OF_EDGE
@ BM_FACES_OF_VERT
@ BM_EDGES_OF_MESH
@ BM_VERTS_OF_MESH
@ BM_VERTS_OF_EDGE
@ BM_VERTS_OF_FACE
@ BM_FACES_OF_MESH
@ BM_LOOPS_OF_VERT
@ BM_LOOPS_OF_EDGE
@ BM_EDGES_OF_VERT
@ BM_EDGES_OF_FACE
@ BM_LOOPS_OF_FACE
void *(* BMIter__step_cb)(void *)
#define BM_iter_new(iter, bm, itype, data)
void(* BMIter__begin_cb)(void *)
ATTR_WARN_UNUSED_RESULT BMesh const char itype
ATTR_WARN_UNUSED_RESULT BMesh * bm
#define BM_FACE
#define BM_EDGE
#define BM_VERT
#define NULL
struct BLI_mempool * epool
struct BLI_mempool * fpool
struct BLI_mempool * vpool