248#ifdef USE_BMESH_HOLES
250typedef struct BMLoopList {
252 struct BMLoop *first, *last;
259#ifdef USE_BMESH_HOLES
341#ifdef USE_BMESH_HOLES
414#define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
415#define BM_ALL_NOLOOP (BM_VERT | BM_EDGE | BM_FACE)
425#define _BM_GENERIC_TYPE_ELEM_NONCONST \
426 void *, BMVert *, BMEdge *, BMLoop *, BMFace *, BMVert_OFlag *, BMEdge_OFlag *, BMFace_OFlag *, \
427 BMElem *, BMElemF *, BMHeader *
429#define _BM_GENERIC_TYPE_ELEM_CONST \
430 const void *, const BMVert *, const BMEdge *, const BMLoop *, const BMFace *, \
431 const BMVert_OFlag *, const BMEdge_OFlag *, const BMFace_OFlag *, const BMElem *, \
432 const BMElemF *, const BMHeader *
434#define BM_CHECK_TYPE_ELEM_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPES_CONST)
436#define BM_CHECK_TYPE_ELEM_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
438#define BM_CHECK_TYPE_ELEM(ele) \
439 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST, _BM_GENERIC_TYPE_ELEM_CONST)
442#define _BM_GENERIC_TYPE_VERT_NONCONST BMVert *, BMVert_OFlag *
443#define _BM_GENERIC_TYPE_VERT_CONST const BMVert *, const BMVert_OFlag *
444#define BM_CHECK_TYPE_VERT_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_CONST)
445#define BM_CHECK_TYPE_VERT_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
446#define BM_CHECK_TYPE_VERT(ele) \
447 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_VERT_NONCONST, _BM_GENERIC_TYPE_VERT_CONST)
449#define _BM_GENERIC_TYPE_EDGE_NONCONST BMEdge *, BMEdge_OFlag *
450#define _BM_GENERIC_TYPE_EDGE_CONST const BMEdge *, const BMEdge_OFlag *
451#define BM_CHECK_TYPE_EDGE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_CONST)
452#define BM_CHECK_TYPE_EDGE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
453#define BM_CHECK_TYPE_EDGE(ele) \
454 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_EDGE_NONCONST, _BM_GENERIC_TYPE_EDGE_CONST)
456#define _BM_GENERIC_TYPE_FACE_NONCONST BMFace *, BMFace_OFlag *
457#define _BM_GENERIC_TYPE_FACE_CONST const BMFace *, const BMFace_OFlag *
458#define BM_CHECK_TYPE_FACE_CONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_CONST)
459#define BM_CHECK_TYPE_FACE_NONCONST(ele) CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_ELEM_NONCONST)
460#define BM_CHECK_TYPE_FACE(ele) \
461 CHECK_TYPE_ANY(ele, _BM_GENERIC_TYPE_FACE_NONCONST, _BM_GENERIC_TYPE_FACE_CONST)
466#define BM_CHECK_TYPE_ELEM_ASSIGN(ele) (BM_CHECK_TYPE_ELEM(ele)), *((void **)&ele)
507#define BM_ELEM_CD_SET_INT(ele, offset, f) \
509 CHECK_TYPE_NONCONST(ele); \
510 BLI_assert(offset != -1); \
511 *((int *)((char *)(ele)->head.data + (offset))) = (f); \
515#define BM_ELEM_CD_GET_INT(ele, offset) \
516 (BLI_assert(offset != -1), *((int *)((char *)(ele)->head.data + (offset))))
518#define BM_ELEM_CD_SET_BOOL(ele, offset, f) \
520 CHECK_TYPE_NONCONST(ele); \
521 BLI_assert(offset != -1); \
522 *((bool *)((char *)(ele)->head.data + (offset))) = (f); \
526#define BM_ELEM_CD_GET_BOOL(ele, offset) \
527 (BLI_assert(offset != -1), *((bool *)((char *)(ele)->head.data + (offset))))
529#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
530# define BM_ELEM_CD_GET_BOOL_P(ele, offset) \
531 (BLI_assert(offset != -1), \
533 GENERIC_TYPE_ANY((bool *)POINTER_OFFSET((ele)->head.data, offset), \
534 _BM_GENERIC_TYPE_ELEM_NONCONST), \
535 GENERIC_TYPE_ANY((const bool *)POINTER_OFFSET((ele)->head.data, offset), \
536 _BM_GENERIC_TYPE_ELEM_CONST)))
538# define BM_ELEM_CD_GET_BOOL_P(ele, offset) \
539 (BLI_assert(offset != -1), (bool *)((char *)(ele)->head.data + (offset)))
542#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
543# define BM_ELEM_CD_GET_VOID_P(ele, offset) \
544 (BLI_assert(offset != -1), \
546 GENERIC_TYPE_ANY(POINTER_OFFSET((ele)->head.data, offset), _BM_GENERIC_TYPE_ELEM_NONCONST), \
547 GENERIC_TYPE_ANY((const void *)POINTER_OFFSET((ele)->head.data, offset), \
548 _BM_GENERIC_TYPE_ELEM_CONST)))
550# define BM_ELEM_CD_GET_VOID_P(ele, offset) \
551 (BLI_assert(offset != -1), (void *)((char *)(ele)->head.data + (offset)))
554#define BM_ELEM_CD_SET_FLOAT(ele, offset, f) \
556 CHECK_TYPE_NONCONST(ele); \
557 BLI_assert(offset != -1); \
558 *((float *)((char *)(ele)->head.data + (offset))) = (f); \
562#define BM_ELEM_CD_GET_FLOAT(ele, offset) \
563 (BLI_assert(offset != -1), *((float *)((char *)(ele)->head.data + (offset))))
565#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)
567# define BM_ELEM_CD_GET_FLOAT_P(ele, offset) \
568 (BLI_assert(offset != -1), \
570 GENERIC_TYPE_ANY((float *)POINTER_OFFSET((ele)->head.data, offset), \
571 _BM_GENERIC_TYPE_ELEM_NONCONST), \
572 GENERIC_TYPE_ANY((const float *)POINTER_OFFSET((ele)->head.data, offset), \
573 _BM_GENERIC_TYPE_ELEM_CONST)))
575# define BM_ELEM_CD_GET_FLOAT2_P(ele, offset) \
576 (BLI_assert(offset != -1), \
578 GENERIC_TYPE_ANY((float(*)[2])POINTER_OFFSET((ele)->head.data, offset), \
579 _BM_GENERIC_TYPE_ELEM_NONCONST), \
580 GENERIC_TYPE_ANY((const float(*)[2])POINTER_OFFSET((ele)->head.data, offset), \
581 _BM_GENERIC_TYPE_ELEM_CONST)))
583# define BM_ELEM_CD_GET_FLOAT3_P(ele, offset) \
584 (BLI_assert(offset != -1), \
586 GENERIC_TYPE_ANY((float(*)[3])POINTER_OFFSET((ele)->head.data, offset), \
587 _BM_GENERIC_TYPE_ELEM_NONCONST), \
588 GENERIC_TYPE_ANY((const float(*)[3])POINTER_OFFSET((ele)->head.data, offset), \
589 _BM_GENERIC_TYPE_ELEM_CONST)))
593# define BM_ELEM_CD_GET_FLOAT_P(ele, offset) \
594 (BLI_assert(offset != -1), (float *)((char *)(ele)->head.data + (offset)))
596# define BM_ELEM_CD_GET_FLOAT2_P(ele, offset) \
597 (BLI_assert(offset != -1), (float(*)[2])((char *)(ele)->head.data + (offset)))
599# define BM_ELEM_CD_GET_FLOAT3_P(ele, offset) \
600 (BLI_assert(offset != -1), (float(*)[3])((char *)(ele)->head.data + (offset)))
604#define BM_ELEM_CD_SET_FLOAT2(ele, offset, f) \
606 CHECK_TYPE_NONCONST(ele); \
607 BLI_assert(offset != -1); \
608 ((float *)((char *)(ele)->head.data + (offset)))[0] = (f)[0]; \
609 ((float *)((char *)(ele)->head.data + (offset)))[1] = (f)[1]; \
613#define BM_ELEM_CD_SET_FLOAT3(ele, offset, f) \
615 CHECK_TYPE_NONCONST(ele); \
616 BLI_assert(offset != -1); \
617 ((float *)((char *)(ele)->head.data + (offset)))[0] = (f)[0]; \
618 ((float *)((char *)(ele)->head.data + (offset)))[1] = (f)[1]; \
619 ((float *)((char *)(ele)->head.data + (offset)))[2] = (f)[2]; \
623#define BM_ELEM_CD_GET_FLOAT_AS_UCHAR(ele, offset) \
624 (BLI_assert(offset != -1), (uchar)(BM_ELEM_CD_GET_FLOAT(ele, offset) * 255.0f))
628#ifdef USE_BMESH_HOLES
629# define BM_FACE_FIRST_LOOP(p) (((BMLoopList *)((p)->loops.first))->first)
631# define BM_FACE_FIRST_LOOP(p) ((p)->l_first)
634#define BM_DISK_EDGE_NEXT(e, v) \
635 (CHECK_TYPE_INLINE(e, BMEdge *), \
636 CHECK_TYPE_INLINE(v, BMVert *), \
637 BLI_assert(BM_vert_in_edge(e, v)), \
638 (((&e->v1_disk_link)[v == e->v2]).next))
639#define BM_DISK_EDGE_PREV(e, v) \
640 (CHECK_TYPE_INLINE(e, BMEdge *), \
641 CHECK_TYPE_INLINE(v, BMVert *), \
642 BLI_assert(BM_vert_in_edge(e, v)), \
643 (((&e->v1_disk_link)[v == e->v2]).prev))
649#define BM_DEFAULT_NGON_STACK_SIZE 32
655#define BM_DEFAULT_ITER_STACK_SIZE 16
659#define BM_LOOP_RADIAL_MAX 10000
660#define BM_NGON_MAX 100000
663#define BM_THREAD_LIMIT 10000
#define BLI_STATIC_ASSERT(a, msg)
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
SymEdge< T > * prev(const SymEdge< T > *se)
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