49 #define USE_WALKER_REUSE
54 #define USE_PIVOT_FASTMATCH
57 #define USE_PIVOT_SEARCH
73 #define PRIME_VERT_INIT 100003
200 const uint faces_src_region_len,
201 const uint verts_src_region_len)
274 #define PRIME_VERT_SMALL 7
275 #define PRIME_VERT_MID 43
276 #define PRIME_VERT_LARGE 1031
278 #define PRIME_FACE_SMALL 13
279 #define PRIME_FACE_MID 53
319 #undef PRIME_VERT_SMALL
320 #undef PRIME_VERT_MID
321 #undef PRIME_VERT_LARGE
323 #undef PRIME_FACE_SMALL
324 #undef PRIME_FACE_MID
329 #define PRIME_VERT_SMALL 11
331 #define PRIME_FACE_SMALL 17
332 #define PRIME_FACE_LARGE 1013
348 }
while ((l_iter = l_iter->next) != l_first);
364 }
while ((l_iter_radial = l_iter_radial->
radial_next) != l_iter);
366 }
while ((l_iter = l_iter->
next) != l_first);
371 #undef PRIME_VERT_SMALL
373 #undef PRIME_FACE_SMALL
374 #undef PRIME_FACE_LARGE
381 rehash_store_len_new *= 2;
383 rehash_store_len_new *
413 *((
UUID_Int *)uuid_p) = uuid_store[i++];
425 *((
UUID_Int *)uuid_p) = uuid_store[i++];
431 const uint faces_len,
442 for (f_link =
faces; f_link; f_link = f_link->
next) {
449 for (f_link =
faces; f_link; f_link = f_link->
next) {
455 for (f_link =
faces; f_link; f_link = f_link->
next) {
458 *((
UUID_Int *)uuid_p) = uuid_store[i++];
479 const uint faces_pass_len)
482 GHash *verts_uuid_pass;
483 GSet *faces_step_next;
506 for (f_link = faces_pass; f_link; f_link = f_link->
next) {
518 *val_p = (
void *)
uuid;
533 }
while ((l_iter_radial = l_iter_radial->
radial_next) != l_iter);
535 }
while ((l_iter = l_iter->
next) != l_first);
573 uint fstep_num = 0, i = 0;
596 for (i = 0; i < f_arr_len;) {
598 const uint i_init = i;
599 const int f_len = f_arr[i]->
len;
603 }
while (i < f_arr_len && (f_len == f_arr[i]->
len));
613 #undef PRIME_VERT_INIT
625 return (fstep_a->
uuid > fstep_b->
uuid) ? 1 : 0;
634 LinkNode *f_link, *f_link_next, **f_link_prev_p;
640 f_link_prev_p = &fstep->
faces;
641 for (f_link = fstep->
faces; f_link; f_link = f_link_next) {
643 f_link_next = f_link->
next;
669 f_link_prev_p = &f_link->
next;
672 *f_link_prev_p = f_link->
next;
702 for (f_link = fstep->
faces; f_link; f_link = f_link_next) {
703 f_link_next = f_link->
next;
727 const uint faces_src_region_len,
728 const uint verts_src_region_len,
729 uint *r_faces_result_len)
731 #ifndef USE_WALKER_REUSE
733 UUIDWalk *w_src = &w_src_, *w_dst = &w_dst_;
740 #ifndef USE_WALKER_REUSE
745 w_src->use_face_isolate =
true;
774 fstep_src = fstep_src_next;
775 fstep_dst = fstep_dst_next;
787 fstep_item_src && fstep_item_dst;
788 fstep_item_src = fstep_item_src->
next, fstep_item_dst = fstep_item_dst->
next) {
789 while ((fstep_item_dst !=
NULL) && (fstep_item_dst->
uuid < fstep_item_src->
uuid)) {
790 fstep_item_dst = fstep_item_dst->
next;
793 if ((fstep_item_dst ==
NULL) || (fstep_item_src->
uuid != fstep_item_dst->
uuid) ||
824 fstep_src = fstep_src->
next;
825 fstep_dst = fstep_dst->
next;
848 faces_result =
MEM_mallocN(
sizeof(*faces_result) * (faces_result_len + 1), __func__);
853 faces_result[faces_result_len] =
NULL;
854 *r_faces_result_len = faces_result_len;
857 *r_faces_result_len = 0;
862 #ifdef USE_WALKER_REUSE
877 const uint faces_len,
883 for (i = 0; i < faces_len; i++) {
896 }
while ((l_iter = l_iter->
next) != l_first);
904 *r_verts_len = verts_len;
908 #ifdef USE_PIVOT_SEARCH
919 return (
a < 0) ? -
a :
a;
924 if (
e->l->radial_next !=
e->l) {
946 if (e_pivot_test_id[0] > e_pivot_test_id[1]) {
950 if ((*r_e_pivot_best ==
NULL) ||
951 ((e_pivot_best_id[0] != e_pivot_test_id[0]) ? (e_pivot_best_id[0] < e_pivot_test_id[0]) :
952 (e_pivot_best_id[1] < e_pivot_test_id[1]))) {
953 e_pivot_best_id[0] = e_pivot_test_id[0];
954 e_pivot_best_id[1] = e_pivot_test_id[1];
957 *r_e_pivot_best = e_test;
964 # define PRIME_VERT_SMALL_A 7
965 # define PRIME_VERT_SMALL_B 13
966 # define PRIME_VERT_MID_A 103
967 # define PRIME_VERT_MID_B 131
985 # undef PRIME_VERT_SMALL_A
986 # undef PRIME_VERT_SMALL_B
987 # undef PRIME_VERT_MID_A
988 # undef PRIME_VERT_MID_B
1004 # define PRIME_VERT_MID_A 23
1005 # define PRIME_VERT_MID_B 31
1013 if (v_other_id > 0) {
1014 v_sum_id += v_other_id;
1022 v_sum_face_len += l_iter->
f->
len;
1040 # undef PRIME_VERT_MID_A
1041 # undef PRIME_VERT_MID_B
1052 uint faces_region_len,
1053 uint verts_region_len,
1072 uint vert_queue_used = 0;
1078 for (i = 0; i < faces_region_len; i++) {
1079 BMFace *f = faces_region[i];
1081 BMLoop *l_iter, *l_first;
1087 for (j = 0; j < 2; j++) {
1091 *val_p = (
void *)v_id;
1093 vert_queue_used += 1;
1099 e_pivot_fallback =
e;
1101 }
while ((l_iter = l_iter->
next) != l_first);
1119 *val_p = (
void *)v_id_other;
1121 vert_queue_used += 1;
1131 for (v_link = vert_queue_next; v_link; v_link = v_link->
next) {
1133 *v_id_p = -(*v_id_p);
1141 if (vert_queue_used == verts_region_len) {
1150 SUID_Int e_pivot_best_id[2] = {0, 0};
1153 for (v_link = vert_queue_prev; v_link; v_link = v_link->
next) {
1159 for (v_link = vert_queue_prev; v_link; v_link = v_link->
next) {
1176 e_pivot = e_pivot_best;
1182 SUID_Int e_pivot_best_id[2] = {0, 0};
1191 for (v_link = vert_queue_prev; v_link; v_link = v_link->
next) {
1206 e_pivot = e_pivot_best;
1214 if (e_pivot ==
NULL) {
1216 printf(
"%s: using fallback edge!\n", __func__);
1218 e_pivot = e_pivot_fallback;
1222 *r_depth = (
uint)pass;
1232 #ifdef USE_PIVOT_FASTMATCH
1246 # define PRIME_EDGE 7
1247 # define PRIME_FACE 31
1248 # define PRIME_LOOP 61
1283 for (pass = 0; pass < depth; pass++) {
1286 memcpy(id_curr, id_prev,
sizeof(*id_prev) * (
uint)
bm->
totvert);
1293 id_curr[
i1] += id_prev[i2];
1294 id_curr[i2] += id_prev[
i1];
1310 if (e_fm[0] > e_fm[1]) {
1323 return ((e_a_fm[0] == e_b_fm[0]) && (e_a_fm[1] == e_b_fm[1]));
1343 uint faces_region_len,
1349 uint verts_region_len = 0;
1350 uint faces_result_len = 0;
1354 #ifdef USE_WALKER_REUSE
1358 #ifdef USE_PIVOT_FASTMATCH
1377 #ifdef USE_PIVOT_SEARCH
1393 if (e_src ==
NULL) {
1395 printf(
"Couldn't find 'e_src'");
1402 #ifdef USE_PIVOT_FASTMATCH
1411 #ifdef USE_WALKER_REUSE
1418 uint faces_result_len_out;
1424 #ifdef USE_PIVOT_FASTMATCH
1443 &faces_result_len_out);
1453 faces_result_len += 1;
1457 #ifdef USE_WALKER_REUSE
1464 #ifdef USE_PIVOT_FASTMATCH
1471 printf(
"%s: search: %d, found %d\n", __func__, search_num, faces_result_len);
1478 return (
int)faces_result_len;
#define BLI_array_alloca(arr, realsize)
BLI_INLINE void * BLI_ghashIterator_getKey(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_new_ex(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info, const unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void BLI_ghash_clear(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
BLI_INLINE void ** BLI_ghashIterator_getValue_p(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
unsigned int BLI_gset_len(GSet *gs) ATTR_WARN_UNUSED_RESULT
#define GHASH_ITER(gh_iter_, ghash_)
unsigned int BLI_ghash_len(GHash *gh) ATTR_WARN_UNUSED_RESULT
void BLI_gset_clear(GSet *gs, GSetKeyFreeFP keyfreefp)
bool BLI_ghash_haskey(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_gset_insert(GSet *gs, void *key)
GHash * BLI_ghash_int_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
GSet * BLI_gset_new_ex(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info, const unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_gset_haskey(GSet *gs, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void BLI_gset_free(GSet *gs, GSetKeyFreeFP keyfreefp)
GHash * BLI_ghash_ptr_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
#define GHASH_ITER_INDEX(gh_iter_, ghash_, i_)
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_linklist_free_pool(LinkNode *list, LinkNodeFreeFP freefunc, struct BLI_mempool *mempool)
int BLI_linklist_count(const LinkNode *list) ATTR_WARN_UNUSED_RESULT
void void BLI_linklist_prepend_pool(LinkNode **listp, void *ptr, struct BLI_mempool *mempool) ATTR_NONNULL(1
BLI_LINKSTACK_*** wrapper macros for using a LinkNode to store a stack of pointers,...
#define BLI_LINKSTACK_PUSH(var, ptr)
#define BLI_LINKSTACK_DECLARE(var, type)
#define BLI_LINKSTACK_SIZE(var)
#define BLI_LINKSTACK_FREE(var)
#define BLI_LINKSTACK_INIT(var)
#define BLI_LINKSTACK_POP(var)
#define BLI_LINKSTACK_SWAP(var_a, var_b)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_pophead(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addhead(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
struct LinkData * BLI_genericNodeN(void *data)
void void BLI_listbase_sort(struct ListBase *listbase, int(*cmp)(const void *, const void *)) ATTR_NONNULL(1
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_mempool_free(BLI_mempool *pool, void *addr) ATTR_NONNULL(1
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int totelem, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void * BLI_mempool_alloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
void BLI_mempool_clear(BLI_mempool *pool) ATTR_NONNULL(1)
Strict compiler flags for areas of code we want to ensure don't do conversions without us knowing abo...
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint i1
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
Platform independent time functions.
Utility defines for timing/benchmarks.
#define TIMEIT_START(var)
#define BM_FACE_FIRST_LOOP(p)
#define BM_elem_index_get(ele)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_test(ele, hflag)
#define BM_elem_flag_test_bool(ele, hflag)
#define BM_elem_flag_enable(ele, hflag)
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_select_history_clear(BMesh *bm)
BMEdge * BM_mesh_active_edge_get(BMesh *bm)
void BM_mesh_elem_hflag_disable_all(BMesh *bm, const char htype, const char hflag, const bool respecthide)
#define BM_select_history_store(bm, ele)
void BM_mesh_elem_index_ensure(BMesh *bm, const char htype)
int BM_edge_face_count(const BMEdge *e)
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_edge_is_wire(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
static void bm_uuidwalk_init(UUIDWalk *uuidwalk, const uint faces_src_region_len, const uint verts_src_region_len)
BLI_INLINE bool bm_uuidwalk_face_test(UUIDWalk *uuidwalk, BMFace *f)
BLI_INLINE bool bm_uuidwalk_vert_lookup(UUIDWalk *uuidwalk, BMVert *v, UUID_Int *r_uuid)
static void bm_face_region_pivot_edge_use_best(GHash *gh, BMEdge *e_test, BMEdge **r_e_pivot_best, SUID_Int e_pivot_best_id[2])
static UUID_Int bm_uuidwalk_calc_face_uuid(UUIDWalk *uuidwalk, BMFace *f)
struct UUIDFaceStepItem UUIDFaceStepItem
static void bm_uuidwalk_free(UUIDWalk *uuidwalk)
static int bm_face_len_cmp(const void *v1, const void *v2)
static void bm_uuidwalk_rehash_reserve(UUIDWalk *uuidwalk, uint rehash_store_len_new)
static bool ghashutil_bmelem_indexcmp(const void *a, const void *b)
static bool bm_vert_is_uuid_connect(UUIDWalk *uuidwalk, BMVert *v)
static UUID_Int bm_uuidwalk_calc_vert_uuid(UUIDWalk *uuidwalk, BMVert *v)
static void bm_uuidwalk_pass_add(UUIDWalk *uuidwalk, LinkNode *faces_pass, const uint faces_pass_len)
static UUIDFashMatch bm_vert_fasthash_single(BMVert *v)
static UUIDFashMatch * bm_vert_fasthash_create(BMesh *bm, const uint depth)
static bool bm_uuidwalk_facestep_begin(UUIDWalk *uuidwalk, UUIDFaceStep *fstep)
static BMFace ** bm_mesh_region_match_pair(UUIDWalk *w_src, UUIDWalk *w_dst, BMEdge *e_src, BMEdge *e_dst, const uint faces_src_region_len, const uint verts_src_region_len, uint *r_faces_result_len)
BLI_INLINE intptr_t abs_intptr(intptr_t a)
BLI_INLINE bool bm_uuidwalk_face_lookup(UUIDWalk *uuidwalk, BMFace *f, UUID_Int *r_uuid)
static GSet * gset_bmelem_new_ex(const char *info, const uint nentries_reserve)
static void bm_vert_fasthash_destroy(UUIDFashMatch *fm)
static SUID_Int bm_face_region_vert_pass_id(GHash *gh, BMVert *v)
static uint bm_uuidwalk_init_from_edge(UUIDWalk *uuidwalk, BMEdge *e)
static int facestep_sort(const void *a, const void *b)
static void bm_uuidwalk_facestep_free(UUIDWalk *uuidwalk, UUIDFaceStep *fstep)
static uint ghashutil_bmelem_indexhash(const void *key)
static bool bm_vert_fasthash_edge_is_match(UUIDFashMatch *fm, const BMEdge *e_a, const BMEdge *e_b)
static BMEdge * bm_face_region_pivot_edge_find(BMFace **faces_region, uint faces_region_len, uint verts_region_len, uint *r_depth)
static void bm_uuidwalk_rehash(UUIDWalk *uuidwalk)
static void bm_uuidwalk_facestep_end(UUIDWalk *uuidwalk, UUIDFaceStep *fstep)
#define PRIME_VERT_SMALL_A
static void bm_uuidwalk_clear(UUIDWalk *uuidwalk)
struct UUIDFaceStep UUIDFaceStep
static SUID_Int bm_face_region_vert_boundary_id(BMVert *v)
static bool bm_edge_is_region_boundary(BMEdge *e)
static GHash * ghash_bmelem_new(const char *info)
static void bm_vert_fasthash_edge_order(const UUIDFashMatch *fm, const BMEdge *e, UUIDFashMatch e_fm[2])
#define PRIME_VERT_SMALL_B
int BM_mesh_region_match(BMesh *bm, BMFace **faces_region, uint faces_region_len, ListBase *r_face_regions)
static void bm_uuidwalk_rehash_facelinks(UUIDWalk *uuidwalk, LinkNode *faces, const uint faces_len, const bool is_init)
static GHash * ghash_bmelem_new_ex(const char *info, const uint nentries_reserve)
static void bm_face_array_visit(BMFace **faces, const uint faces_len, uint *r_verts_len, bool visit_faces)
static GSet * gset_bmelem_new(const char *info)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)
_W64 unsigned int uintptr_t
struct BMLoop * radial_next
struct UUIDFaceStepItem * prev
struct UUIDFaceStepItem * next
struct UUIDFaceStep * prev
struct UUIDFaceStep * next
struct UUIDWalk::@170 cache
BLI_mempool * step_pool_items