31#ifdef USE_DEBUG_INDEX_MEMCHECK
32# define DEBUG_MEMCHECK_INDEX_INVALIDATE(ele) \
35 BM_elem_index_set(ele, undef_idx); \
52 v->head.data =
nullptr;
54#ifdef USE_DEBUG_INDEX_MEMCHECK
55 DEBUG_MEMCHECK_INDEX_INVALIDATE(
v);
65 if (
bm->use_toolflags) {
141 e->head.data =
nullptr;
143#ifdef USE_DEBUG_INDEX_MEMCHECK
144 DEBUG_MEMCHECK_INDEX_INVALIDATE(
e);
151 e->head.api_flag = 0;
154 if (
bm->use_toolflags) {
220 l->head.data =
nullptr;
222#ifdef USE_DEBUG_INDEX_MEMCHECK
223 DEBUG_MEMCHECK_INDEX_INVALIDATE(
l);
230 l->head.api_flag = 0;
236 l->radial_next =
nullptr;
237 l->radial_prev =
nullptr;
264#ifdef USE_BMESH_HOLES
271#ifdef USE_BMESH_HOLES
272 lst->first = lst->last =
l;
283 const bool copy_verts,
284 const bool copy_edges)
303 }
while ((l_iter = l_iter->
next) != l_first);
323 edges[
i] = l_iter->
e;
326 }
while ((l_iter = l_iter->
next) != l_first);
337 const bool copy_verts,
338 const bool copy_edges)
350 l_copy = l_copy->
next;
351 }
while ((l_iter = l_iter->
next) != l_first);
367 l_copy = l_copy->
next;
368 }
while ((l_iter = l_iter->
next) != l_first);
386#ifdef USE_DEBUG_INDEX_MEMCHECK
387 DEBUG_MEMCHECK_INDEX_INVALIDATE(f);
397 if (
bm->use_toolflags) {
402#ifdef USE_BMESH_HOLES
420#ifdef USE_BMESH_HOLES
458 for (
i = 1;
i <
len;
i++) {
468 startl->
prev = lastl;
469 lastl->
next = startl;
501 const bool create_edges)
563 if (head->
htype != htype) {
570 if (
v->e &&
v->e->head.htype !=
BM_EDGE) {
577 if (
e->v1_disk_link.prev ==
nullptr ||
e->v2_disk_link.prev ==
nullptr ||
578 e->v1_disk_link.next ==
nullptr ||
e->v2_disk_link.next ==
nullptr)
583 if (
e->l &&
e->l->head.htype !=
BM_LOOP) {
586 if (
e->l &&
e->l->f->head.htype !=
BM_FACE) {
589 if (
e->l && (
e->l->radial_next ==
nullptr ||
e->l->radial_prev ==
nullptr)) {
592 if (
e->l &&
e->l->f->len <= 0) {
613 "%s: fatal bmesh error (vert not in edge)! (bmesh internal error)\n",
618 if (
l->radial_next ==
nullptr ||
l->radial_prev ==
nullptr) {
621 if (
l->f->len <= 0) {
635 }
while ((l2 = l2->
next) !=
l);
637 if (
i !=
l->f->len || l2 !=
l) {
653# ifdef USE_BMESH_HOLES
663 if (l_iter->
f != f) {
665 "%s: loop inside one face points to another! (bmesh internal error)\n",
676 if (l_iter->
e && l_iter->
v) {
711 }
while ((l_iter = l_iter->
next) != l_first);
723 }
while ((l_iter = l_iter->
next) != l_first);
759 if (
bm->vtoolflagpool) {
782 if (
bm->etoolflagpool) {
794 if (
bm->act_face == f) {
795 bm->act_face =
nullptr;
809 if (
bm->ftoolflagpool) {
841 edges[
i++] = l_iter->
e;
842 }
while ((l_iter = l_iter->
next) != l_first);
844 for (
i = 0;
i < f->
len;
i++) {
859 }
while ((l_iter = l_iter->
next) != l_first);
861 for (
i = 0;
i < f->
len;
i++) {
868#ifdef USE_BMESH_HOLES
869 BMLoopList *ls, *ls_next;
879#ifdef USE_BMESH_HOLES
880 for (ls = f->loops.first; ls; ls = ls_next)
885 BMLoop *l_iter, *l_next, *l_first;
887#ifdef USE_BMESH_HOLES
889 l_iter = l_first = ls->first;
895 l_next = l_iter->
next;
900 }
while ((l_iter = l_next) != l_first);
902#ifdef USE_BMESH_HOLES
912#ifdef USE_BMESH_HOLES
913 BMLoopList *ls, *ls_next;
918#ifdef USE_BMESH_HOLES
919 for (ls = f->loops.first; ls; ls = ls_next)
924 BMLoop *l_iter, *l_next, *l_first;
926#ifdef USE_BMESH_HOLES
928 l_iter = l_first = ls->first;
935 l_next = l_iter->
next;
941 if (
e->l ==
nullptr) {
948 if (v1->
e ==
nullptr) {
951 if (
v2->e ==
nullptr) {
955 }
while ((l_iter = l_next) != l_first);
957#ifdef USE_BMESH_HOLES
998 }
while ((
l =
l->next) != l_first);
1005 const int cd_loop_mdisp_offset,
1006 const bool use_loop_mdisp_flip)
1014 bool is_prev_boundary = l_prev_radial_next == l_prev_radial_next->
radial_next;
1016 BMLoop *l_iter = l_first;
1021 bool is_iter_boundary = l_iter_radial_next == l_iter_radial_next->
radial_next;
1028 if (is_prev_boundary) {
1041 if (e_iter->
l == l_iter) {
1042 e_iter->
l = l_iter->
next;
1047 std::swap(l_iter->
next, l_iter->
prev);
1049 if (cd_loop_mdisp_offset != -1) {
1055 l_prev_radial_next = l_iter_radial_next;
1056 l_prev_radial_prev = l_iter_radial_prev;
1057 is_prev_boundary = is_iter_boundary;
1060 }
while ((l_iter = l_iter->
prev) != l_first);
1065 for (
i = 0, l_iter = l_first;
i < f->
len;
i++, l_iter = l_iter->
next) {
1084 for (
i = 0;
i < tot;
i++) {
1094 for (
i = 0;
i < tot;
i++) {
1153 }
while ((
l =
l->radial_next) !=
e->l);
1164#ifdef USE_BMESH_HOLES
1166 ListBase holes = {
nullptr,
nullptr};
1170 BMVert *v1 =
nullptr, *
v2 =
nullptr;
1174 const bool had_active_face = (
bm->act_face !=
nullptr);
1178 *r_double =
nullptr;
1196 for (
i = 0;
i < totface;
i++) {
1216 else if (rlen == 2) {
1246 }
while ((l_iter = l_iter->
next) != l_first);
1248#ifdef USE_BMESH_HOLES
1249 for (lst = f->loops.first; lst; lst = lst->next) {
1250 if (lst == f->loops.first) {
1278 *r_double = f_existing;
1288 bool reusing_face = (f_existing && r_double ==
nullptr);
1292 if (
LIKELY(reusing_face ==
false)) {
1304 }
while (l2 != l_iter);
1308 if (l2->
v != l_iter->
v) {
1315 }
while ((l_iter = l_iter->
next) != l_first);
1317#ifdef USE_BMESH_HOLES
1322 for (lst = f_new->loops.first; lst; lst = lst->next) {
1323 l_iter = l_first = lst->first;
1326 }
while ((l_iter = l_iter->
next) != l_first);
1331 if (cd_loop_mdisp_offset != -1) {
1336 for (
i = 0;
i < totface;
i++) {
1342 for (
i = 0;
i < totface;
i++) {
1344 bm, l_iter,
faces[
i], f_center, faces_center[
i], cd_loop_mdisp_offset);
1346 }
while ((l_iter = l_iter->
next) != l_first);
1356 for (
BMEdge *edge : deledges) {
1360 for (
BMVert *vert : delverts) {
1367 for (
i = 0;
i < totface;
i++) {
1374 if (had_active_face &&
bm->act_face ==
nullptr) {
1375 bm->act_face = f_new;
1385#ifdef USE_BMESH_HOLES
1391#ifdef USE_BMESH_HOLES
1396#ifdef USE_BMESH_HOLES
1410#ifdef USE_BMESH_HOLES
1414 const bool no_double)
1416#ifdef USE_BMESH_HOLES
1417 BMLoopList *lst, *lst2;
1423 BMLoop *l_iter, *l_first;
1424 BMLoop *l_f1 =
nullptr, *l_f2 =
nullptr;
1448#ifdef USE_BMESH_HOLES
1449 lst = f->loops.first;
1450 lst2 = f2->loops.first;
1452 lst2->first = lst2->last = l_f2;
1453 lst->first = lst->last = l_f1;
1456 l_iter = l_first = l_f1;
1462 }
while ((l_iter = l_iter->
next) != l_first);
1464 if (first_loop_f1) {
1503 }
while ((l_iter = l_iter->
next) != l_first);
1515 }
while ((l_iter = l_iter->
next) != l_first);
1523#ifdef USE_BMESH_HOLES
1530 for (lst = f->loops.last; lst != f->loops.first; lst = lst2) {
1550 int valence1, valence2;
1598 bool is_first =
true;
1609 l_new->
next =
l->next;
1622 l->radial_next =
l->radial_prev =
nullptr;
1635 l->radial_next =
l->radial_prev =
nullptr;
1701 const bool check_edge_exists,
1702 const bool kill_degenerate_faces,
1703 const bool kill_duplicate_faces)
1706 BMVert *v_old, *v_target;
1721 int valence1, valence2;
1747 if (check_edge_exists) {
1766 if (l_kill->
next->
v == v_kill) {
1767 l_kill->
next->
v = v_target;
1778 if (kill_degenerate_faces && (l_kill->
f->
len < 3)) {
1784 if (kill_duplicate_faces) {
1792 }
while ((l_kill = l_kill_next) != e_kill->
l);
1808 v_kill->
e =
nullptr;
1832 if (check_edge_exists) {
1839 if (kill_degenerate_faces) {
1846 if (kill_duplicate_faces) {
1868 const bool check_edge_exists,
1869 const bool kill_degenerate_faces)
1877 BMLoop *l_kill, *l_first, *l_kill_next;
1878 l_kill = l_first = e_kill->
l;
1881 if (l_kill->
next->
v == v_kill) {
1882 l_kill->
next->
v = v_target;
1893 if (kill_degenerate_faces) {
1894 if (l_kill->
f->
len < 3) {
1902 }
while ((l_kill = l_kill_next) != l_first);
1904 e_kill->
l =
nullptr;
1911 if (v_target->
e && v_kill->
e) {
1914 while ((
e = v_kill->
e)) {
1917 if (check_edge_exists) {
1924 if (check_edge_exists) {
1932 if (kill_degenerate_faces) {
1949 BMLoop *l_iter, *l_f1 =
nullptr, *l_f2 =
nullptr;
1950 int newlen = 0,
i, f1len = 0, f2len = 0;
1971 if (l_f1->
v == l_f2->v) {
1990 bool is_dupe =
false;
2001 if (l_iter != l_f2) {
2031 f1->
len += (f2->
len - 2);
2044 if (
bm->etoolflagpool) {
2053 if (
bm->ftoolflagpool) {
2072 bool is_double =
false;
2076 if (v_a->
e && v_b->
e) {
2079#define VERT_VISIT _FLAG_WALK
2082 e = e_first = v_a->
e;
2090 e = e_first = v_b->
e;
2100 e = e_first = v_a->
e;
2118 if (v_src == v_dst) {
2125 while ((
e = v_src->
e)) {
2146 return (
e->l &&
e->l->radial_next !=
e->l);
2152 int v_edges_num = 0;
2169 int edges_found = 0;
2171#define EDGE_VISIT _FLAG_WALK
2175 BMEdge *e_first, *e_iter;
2176 e_iter = e_first =
v->e;
2197 BMLoop *l_iter, *l_first;
2198 l_iter = l_first =
e->l;
2206 }
while ((l_iter = l_iter->
radial_next) != l_first);
2214 if (edges_found == v_edges_num) {
2243 if (r_vout_len !=
nullptr) {
2244 *r_vout_len = verts_num;
2247 if (r_vout !=
nullptr) {
2295 }
while ((n_step = n_step->
next));
2297 }
while ((n_orig = n_orig->
next) && n_orig->
next);
2298 }
while ((edges_separate = edges_separate->
next));
2305 const bool copy_select,
2309 LinkNode *edges_separate =
nullptr;
2312 for (
i = 0;
i < e_in_len;
i++) {
2329 if (edges_separate) {
2337 const bool copy_select,
2341 LinkNode *edges_separate =
nullptr;
2342 BMEdge *e_iter, *e_first;
2344 e_iter = e_first =
v->e;
2354 if (edges_separate ==
nullptr && edges_orig ==
nullptr) {
2368 if (edges_separate) {
2377 BMEdge *e_iter, *e_first;
2379 e_iter = e_first = v_src->
e;
2381 if (testfn(e_iter, arg)) {
2388 e_iter =
static_cast<BMEdge *
>(edges_hflag->
link);
2390 }
while ((edges_hflag = edges_hflag->
next));
2444 if (l_sep ==
e->l) {
2490 while (!
ELEM(e_iter, l_sep->
e, l_sep->
prev->
e)) {
2496 if (e_iter == v_sep->
e) {
2502 v_sep->
e = l_sep->
e;
2506 edges[0] = l_sep->
e;
2507 edges[1] = l_sep->
prev->
e;
2533 bool is_mixed_edge_any =
false;
2535 bool is_mixed_loop_any =
false;
2537#define LOOP_VISIT _FLAG_WALK
2538#define EDGE_VISIT _FLAG_WALK
2540 for (
i = 0;
i < larr_len;
i++) {
2555 for (
int j = 0; j <
ARRAY_SIZE(loop_pair); j++) {
2570 BMEdge *e_first, *e_iter;
2571 e_iter = e_first = v_sep->
e;
2574 BMLoop *l_iter, *l_first;
2575 bool is_mixed_loop =
false;
2577 l_iter = l_first = e_iter->
l;
2580 is_mixed_loop =
true;
2583 }
while ((l_iter = l_iter->
radial_next) != l_first);
2585 if (is_mixed_loop) {
2590 is_mixed_loop_any =
true;
2597 is_mixed_edge_any =
true;
2604 if (is_mixed_loop_any ==
false && is_mixed_edge_any ==
false) {
2614 BMLoop *l_iter, *l_first, *l_next;
2625 if (
e->v1 == v_sep) {
2626 e_new_v_pair[0] = v_new;
2627 e_new_v_pair[1] =
e->v2;
2631 e_new_v_pair[0] =
e->v1;
2632 e_new_v_pair[1] = v_new;
2638 l_iter = l_first =
e->l;
2646 }
while ((l_iter = l_next) != l_first);
2657 for (
i = 0;
i < larr_len;
i++) {
2681 BMLoop *l_iter, *l_first;
2686 l_iter = l_first =
e->l;
2688 if (l_iter->
v == v_src) {
2694 else if (l_iter->
next->
v == v_src) {
2695 l_iter->
next->
v = v_dst;
2703 }
while ((l_iter = l_iter->
radial_next) != l_first);
2717 BMLoop *l_iter, *l_first;
2724 }
while ((l_iter = l_iter->
next) != l_first);
2729 }
while ((l_iter = l_iter->
next) != l_first);
2731 std::swap((*f_a), (*f_b));
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
void CustomData_bmesh_free_block(CustomData *data, void **block)
void * CustomData_bmesh_get(const CustomData *data, void *block, eCustomDataType type)
void CustomData_bmesh_set_default(CustomData *data, void **block)
void CustomData_bmesh_copy_block(CustomData &data, void *src_block, void **dst_block)
void BKE_mesh_mdisp_flip(MDisps *md, bool use_loop_mdisp_flip)
#define BLI_array_alloca(arr, realsize)
#define BLI_linklist_prepend_alloca(listp, ptr)
BLI_LINKSTACK_*** wrapper macros for using a LinkNode to store a stack of pointers,...
#define BLI_SMALLSTACK_DECLARE(var, type)
#define BLI_SMALLSTACK_AS_TABLE(var, data)
#define BLI_SMALLSTACK_POP(var)
#define BLI_SMALLSTACK_PUSH(var, data)
void void void BLI_movelisttolist(ListBase *dst, ListBase *src) ATTR_NONNULL(1
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void zero_v3(float r[3])
void * BLI_mempool_alloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
void BLI_mempool_free(BLI_mempool *pool, void *addr) ATTR_NONNULL(1
void * BLI_mempool_calloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
#define UNUSED_FUNCTION(x)
#define ENUM_OPERATORS(_type, _max)
#define STACK_PUSH(stack, val)
#define STACK_DECLARE(stack)
#define STACK_SIZE(stack)
#define STACK_INIT(stack, stack_num)
Read Guarded memory(de)allocation.
#define BM_DISK_EDGE_NEXT(e, v)
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
void BM_elem_select_copy(BMesh *bm_dst, void *ele_dst_v, const void *ele_src_v)
void BM_elem_attrs_copy(BMesh *bm, const BMCustomDataCopyMap &map, const BMVert *src, BMVert *dst)
void BM_edges_from_verts_ensure(BMesh *bm, BMEdge **edge_arr, BMVert **vert_arr, const int len)
bool BM_edges_from_verts(BMEdge **edge_arr, BMVert **vert_arr, const int len)
BMFace * BM_face_create_ngon(BMesh *bm, BMVert *v1, BMVert *v2, BMEdge **edges, const int len, const BMFace *f_example, const eBMCreateFlag create_flag)
Make NGon.
void bmesh_face_swap_data(BMFace *f_a, BMFace *f_b)
static int UNUSED_FUNCTION bm_loop_length(BMLoop *l)
BMVert * bmesh_kernel_unglue_region_make_vert_multi_isolated(BMesh *bm, BMLoop *l_sep)
BMVert * bmesh_kernel_split_edge_make_vert(BMesh *bm, BMVert *tv, BMEdge *e, BMEdge **r_e)
Split Edge Make Vert (SEMV).
static void bmesh_edge_vert_swap__recursive(BMEdge *e, BMVert *v_dst, BMVert *v_src)
void BM_face_verts_kill(BMesh *bm, BMFace *f)
static BMLoop * bm_face_boundary_add(BMesh *bm, BMFace *f, BMVert *startv, BMEdge *starte, const eBMCreateFlag create_flag)
bool BM_edge_splice(BMesh *bm, BMEdge *e_dst, BMEdge *e_src)
Splice Edge.
void BM_vert_separate(BMesh *bm, BMVert *v, BMEdge **e_in, int e_in_len, const bool copy_select, BMVert ***r_vout, int *r_vout_len)
BMFace * BM_faces_join(BMesh *bm, BMFace **faces, int totface, const bool do_del, BMFace **r_double)
Join Connected Faces.
static void bm_elements_systag_disable(void *veles, int tot, const char api_flag)
static void bm_kill_only_loop(BMesh *bm, BMLoop *l)
void bmesh_kernel_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep, const bool copy_select)
Separate Edge.
bool BM_vert_splice(BMesh *bm, BMVert *v_dst, BMVert *v_src)
Splice Vert.
void BM_vert_kill(BMesh *bm, BMVert *v)
static void bmesh_kernel_vert_separate__cleanup(BMesh *bm, LinkNode *edges_separate)
static BMFace * bm_face_create__sfme(BMesh *bm, BMFace *f_example)
static BMFace * bm_face_copy_impl(BMesh *bm_dst, BMFace *f, const bool copy_verts, const bool copy_edges)
void BM_face_kill(BMesh *bm, BMFace *f)
BMFace * bmesh_kernel_join_face_kill_edge(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
Join Face Kill Edge (JFKE).
BMFace * BM_face_create_verts(BMesh *bm, BMVert **vert_arr, const int len, const BMFace *f_example, const eBMCreateFlag create_flag, const bool create_edges)
void BM_vert_separate_hflag(BMesh *bm, BMVert *v, const char hflag, const bool copy_select, BMVert ***r_vout, int *r_vout_len)
BMEdge * bmesh_kernel_join_edge_kill_vert(BMesh *bm, BMEdge *e_kill, BMVert *v_kill, const bool do_del, const bool check_edge_exists, const bool kill_degenerate_faces, const bool kill_duplicate_faces)
Join Edge Kill Vert (JEKV).
void BM_face_kill_loose(BMesh *bm, BMFace *f)
static void bm_kill_only_vert(BMesh *bm, BMVert *v)
BMVert * bmesh_kernel_unglue_region_make_vert_multi(BMesh *bm, BMLoop **larr, int larr_len)
BMVert * bmesh_kernel_unglue_region_make_vert(BMesh *bm, BMLoop *l_sep)
Un-glue Region Make Vert (URMV).
static void bm_kill_only_edge(BMesh *bm, BMEdge *e)
BMFace * BM_face_copy(BMesh *bm_dst, const BMCustomDataCopyMap &cd_face_map, const BMCustomDataCopyMap &cd_loop_map, BMFace *f, const bool copy_verts, const bool copy_edges)
void BM_face_edges_kill(BMesh *bm, BMFace *f)
BMVert * bmesh_kernel_join_vert_kill_edge(BMesh *bm, BMEdge *e_kill, BMVert *v_kill, const bool do_del, const bool check_edge_exists, const bool kill_degenerate_faces)
Join Vert Kill Edge (JVKE).
BMFace * BM_face_create(BMesh *bm, BMVert *const *verts, BMEdge *const *edges, const int len, const BMFace *f_example, const eBMCreateFlag create_flag)
static BMLoop * bm_loop_create(BMesh *bm, BMVert *v, BMEdge *e, BMFace *f, const BMLoop *l_example, const eBMCreateFlag create_flag)
BLI_INLINE BMFace * bm_face_create__internal(BMesh *bm)
static bool bm_vert_is_manifold_flagged(BMVert *v, const char api_flag)
void bmesh_kernel_loop_reverse(BMesh *bm, BMFace *f, const int cd_loop_mdisp_offset, const bool use_loop_mdisp_flip)
Loop Reverse.
void BM_edge_kill(BMesh *bm, BMEdge *e)
BMVert * BM_vert_create(BMesh *bm, const float co[3], const BMVert *v_example, const eBMCreateFlag create_flag)
Main function for creating a new vertex.
int bmesh_elem_check(void *element, const char htype)
BMFace * bmesh_kernel_split_face_make_edge(BMesh *bm, BMFace *f, BMLoop *l_v1, BMLoop *l_v2, BMLoop **r_l, BMEdge *e_example, const bool no_double)
Split Face Make Edge (SFME).
void BM_vert_separate_tested_edges(BMesh *, BMVert *v_dst, BMVert *v_src, bool(*testfn)(BMEdge *, void *arg), void *arg)
@ IS_LOOP_NULL_CYCLE_LINK
@ IS_LOOP_WRONG_FACE_LENGTH
@ IS_FACE_LOOP_WRONG_RADIAL_LENGTH
@ IS_FACE_LOOP_VERT_NOT_IN_EDGE
@ IS_EDGE_WRONG_LOOP_TYPE
@ IS_LOOP_WRONG_FACE_TYPE
@ IS_EDGE_NULL_RADIAL_LINK
@ IS_VERT_WRONG_EDGE_TYPE
@ IS_LOOP_VERT_NOT_IN_EDGE
@ IS_LOOP_WRONG_VERT_TYPE
@ IS_EDGE_WRONG_FACE_TYPE
@ IS_LOOP_WRONG_RADIAL_LENGTH
@ IS_FACE_WRONG_LOOP_FACE
@ IS_EDGE_ZERO_FACE_LENGTH
@ IS_LOOP_WRONG_EDGE_TYPE
@ IS_FACE_LOOP_WRONG_DISK_LENGTH
@ IS_LOOP_ZERO_FACE_LENGTH
static void bm_elements_systag_enable(void *veles, int tot, const char api_flag)
static int bm_loop_systag_count_radial(BMLoop *l, const char api_flag)
void bmesh_kernel_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len, const bool copy_select)
Separate Vert.
BMEdge * BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *e_example, const eBMCreateFlag create_flag)
Main function for creating a new edge.
BLI_INLINE bool bm_edge_supports_separate(const BMEdge *e)
static int UNUSED_FUNCTION bm_vert_systag_count_disk(BMVert *v, const char api_flag)
static void bm_kill_only_face(BMesh *bm, BMFace *f)
bool BM_vert_splice_check_double(BMVert *v_a, BMVert *v_b)
#define BM_elem_flag_disable(ele, hflag)
#define BM_elem_flag_set(ele, hflag, val)
#define BM_elem_index_set(ele, index)
#define BM_elem_flag_test(ele, hflag)
void BM_loop_interp_multires_ex(BMesh *, BMLoop *l_dst, const BMFace *f_src, const float f_dst_center[3], const float f_src_center[3], const int cd_loop_mdisp_offset)
#define BM_select_history_remove(bm, ele)
ATTR_WARN_UNUSED_RESULT const void * element
void BM_face_calc_center_median(const BMFace *f, float r_cent[3])
#define BM_ELEM_API_FLAG_DISABLE(element, f)
#define BM_ELEM_API_FLAG_TEST(element, f)
#define BM_CHECK_ELEMENT(el)
int bmesh_radial_length(const BMLoop *l)
int bmesh_disk_count_at_most(const BMVert *v, int count_max)
#define BM_ELEM_API_FLAG_ENABLE(element, f)
int bmesh_disk_count(const BMVert *v)
bool BM_vert_pair_share_face_check(BMVert *v_a, BMVert *v_b)
bool BM_edge_in_face(const BMEdge *e, const BMFace *f)
BMFace * BM_face_exists(BMVert *const *varr, int len)
int BM_face_share_edge_count(BMFace *f_a, BMFace *f_b)
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
BMFace * BM_face_find_double(BMFace *f)
BMLoop * BM_face_edge_share_loop(BMFace *f, BMEdge *e)
Return the Loop Shared by Face and Edge.
BLI_INLINE bool BM_edge_is_manifold(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_edge_is_boundary(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
#define BM_edge_face_count_is_over(e, n)
#define BM_vert_edge_count_is_equal(v, n)
BLI_INLINE BMVert * BM_edge_other_vert(BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_verts_in_edge(const BMVert *v1, const BMVert *v2, const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
BLI_INLINE bool BM_vert_in_edge(const BMEdge *e, const BMVert *v) 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
void bmesh_disk_edge_remove(BMEdge *e, BMVert *v)
bool bmesh_loop_validate(BMFace *f)
void bmesh_disk_edge_append(BMEdge *e, BMVert *v)
void bmesh_edge_vert_swap(BMEdge *e, BMVert *v_dst, BMVert *v_src)
void bmesh_disk_vert_replace(BMEdge *e, BMVert *v_dst, BMVert *v_src)
void bmesh_radial_loop_unlink(BMLoop *l)
void bmesh_radial_loop_append(BMEdge *e, BMLoop *l)
void bmesh_radial_loop_remove(BMEdge *e, BMLoop *l)
BMESH RADIAL REMOVE LOOP.
bool bmesh_disk_validate(int len, BMEdge *e, BMVert *v)
bool bmesh_radial_validate(int radlen, BMLoop *l)
BLI_INLINE BMEdge * bmesh_disk_edge_next(const BMEdge *e, const BMVert *v) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void append(const T &value)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
struct BMLoop * radial_prev
struct BMLoop * radial_next