BMesh: generic callbacks for mempool iterator
This commit is contained in:
parent
059e0dafb4
commit
3c0605c0ef
|
@ -338,50 +338,18 @@ int BM_iter_mesh_count_flag(const char itype, BMesh *bm, const char hflag, const
|
|||
# define USE_IMMUTABLE_ASSERT
|
||||
#endif
|
||||
|
||||
void bmiter__vert_of_mesh_begin(struct BMIter__vert_of_mesh *iter)
|
||||
void bmiter__elem_of_mesh_begin(struct BMIter__elem_of_mesh *iter)
|
||||
{
|
||||
#ifdef USE_IMMUTABLE_ASSERT
|
||||
((BMIter *)iter)->count = iter->bm->totvert;
|
||||
((BMIter *)iter)->count = BLI_mempool_count(iter->pooliter.pool);
|
||||
#endif
|
||||
BLI_mempool_iternew(iter->bm->vpool, &iter->pooliter);
|
||||
BLI_mempool_iternew(iter->pooliter.pool, &iter->pooliter);
|
||||
}
|
||||
|
||||
void *bmiter__vert_of_mesh_step(struct BMIter__vert_of_mesh *iter)
|
||||
void *bmiter__elem_of_mesh_step(struct BMIter__elem_of_mesh *iter)
|
||||
{
|
||||
#ifdef USE_IMMUTABLE_ASSERT
|
||||
BLI_assert(((BMIter *)iter)->count <= iter->bm->totvert);
|
||||
#endif
|
||||
return BLI_mempool_iterstep(&iter->pooliter);
|
||||
}
|
||||
|
||||
void bmiter__edge_of_mesh_begin(struct BMIter__edge_of_mesh *iter)
|
||||
{
|
||||
#ifdef USE_IMMUTABLE_ASSERT
|
||||
((BMIter *)iter)->count = iter->bm->totedge;
|
||||
#endif
|
||||
BLI_mempool_iternew(iter->bm->epool, &iter->pooliter);
|
||||
}
|
||||
|
||||
void *bmiter__edge_of_mesh_step(struct BMIter__edge_of_mesh *iter)
|
||||
{
|
||||
#ifdef USE_IMMUTABLE_ASSERT
|
||||
BLI_assert(((BMIter *)iter)->count <= iter->bm->totedge);
|
||||
#endif
|
||||
return BLI_mempool_iterstep(&iter->pooliter);
|
||||
}
|
||||
|
||||
void bmiter__face_of_mesh_begin(struct BMIter__face_of_mesh *iter)
|
||||
{
|
||||
#ifdef USE_IMMUTABLE_ASSERT
|
||||
((BMIter *)iter)->count = iter->bm->totface;
|
||||
#endif
|
||||
BLI_mempool_iternew(iter->bm->fpool, &iter->pooliter);
|
||||
}
|
||||
|
||||
void *bmiter__face_of_mesh_step(struct BMIter__face_of_mesh *iter)
|
||||
{
|
||||
#ifdef USE_IMMUTABLE_ASSERT
|
||||
BLI_assert(((BMIter *)iter)->count <= iter->bm->totface);
|
||||
BLI_assert(((BMIter *)iter)->count <= BLI_mempool_count(iter->pooliter.pool));
|
||||
#endif
|
||||
return BLI_mempool_iterstep(&iter->pooliter);
|
||||
}
|
||||
|
|
|
@ -110,16 +110,7 @@ extern const char bm_iter_itype_htype_map[BM_ITYPE_MAX];
|
|||
for (ele = BM_iter_new(iter, NULL, itype, data), indexvar = 0; ele; ele = BM_iter_step(iter), (indexvar)++)
|
||||
|
||||
/* iterator type structs */
|
||||
struct BMIter__vert_of_mesh {
|
||||
BMesh *bm;
|
||||
BLI_mempool_iter pooliter;
|
||||
};
|
||||
struct BMIter__edge_of_mesh {
|
||||
BMesh *bm;
|
||||
BLI_mempool_iter pooliter;
|
||||
};
|
||||
struct BMIter__face_of_mesh {
|
||||
BMesh *bm;
|
||||
struct BMIter__elem_of_mesh {
|
||||
BLI_mempool_iter pooliter;
|
||||
};
|
||||
struct BMIter__edge_of_vert {
|
||||
|
@ -173,9 +164,7 @@ typedef void *(*BMIter__step_cb) (void *);
|
|||
typedef struct BMIter {
|
||||
/* keep union first */
|
||||
union {
|
||||
struct BMIter__vert_of_mesh vert_of_mesh;
|
||||
struct BMIter__edge_of_mesh edge_of_mesh;
|
||||
struct BMIter__face_of_mesh face_of_mesh;
|
||||
struct BMIter__elem_of_mesh elem_of_mesh;
|
||||
|
||||
struct BMIter__edge_of_vert edge_of_vert;
|
||||
struct BMIter__face_of_vert face_of_vert;
|
||||
|
@ -219,9 +208,7 @@ int BM_iter_mesh_count_flag(const char itype, BMesh *bm, const char hflag, c
|
|||
void bmiter__##name##_begin(struct BMIter__##name *iter); \
|
||||
void *bmiter__##name##_step(struct BMIter__##name *iter)
|
||||
|
||||
BMITER_CB_DEF(vert_of_mesh);
|
||||
BMITER_CB_DEF(edge_of_mesh);
|
||||
BMITER_CB_DEF(face_of_mesh);
|
||||
BMITER_CB_DEF(elem_of_mesh);
|
||||
BMITER_CB_DEF(edge_of_vert);
|
||||
BMITER_CB_DEF(face_of_vert);
|
||||
BMITER_CB_DEF(loop_of_vert);
|
||||
|
|
|
@ -60,23 +60,23 @@ BLI_INLINE bool BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *da
|
|||
case BM_VERTS_OF_MESH:
|
||||
BLI_assert(bm != NULL);
|
||||
BLI_assert(data == NULL);
|
||||
iter->begin = (BMIter__begin_cb)bmiter__vert_of_mesh_begin;
|
||||
iter->step = (BMIter__step_cb)bmiter__vert_of_mesh_step;
|
||||
iter->data.vert_of_mesh.bm = bm;
|
||||
iter->begin = (BMIter__begin_cb)bmiter__elem_of_mesh_begin;
|
||||
iter->step = (BMIter__step_cb)bmiter__elem_of_mesh_step;
|
||||
iter->data.elem_of_mesh.pooliter.pool = bm->vpool;
|
||||
break;
|
||||
case BM_EDGES_OF_MESH:
|
||||
BLI_assert(bm != NULL);
|
||||
BLI_assert(data == NULL);
|
||||
iter->begin = (BMIter__begin_cb)bmiter__edge_of_mesh_begin;
|
||||
iter->step = (BMIter__step_cb)bmiter__edge_of_mesh_step;
|
||||
iter->data.edge_of_mesh.bm = bm;
|
||||
iter->begin = (BMIter__begin_cb)bmiter__elem_of_mesh_begin;
|
||||
iter->step = (BMIter__step_cb)bmiter__elem_of_mesh_step;
|
||||
iter->data.elem_of_mesh.pooliter.pool = bm->epool;
|
||||
break;
|
||||
case BM_FACES_OF_MESH:
|
||||
BLI_assert(bm != NULL);
|
||||
BLI_assert(data == NULL);
|
||||
iter->begin = (BMIter__begin_cb)bmiter__face_of_mesh_begin;
|
||||
iter->step = (BMIter__step_cb)bmiter__face_of_mesh_step;
|
||||
iter->data.face_of_mesh.bm = bm;
|
||||
iter->begin = (BMIter__begin_cb)bmiter__elem_of_mesh_begin;
|
||||
iter->step = (BMIter__step_cb)bmiter__elem_of_mesh_step;
|
||||
iter->data.elem_of_mesh.pooliter.pool = bm->fpool;
|
||||
break;
|
||||
case BM_EDGES_OF_VERT:
|
||||
BLI_assert(data != NULL);
|
||||
|
|
Loading…
Reference in New Issue