262#ifdef USE_BMESH_HOLES
268 struct BMLoopList *
next, *prev;
269 struct BMLoop *first, *last;
276#ifdef USE_BMESH_HOLES
363#ifdef USE_BMESH_HOLES
438#define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
439#define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE)
449#define _BM_GENERIC_TYPE_ELEM_NONCONST \
450 void *, BMVert *, BMEdge *, BMLoop *, BMFace *, BMVert_OFlag *, BMEdge_OFlag *, BMFace_OFlag *, \
451 BMElem *, BMElemF *, BMHeader *
453#define _BM_GENERIC_TYPE_ELEM_CONST \
454 const void *, const BMVert *, const BMEdge *, const BMLoop *, const BMFace *, \
455 const BMVert_OFlag *, const BMEdge_OFlag *, const BMFace_OFlag *, const BMElem *, \
456 const BMElemF *, const BMHeader *
458#define BM_CHECK_TYPE_ELEM_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPES_CONST)
460#define BM_CHECK_TYPE_ELEM_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
462#define BM_CHECK_TYPE_ELEM(ele) \
463 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST, _BM_GENERIC_TYPE_ELEM_CONST)
466#define _BM_GENERIC_TYPE_VERT_NONCONST BMVert *, BMVert_OFlag *
467#define _BM_GENERIC_TYPE_VERT_CONST const BMVert *, const BMVert_OFlag *
468#define BM_CHECK_TYPE_VERT_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_CONST)
469#define BM_CHECK_TYPE_VERT_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
470#define BM_CHECK_TYPE_VERT(ele) \
471 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_NONCONST, _BM_GENERIC_TYPE_VERT_CONST)
473#define _BM_GENERIC_TYPE_EDGE_NONCONST BMEdge *, BMEdge_OFlag *
474#define _BM_GENERIC_TYPE_EDGE_CONST const BMEdge *, const BMEdge_OFlag *
475#define BM_CHECK_TYPE_EDGE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_CONST)
476#define BM_CHECK_TYPE_EDGE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
477#define BM_CHECK_TYPE_EDGE(ele) \
478 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_NONCONST, _BM_GENERIC_TYPE_EDGE_CONST)
480#define _BM_GENERIC_TYPE_FACE_NONCONST BMFace *, BMFace_OFlag *
481#define _BM_GENERIC_TYPE_FACE_CONST const BMFace *, const BMFace_OFlag *
482#define BM_CHECK_TYPE_FACE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_CONST)
483#define BM_CHECK_TYPE_FACE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
484#define BM_CHECK_TYPE_FACE(ele) \
485 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_NONCONST, _BM_GENERIC_TYPE_FACE_CONST)
491#define BM_CHECK_TYPE_ELEM_ASSIGN(ele) (BM_CHECK_TYPE_ELEM(ele)), *((void **)&ele)
532#define BM_ELEM_CD_SET_INT(ele, offset, f) \
534 CHECK_TYPE_NONCONST(ele); \
535 BLI_assert(offset != -1); \
536 *((int *)((char *)(ele)->head.data + (offset))) = (f); \
540#define BM_ELEM_CD_GET_INT(ele, offset) \
541 (BLI_assert(offset != -1), *((int *)((char *)(ele)->head.data + (offset))))
543#define BM_ELEM_CD_SET_BOOL(ele, offset, f) \
545 CHECK_TYPE_NONCONST(ele); \
546 BLI_assert(offset != -1); \
547 *((bool *)((char *)(ele)->head.data + (offset))) = (f); \
551#define BM_ELEM_CD_GET_BOOL(ele, offset) \
552 (BLI_assert(offset != -1), *((bool *)((char *)(ele)->head.data + (offset))))
554#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
555# define BM_ELEM_CD_GET_BOOL_P(ele, offset) \
556 (BLI_assert(offset != -1), \
558 GENERIC_TYPE_ANY((bool *)POINTER_OFFSET((ele)->head.data, offset), \
559 _BM_GENERIC_TYPE_ELEM_NONCONST), \
560 GENERIC_TYPE_ANY((const bool *)POINTER_OFFSET((ele)->head.data, offset), \
561 _BM_GENERIC_TYPE_ELEM_CONST)))
563# define BM_ELEM_CD_GET_BOOL_P(ele, offset) \
564 (BLI_assert(offset != -1), (bool *)((char *)(ele)->head.data + (offset)))
567#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
568# define BM_ELEM_CD_GET_VOID_P(ele, offset) \
569 (BLI_assert(offset != -1), \
571 GENERIC_TYPE_ANY(POINTER_OFFSET((ele)->head.data, offset), _BM_GENERIC_TYPE_ELEM_NONCONST), \
572 GENERIC_TYPE_ANY((const void *)POINTER_OFFSET((ele)->head.data, offset), \
573 _BM_GENERIC_TYPE_ELEM_CONST)))
575# define BM_ELEM_CD_GET_VOID_P(ele, offset) \
576 (BLI_assert(offset != -1), (void *)((char *)(ele)->head.data + (offset)))
579#define BM_ELEM_CD_SET_FLOAT(ele, offset, f) \
581 CHECK_TYPE_NONCONST(ele); \
582 BLI_assert(offset != -1); \
583 *((float *)((char *)(ele)->head.data + (offset))) = (f); \
587#define BM_ELEM_CD_GET_FLOAT(ele, offset) \
588 (BLI_assert(offset != -1), *((float *)((char *)(ele)->head.data + (offset))))
590#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
592# define BM_ELEM_CD_GET_FLOAT_P(ele, offset) \
593 (BLI_assert(offset != -1), \
595 GENERIC_TYPE_ANY((float *)POINTER_OFFSET((ele)->head.data, offset), \
596 _BM_GENERIC_TYPE_ELEM_NONCONST), \
597 GENERIC_TYPE_ANY((const float *)POINTER_OFFSET((ele)->head.data, offset), \
598 _BM_GENERIC_TYPE_ELEM_CONST)))
600# define BM_ELEM_CD_GET_FLOAT2_P(ele, offset) \
601 (BLI_assert(offset != -1), \
603 GENERIC_TYPE_ANY((float(*)[2])POINTER_OFFSET((ele)->head.data, offset), \
604 _BM_GENERIC_TYPE_ELEM_NONCONST), \
605 GENERIC_TYPE_ANY((const float(*)[2])POINTER_OFFSET((ele)->head.data, offset), \
606 _BM_GENERIC_TYPE_ELEM_CONST)))
608# define BM_ELEM_CD_GET_FLOAT3_P(ele, offset) \
609 (BLI_assert(offset != -1), \
611 GENERIC_TYPE_ANY((float(*)[3])POINTER_OFFSET((ele)->head.data, offset), \
612 _BM_GENERIC_TYPE_ELEM_NONCONST), \
613 GENERIC_TYPE_ANY((const float(*)[3])POINTER_OFFSET((ele)->head.data, offset), \
614 _BM_GENERIC_TYPE_ELEM_CONST)))
618# define BM_ELEM_CD_GET_FLOAT_P(ele, offset) \
619 (BLI_assert(offset != -1), (float *)((char *)(ele)->head.data + (offset)))
621# define BM_ELEM_CD_GET_FLOAT2_P(ele, offset) \
622 (BLI_assert(offset != -1), (float(*)[2])((char *)(ele)->head.data + (offset)))
624# define BM_ELEM_CD_GET_FLOAT3_P(ele, offset) \
625 (BLI_assert(offset != -1), (float(*)[3])((char *)(ele)->head.data + (offset)))
629#define BM_ELEM_CD_SET_FLOAT2(ele, offset, f) \
631 CHECK_TYPE_NONCONST(ele); \
632 BLI_assert(offset != -1); \
633 ((float *)((char *)(ele)->head.data + (offset)))[0] = (f)[0]; \
634 ((float *)((char *)(ele)->head.data + (offset)))[1] = (f)[1]; \
638#define BM_ELEM_CD_SET_FLOAT3(ele, offset, f) \
640 CHECK_TYPE_NONCONST(ele); \
641 BLI_assert(offset != -1); \
642 ((float *)((char *)(ele)->head.data + (offset)))[0] = (f)[0]; \
643 ((float *)((char *)(ele)->head.data + (offset)))[1] = (f)[1]; \
644 ((float *)((char *)(ele)->head.data + (offset)))[2] = (f)[2]; \
648#define BM_ELEM_CD_GET_FLOAT_AS_UCHAR(ele, offset) \
649 (BLI_assert(offset != -1), (uchar)(BM_ELEM_CD_GET_FLOAT(ele, offset) * 255.0f))
653#ifdef USE_BMESH_HOLES
654# define BM_FACE_FIRST_LOOP(p) (((BMLoopList *)((p)->loops.first))->first)
656# define BM_FACE_FIRST_LOOP(p) ((p)->l_first)
659#define BM_DISK_EDGE_NEXT(e, v) \
660 (CHECK_TYPE_INLINE(e, BMEdge *), \
661 CHECK_TYPE_INLINE(v, BMVert *), \
662 BLI_assert(BM_vert_in_edge(e, v)), \
663 (((&e->v1_disk_link)[v == e->v2]).next))
664#define BM_DISK_EDGE_PREV(e, v) \
665 (CHECK_TYPE_INLINE(e, BMEdge *), \
666 CHECK_TYPE_INLINE(v, BMVert *), \
667 BLI_assert(BM_vert_in_edge(e, v)), \
668 (((&e->v1_disk_link)[v == e->v2]).prev))
674#define BM_DEFAULT_NGON_STACK_SIZE 32
680#define BM_DEFAULT_ITER_STACK_SIZE 16
683#define BM_LOOP_RADIAL_MAX 10000
684#define BM_NGON_MAX 100000
687#define BM_THREAD_LIMIT 10000
#define BLI_STATIC_ASSERT(a, msg)
These structs are the foundation for all linked lists in the library system.
bool(*)(const BMEdge *, void *user_data) BMEdgeFilterFunc
bool(*)(const BMFace *, void *user_data) BMFaceFilterFunc
bool(*)(const BMLoop *, void *user_data) BMLoopFilterFunc
bool(*)(const BMElem *, void *user_data) BMElemFilterFunc
void bpy_bm_generic_invalidate(struct BPy_BMGeneric *self)
bool(*)(const BMVert *, void *user_data) BMVertFilterFunc
bool(*)(const BMLoop *, const BMLoop *, void *user_data) BMLoopPairFilterFunc
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