diff options
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_iterators.h')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_iterators.h | 60 |
1 files changed, 53 insertions, 7 deletions
diff --git a/source/blender/bmesh/intern/bmesh_iterators.h b/source/blender/bmesh/intern/bmesh_iterators.h index ab4427e6968..12b3581b0a1 100644 --- a/source/blender/bmesh/intern/bmesh_iterators.h +++ b/source/blender/bmesh/intern/bmesh_iterators.h @@ -34,13 +34,6 @@ #include "BLI_compiler_attrs.h" #include "BLI_mempool.h" -/* Defines for passing to BM_iter_new. - * - * "OF" can be substituted for "around" - * so BM_VERTS_OF_FACE means "vertices - * around a face." - */ - /* these iterator over all elements of a specific * type in the mesh. * @@ -75,6 +68,12 @@ typedef enum BMIterType { /* the iterator htype for each iterator */ extern const char bm_iter_itype_htype_map[BM_ITYPE_MAX]; +/* -------------------------------------------------------------------- */ +/** \name Defines for passing to #BM_iter_new. + * + * "OF" can be substituted for "around" so #BM_VERTS_OF_FACE means "vertices* around a face." + * \{ */ + #define BM_ITER_MESH(ele, iter, bm, itype) \ for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_new(iter, bm, itype, NULL); ele; \ BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_step(iter)) @@ -108,6 +107,8 @@ extern const char bm_iter_itype_htype_map[BM_ITYPE_MAX]; for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_new(iter, NULL, itype, data), indexvar = 0; ele; \ BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BM_iter_step(iter), (indexvar)++) +/** \} */ + /* iterator type structs */ struct BMIter__elem_of_mesh { BLI_mempool_iter pooliter; @@ -184,14 +185,38 @@ typedef struct BMIter { char itype; } BMIter; +/** + * \note Use #BM_vert_at_index / #BM_edge_at_index / #BM_face_at_index for mesh arrays. + */ void *BM_iter_at_index(BMesh *bm, const char itype, void *data, int index) ATTR_WARN_UNUSED_RESULT; +/** + * \brief Iterator as Array + * + * Sometimes its convenient to get the iterator as an array + * to avoid multiple calls to #BM_iter_at_index. + */ int BM_iter_as_array(BMesh *bm, const char itype, void *data, void **array, const int len); +/** + * \brief Iterator as Array + * + * Allocates a new array, has the advantage that you don't need to know the size ahead of time. + * + * Takes advantage of less common iterator usage to avoid counting twice, + * which you might end up doing when #BM_iter_as_array is used. + * + * Caller needs to free the array. + */ void *BM_iter_as_arrayN(BMesh *bm, const char itype, void *data, int *r_len, void **stack_array, int stack_array_size) ATTR_WARN_UNUSED_RESULT; +/** + * \brief Operator Iterator as Array + * + * Sometimes its convenient to get the iterator as an array. + */ int BMO_iter_as_array(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, const char restrictmask, @@ -210,15 +235,36 @@ int BM_iter_mesh_bitmap_from_filter(const char itype, uint *bitmap, bool (*test_fn)(BMElem *, void *user_data), void *user_data); +/** + * Needed when we want to check faces, but return a loop aligned array. + */ int BM_iter_mesh_bitmap_from_filter_tessface(BMesh *bm, uint *bitmap, bool (*test_fn)(BMFace *, void *user_data), void *user_data); +/** + * \brief Elem Iter Flag Count + * + * Counts how many flagged / unflagged items are found in this element. + */ int BM_iter_elem_count_flag(const char itype, void *data, const char hflag, const bool value); +/** + * \brief Elem Iter Tool Flag Count + * + * Counts how many flagged / unflagged items are found in this element. + */ int BMO_iter_elem_count_flag( BMesh *bm, const char itype, void *data, const short oflag, const bool value); +/** + * Utility function. + */ int BM_iter_mesh_count(const char itype, BMesh *bm); +/** + * \brief Mesh Iter Flag Count + * + * Counts how many flagged / unflagged items are found in this mesh. + */ int BM_iter_mesh_count_flag(const char itype, BMesh *bm, const char hflag, const bool value); /* private for bmesh_iterators_inline.c */ |