Blender  V2.93
bmesh_iterators_inline.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 
23 #pragma once
24 
25 /* inline here optimizes out the switch statement when called with
26  * constant values (which is very common), nicer for loop-in-loop situations */
27 
34 {
35  return iter->step(iter);
36 }
37 
45 ATTR_NONNULL(1)
46 BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *data)
47 {
48  /* int argtype; */
49  iter->itype = itype;
50 
51  /* inlining optimizes out this switch when called with the defined type */
52  switch ((BMIterType)itype) {
53  case BM_VERTS_OF_MESH:
54  BLI_assert(bm != NULL);
55  BLI_assert(data == NULL);
58  iter->data.elem_of_mesh.pooliter.pool = bm->vpool;
59  break;
60  case BM_EDGES_OF_MESH:
61  BLI_assert(bm != NULL);
62  BLI_assert(data == NULL);
65  iter->data.elem_of_mesh.pooliter.pool = bm->epool;
66  break;
67  case BM_FACES_OF_MESH:
68  BLI_assert(bm != NULL);
69  BLI_assert(data == NULL);
72  iter->data.elem_of_mesh.pooliter.pool = bm->fpool;
73  break;
74  case BM_EDGES_OF_VERT:
75  BLI_assert(data != NULL);
76  BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
79  iter->data.edge_of_vert.vdata = (BMVert *)data;
80  break;
81  case BM_FACES_OF_VERT:
82  BLI_assert(data != NULL);
83  BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
86  iter->data.face_of_vert.vdata = (BMVert *)data;
87  break;
88  case BM_LOOPS_OF_VERT:
89  BLI_assert(data != NULL);
90  BLI_assert(((BMElem *)data)->head.htype == BM_VERT);
93  iter->data.loop_of_vert.vdata = (BMVert *)data;
94  break;
95  case BM_VERTS_OF_EDGE:
96  BLI_assert(data != NULL);
97  BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
100  iter->data.vert_of_edge.edata = (BMEdge *)data;
101  break;
102  case BM_FACES_OF_EDGE:
103  BLI_assert(data != NULL);
104  BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
107  iter->data.face_of_edge.edata = (BMEdge *)data;
108  break;
109  case BM_VERTS_OF_FACE:
110  BLI_assert(data != NULL);
111  BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
114  iter->data.vert_of_face.pdata = (BMFace *)data;
115  break;
116  case BM_EDGES_OF_FACE:
117  BLI_assert(data != NULL);
118  BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
121  iter->data.edge_of_face.pdata = (BMFace *)data;
122  break;
123  case BM_LOOPS_OF_FACE:
124  BLI_assert(data != NULL);
125  BLI_assert(((BMElem *)data)->head.htype == BM_FACE);
128  iter->data.loop_of_face.pdata = (BMFace *)data;
129  break;
130  case BM_LOOPS_OF_LOOP:
131  BLI_assert(data != NULL);
132  BLI_assert(((BMElem *)data)->head.htype == BM_LOOP);
135  iter->data.loop_of_loop.ldata = (BMLoop *)data;
136  break;
137  case BM_LOOPS_OF_EDGE:
138  BLI_assert(data != NULL);
139  BLI_assert(((BMElem *)data)->head.htype == BM_EDGE);
142  iter->data.loop_of_edge.edata = (BMEdge *)data;
143  break;
144  default:
145  /* should never happen */
146  BLI_assert(0);
147  return false;
148  break;
149  }
150 
151  iter->begin(iter);
152 
153  return true;
154 }
155 
165  void *BM_iter_new(BMIter *iter, BMesh *bm, const char itype, void *data)
166 {
167  if (LIKELY(BM_iter_init(iter, bm, itype, data))) {
168  return BM_iter_step(iter);
169  }
170  else {
171  return NULL;
172  }
173 }
174 
184 #ifdef __BLI_TASK_H__
185 
186 ATTR_NONNULL(1)
187 BLI_INLINE void BM_iter_parallel(BMesh *bm,
188  const char itype,
190  void *userdata,
191  const bool use_threading)
192 {
193  /* inlining optimizes out this switch when called with the defined type */
194  switch ((BMIterType)itype) {
195  case BM_VERTS_OF_MESH:
196  BLI_task_parallel_mempool(bm->vpool, userdata, func, use_threading);
197  break;
198  case BM_EDGES_OF_MESH:
199  BLI_task_parallel_mempool(bm->epool, userdata, func, use_threading);
200  break;
201  case BM_FACES_OF_MESH:
202  BLI_task_parallel_mempool(bm->fpool, userdata, func, use_threading);
203  break;
204  default:
205  /* should never happen */
206  BLI_assert(0);
207  break;
208  }
209 }
210 
211 #endif /* __BLI_TASK_H__ */
#define BLI_assert(a)
Definition: BLI_assert.h:58
#define BLI_INLINE
void BLI_kdtree_nd_() int BLI_kdtree_nd_() int BLI_kdtree_nd_() int BLI_kdtree_nd_() ATTR_WARN_UNUSED_RESULT
void(* TaskParallelMempoolFunc)(void *userdata, MempoolIterData *iter)
Definition: BLI_task.h:224
void BLI_task_parallel_mempool(struct BLI_mempool *mempool, void *userdata, TaskParallelMempoolFunc func, const bool use_threading)
#define LIKELY(x)
@ BM_LOOP
Definition: bmesh_class.h:385
@ BM_FACE
Definition: bmesh_class.h:386
@ BM_VERT
Definition: bmesh_class.h:383
@ BM_EDGE
Definition: bmesh_class.h:384
void * bmiter__loop_of_face_step(struct BMIter__loop_of_face *iter)
void bmiter__loop_of_loop_begin(struct BMIter__loop_of_loop *iter)
void * bmiter__vert_of_edge_step(struct BMIter__vert_of_edge *iter)
void * bmiter__edge_of_face_step(struct BMIter__edge_of_face *iter)
void * bmiter__elem_of_mesh_step(struct BMIter__elem_of_mesh *iter)
void bmiter__edge_of_face_begin(struct BMIter__edge_of_face *iter)
void bmiter__loop_of_vert_begin(struct BMIter__loop_of_vert *iter)
void bmiter__face_of_edge_begin(struct BMIter__face_of_edge *iter)
void bmiter__loop_of_face_begin(struct BMIter__loop_of_face *iter)
void * bmiter__loop_of_loop_step(struct BMIter__loop_of_loop *iter)
void bmiter__vert_of_face_begin(struct BMIter__vert_of_face *iter)
void * bmiter__loop_of_edge_step(struct BMIter__loop_of_edge *iter)
void bmiter__face_of_vert_begin(struct BMIter__face_of_vert *iter)
void bmiter__elem_of_mesh_begin(struct BMIter__elem_of_mesh *iter)
void bmiter__edge_of_vert_begin(struct BMIter__edge_of_vert *iter)
void bmiter__loop_of_edge_begin(struct BMIter__loop_of_edge *iter)
void * bmiter__face_of_edge_step(struct BMIter__face_of_edge *iter)
void bmiter__vert_of_edge_begin(struct BMIter__vert_of_edge *iter)
void * bmiter__vert_of_face_step(struct BMIter__vert_of_face *iter)
void * bmiter__face_of_vert_step(struct BMIter__face_of_vert *iter)
void * bmiter__loop_of_vert_step(struct BMIter__loop_of_vert *iter)
void * bmiter__edge_of_vert_step(struct BMIter__edge_of_vert *iter)
void *(* BMIter__step_cb)(void *)
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
#define BM_iter_new(iter, bm, itype, data)
void(* BMIter__begin_cb)(void *)
BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *data)
Iterator Init.
ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) BLI_INLINE void *BM_iter_step(BMIter *iter)
Iterator Step.
ATTR_WARN_UNUSED_RESULT BMesh const char itype
ATTR_WARN_UNUSED_RESULT BMesh * bm
struct BLI_mempool * epool
Definition: bmesh_class.h:314
struct BLI_mempool * fpool
Definition: bmesh_class.h:314
struct BLI_mempool * vpool
Definition: bmesh_class.h:314