258 #ifdef USE_BMESH_HOLES
260 typedef struct BMLoopList {
261 struct BMLoopList *
next, *prev;
262 struct BMLoop *first, *last;
269 #ifdef USE_BMESH_HOLES
339 #ifdef USE_BMESH_HOLES
410 #define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
411 #define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE)
421 #define _BM_GENERIC_TYPE_ELEM_NONCONST \
422 void *, BMVert *, BMEdge *, BMLoop *, BMFace *, BMVert_OFlag *, BMEdge_OFlag *, BMFace_OFlag *, \
423 BMElem *, BMElemF *, BMHeader *
425 #define _BM_GENERIC_TYPE_ELEM_CONST \
426 const void *, const BMVert *, const BMEdge *, const BMLoop *, const BMFace *, \
427 const BMVert_OFlag *, const BMEdge_OFlag *, const BMFace_OFlag *, const BMElem *, \
428 const BMElemF *, const BMHeader *, void *const, BMVert *const, BMEdge *const, \
429 BMLoop *const, BMFace *const, BMElem *const, BMElemF *const, BMHeader *const
431 #define BM_CHECK_TYPE_ELEM_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPES_CONST)
433 #define BM_CHECK_TYPE_ELEM_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
435 #define BM_CHECK_TYPE_ELEM(ele) \
436 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST, _BM_GENERIC_TYPE_ELEM_CONST)
439 #define _BM_GENERIC_TYPE_VERT_NONCONST BMVert *, BMVert_OFlag *
440 #define _BM_GENERIC_TYPE_VERT_CONST const BMVert *, const BMVert_OFlag *
441 #define BM_CHECK_TYPE_VERT_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_CONST)
442 #define BM_CHECK_TYPE_VERT_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
443 #define BM_CHECK_TYPE_VERT(ele) \
444 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_NONCONST, _BM_GENERIC_TYPE_VERT_CONST)
446 #define _BM_GENERIC_TYPE_EDGE_NONCONST BMEdge *, BMEdge_OFlag *
447 #define _BM_GENERIC_TYPE_EDGE_CONST const BMEdge *, const BMEdge_OFlag *
448 #define BM_CHECK_TYPE_EDGE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_CONST)
449 #define BM_CHECK_TYPE_EDGE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
450 #define BM_CHECK_TYPE_EDGE(ele) \
451 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_NONCONST, _BM_GENERIC_TYPE_EDGE_CONST)
453 #define _BM_GENERIC_TYPE_FACE_NONCONST BMFace *, BMFace_OFlag *
454 #define _BM_GENERIC_TYPE_FACE_CONST const BMFace *, const BMFace_OFlag *
455 #define BM_CHECK_TYPE_FACE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_CONST)
456 #define BM_CHECK_TYPE_FACE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
457 #define BM_CHECK_TYPE_FACE(ele) \
458 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_NONCONST, _BM_GENERIC_TYPE_FACE_CONST)
464 # define BM_CHECK_TYPE_ELEM_ASSIGN(ele) (BM_CHECK_TYPE_ELEM(ele)), *((void **)&ele)
466 # define BM_CHECK_TYPE_ELEM_ASSIGN(ele) (BM_CHECK_TYPE_ELEM(ele)), ele
510 #define BM_ELEM_CD_SET_INT(ele, offset, f) \
512 CHECK_TYPE_NONCONST(ele); \
513 BLI_assert(offset != -1); \
514 *((int *)((char *)(ele)->head.data + (offset))) = (f); \
518 #define BM_ELEM_CD_GET_INT(ele, offset) \
519 (BLI_assert(offset != -1), *((int *)((char *)(ele)->head.data + (offset))))
521 #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
522 # define BM_ELEM_CD_GET_VOID_P(ele, offset) \
523 (BLI_assert(offset != -1), \
525 GENERIC_TYPE_ANY(POINTER_OFFSET((ele)->head.data, offset), \
526 _BM_GENERIC_TYPE_ELEM_NONCONST), \
527 GENERIC_TYPE_ANY((const void *)POINTER_OFFSET((ele)->head.data, offset), \
528 _BM_GENERIC_TYPE_ELEM_CONST)))
530 # define BM_ELEM_CD_GET_VOID_P(ele, offset) \
531 (BLI_assert(offset != -1), (void *)((char *)(ele)->head.data + (offset)))
534 #define BM_ELEM_CD_SET_FLOAT(ele, offset, f) \
536 CHECK_TYPE_NONCONST(ele); \
537 BLI_assert(offset != -1); \
538 *((float *)((char *)(ele)->head.data + (offset))) = (f); \
542 #define BM_ELEM_CD_GET_FLOAT(ele, offset) \
543 (BLI_assert(offset != -1), *((float *)((char *)(ele)->head.data + (offset))))
545 #define BM_ELEM_CD_GET_FLOAT_AS_UCHAR(ele, offset) \
546 (BLI_assert(offset != -1), (uchar)(BM_ELEM_CD_GET_FLOAT(ele, offset) * 255.0f))
550 #ifdef USE_BMESH_HOLES
551 # define BM_FACE_FIRST_LOOP(p) (((BMLoopList *)((p)->loops.first))->first)
553 # define BM_FACE_FIRST_LOOP(p) ((p)->l_first)
556 #define BM_DISK_EDGE_NEXT(e, v) \
557 (CHECK_TYPE_INLINE(e, BMEdge *), \
558 CHECK_TYPE_INLINE(v, BMVert *), \
559 BLI_assert(BM_vert_in_edge(e, v)), \
560 (((&e->v1_disk_link)[v == e->v2]).next))
561 #define BM_DISK_EDGE_PREV(e, v) \
562 (CHECK_TYPE_INLINE(e, BMEdge *), \
563 CHECK_TYPE_INLINE(v, BMVert *), \
564 BLI_assert(BM_vert_in_edge(e, v)), \
565 (((&e->v1_disk_link)[v == e->v2]).prev))
571 #define BM_DEFAULT_NGON_STACK_SIZE 32
576 #define BM_DEFAULT_ITER_STACK_SIZE 16
580 #define BM_LOOP_RADIAL_MAX 10000
581 #define BM_NGON_MAX 100000
585 # define BM_OMP_LIMIT 0
587 # define BM_OMP_LIMIT 10000
BLI_STATIC_ASSERT((sizeof(BMHeader)<=16), "BMHeader size has grown!")
struct BMDiskLink BMDiskLink
bool(* BMFaceFilterFunc)(const BMFace *, void *user_data)
struct BMFace_OFlag BMFace_OFlag
bool(* BMElemFilterFunc)(const BMElem *, void *user_data)
bool(* BMVertFilterFunc)(const BMVert *, void *user_data)
bool(* BMLoopFilterFunc)(const BMLoop *, void *user_data)
struct BMVert_OFlag BMVert_OFlag
struct BMLoopNorEditData BMLoopNorEditData
struct BMEdge_OFlag BMEdge_OFlag
void bpy_bm_generic_invalidate(struct BPy_BMGeneric *self)
bool(* BMEdgeFilterFunc)(const BMEdge *, void *user_data)
bool(* BMLoopPairFilterFunc)(const BMLoop *, const BMLoop *, void *user_data)
struct BMLoopNorEditDataArray BMLoopNorEditDataArray
struct BMFlagLayer BMFlagLayer
struct BMFlagLayer * oflags
struct BMFlagLayer * oflags
BMLoopNorEditData ** lidx_to_lnor_editdata
BMLoopNorEditData * lnor_editdata
int cd_custom_normal_offset
struct BMLoop * radial_prev
struct BMLoop * radial_next
struct BMFlagLayer * oflags
struct BLI_mempool * epool
struct MLoopNorSpaceArray * lnor_spacearr
struct BLI_mempool * vtoolflagpool
struct BLI_mempool * etoolflagpool
struct BLI_mempool * ftoolflagpool
struct BLI_mempool * fpool
struct BLI_mempool * vpool
struct BLI_mempool * lpool