33#ifdef USE_DEBUG_INDEX_MEMCHECK
34# define DEBUG_MEMCHECK_INDEX_INVALIDATE(ele) \
37 BM_elem_index_set(ele, undef_idx); \
56#ifdef USE_DEBUG_INDEX_MEMCHECK
57 DEBUG_MEMCHECK_INDEX_INVALIDATE(
v);
145#ifdef USE_DEBUG_INDEX_MEMCHECK
146 DEBUG_MEMCHECK_INDEX_INVALIDATE(
e);
165 memset(&
e->v1_disk_link, 0,
sizeof(
BMDiskLink[2]));
222#ifdef USE_DEBUG_INDEX_MEMCHECK
223 DEBUG_MEMCHECK_INDEX_INVALIDATE(
l);
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);
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) {
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)
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",
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);
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++) {
1164#ifdef USE_BMESH_HOLES
1166 ListBase holes = {
nullptr,
nullptr};
1170 BMVert *v1 =
nullptr, *
v2 =
nullptr;
1189 for (i = 0; i < totface; i++) {
1199 else if (rlen == 1) {
1200 edges.append(l_iter->
e);
1207 else if (rlen == 2) {
1237 }
while ((l_iter = l_iter->
next) != l_first);
1239#ifdef USE_BMESH_HOLES
1240 for (lst = f->loops.first; lst; lst = lst->next) {
1241 if (lst == f->loops.first) {
1252 f_new = !edges.is_empty() ?
1271 }
while (l2 != l_iter);
1275 if (l2->
v != l_iter->
v) {
1282 }
while ((l_iter = l_iter->
next) != l_first);
1284#ifdef USE_BMESH_HOLES
1289 for (lst = f_new->loops.first; lst; lst = lst->next) {
1290 l_iter = l_first = lst->first;
1293 }
while ((l_iter = l_iter->
next) != l_first);
1301 if (cd_loop_mdisp_offset != -1) {
1306 for (i = 0; i < totface; i++) {
1312 for (i = 0; i < totface; i++) {
1314 bm, l_iter, faces[i], f_center, faces_center[i], cd_loop_mdisp_offset);
1316 }
while ((l_iter = l_iter->
next) != l_first);
1321 for (
BMEdge *edge : deledges) {
1325 for (
BMVert *vert : delverts) {
1331 for (i = 0; i < totface; i++) {
1348#ifdef USE_BMESH_HOLES
1354#ifdef USE_BMESH_HOLES
1359#ifdef USE_BMESH_HOLES
1373#ifdef USE_BMESH_HOLES
1377 const bool no_double)
1379#ifdef USE_BMESH_HOLES
1380 BMLoopList *lst, *lst2;
1386 BMLoop *l_iter, *l_first;
1387 BMLoop *l_f1 =
nullptr, *l_f2 =
nullptr;
1411#ifdef USE_BMESH_HOLES
1412 lst = f->loops.first;
1413 lst2 = f2->loops.first;
1415 lst2->first = lst2->last = l_f2;
1416 lst->first = lst->last = l_f1;
1419 l_iter = l_first = l_f1;
1425 }
while ((l_iter = l_iter->
next) != l_first);
1427 if (first_loop_f1) {
1466 }
while ((l_iter = l_iter->
next) != l_first);
1478 }
while ((l_iter = l_iter->
next) != l_first);
1486#ifdef USE_BMESH_HOLES
1493 for (lst = f->loops.last; lst != f->loops.first; lst = lst2) {
1513 int valence1, valence2;
1561 bool is_first =
true;
1664 const bool check_edge_exists,
1665 const bool kill_degenerate_faces,
1666 const bool kill_duplicate_faces)
1669 BMVert *v_old, *v_target;
1684 int valence1, valence2;
1710 if (check_edge_exists) {
1729 if (l_kill->
next->
v == v_kill) {
1730 l_kill->
next->
v = v_target;
1741 if (kill_degenerate_faces && (l_kill->
f->
len < 3)) {
1747 if (kill_duplicate_faces) {
1755 }
while ((l_kill = l_kill_next) != e_kill->
l);
1771 v_kill->
e =
nullptr;
1795 if (check_edge_exists) {
1802 if (kill_degenerate_faces) {
1809 if (kill_duplicate_faces) {
1831 const bool check_edge_exists,
1832 const bool kill_degenerate_faces)
1840 BMLoop *l_kill, *l_first, *l_kill_next;
1841 l_kill = l_first = e_kill->
l;
1844 if (l_kill->
next->
v == v_kill) {
1845 l_kill->
next->
v = v_target;
1856 if (kill_degenerate_faces) {
1857 if (l_kill->
f->
len < 3) {
1865 }
while ((l_kill = l_kill_next) != l_first);
1867 e_kill->
l =
nullptr;
1874 if (v_target->
e && v_kill->
e) {
1877 while ((
e = v_kill->
e)) {
1880 if (check_edge_exists) {
1887 if (check_edge_exists) {
1895 if (kill_degenerate_faces) {
1912 BMLoop *l_iter, *l_f1 =
nullptr, *l_f2 =
nullptr;
1913 int newlen = 0, i, f1len = 0, f2len = 0;
1934 if (l_f1->
v == l_f2->v) {
1953 bool is_dupe =
false;
1960 for (i = 0, l_iter =
BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
1963 for (i = 0, l_iter =
BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
1964 if (l_iter != l_f2) {
1973 for (i = 0, l_iter =
BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
1994 f1->
len += (f2->
len - 2);
2035 bool is_double =
false;
2039 if (v_a->
e && v_b->
e) {
2042#define VERT_VISIT _FLAG_WALK
2045 e = e_first = v_a->
e;
2053 e = e_first = v_b->
e;
2063 e = e_first = v_a->
e;
2081 if (v_src == v_dst) {
2088 while ((
e = v_src->
e)) {
2109 return (
e->l &&
e->l->radial_next !=
e->l);
2115 int v_edges_num = 0;
2132 int edges_found = 0;
2134#define EDGE_VISIT _FLAG_WALK
2138 BMEdge *e_first, *e_iter;
2139 e_iter = e_first =
v->
e;
2160 BMLoop *l_iter, *l_first;
2161 l_iter = l_first =
e->l;
2169 }
while ((l_iter = l_iter->
radial_next) != l_first);
2177 if (edges_found == v_edges_num) {
2206 if (r_vout_len !=
nullptr) {
2207 *r_vout_len = verts_num;
2210 if (r_vout !=
nullptr) {
2258 }
while ((n_step = n_step->
next));
2260 }
while ((n_orig = n_orig->
next) && n_orig->
next);
2261 }
while ((edges_separate = edges_separate->
next));
2268 const bool copy_select,
2272 LinkNode *edges_separate =
nullptr;
2275 for (i = 0; i < e_in_len; i++) {
2292 if (edges_separate) {
2300 const bool copy_select,
2304 LinkNode *edges_separate =
nullptr;
2305 BMEdge *e_iter, *e_first;
2307 e_iter = e_first =
v->
e;
2317 if (edges_separate ==
nullptr && edges_orig ==
nullptr) {
2331 if (edges_separate) {
2340 BMEdge *e_iter, *e_first;
2342 e_iter = e_first = v_src->
e;
2344 if (testfn(e_iter, arg)) {
2351 e_iter =
static_cast<BMEdge *
>(edges_hflag->
link);
2353 }
while ((edges_hflag = edges_hflag->
next));
2407 if (l_sep ==
e->l) {
2453 while (!
ELEM(e_iter, l_sep->
e, l_sep->
prev->
e)) {
2459 if (e_iter == v_sep->
e) {
2465 v_sep->
e = l_sep->
e;
2469 edges[0] = l_sep->
e;
2470 edges[1] = l_sep->
prev->
e;
2496 bool is_mixed_edge_any =
false;
2498 bool is_mixed_loop_any =
false;
2500#define LOOP_VISIT _FLAG_WALK
2501#define EDGE_VISIT _FLAG_WALK
2503 for (i = 0; i < larr_len; i++) {
2518 for (
int j = 0; j <
ARRAY_SIZE(loop_pair); j++) {
2533 BMEdge *e_first, *e_iter;
2534 e_iter = e_first = v_sep->
e;
2537 BMLoop *l_iter, *l_first;
2538 bool is_mixed_loop =
false;
2540 l_iter = l_first = e_iter->
l;
2543 is_mixed_loop =
true;
2546 }
while ((l_iter = l_iter->
radial_next) != l_first);
2548 if (is_mixed_loop) {
2553 is_mixed_loop_any =
true;
2560 is_mixed_edge_any =
true;
2567 if (is_mixed_loop_any ==
false && is_mixed_edge_any ==
false) {
2577 BMLoop *l_iter, *l_first, *l_next;
2588 if (
e->v1 == v_sep) {
2589 e_new_v_pair[0] = v_new;
2590 e_new_v_pair[1] =
e->v2;
2594 e_new_v_pair[0] =
e->v1;
2595 e_new_v_pair[1] = v_new;
2601 l_iter = l_first =
e->l;
2609 }
while ((l_iter = l_next) != l_first);
2620 for (i = 0; i < larr_len; i++) {
2644 BMLoop *l_iter, *l_first;
2649 l_iter = l_first =
e->l;
2651 if (l_iter->
v == v_src) {
2657 else if (l_iter->
next->
v == v_src) {
2658 l_iter->
next->
v = v_dst;
2666 }
while ((l_iter = l_iter->
radial_next) != l_first);
2680 BMLoop *l_iter, *l_first;
2687 }
while ((l_iter = l_iter->
next) != l_first);
2692 }
while ((l_iter = l_iter->
next) != l_first);
2694 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)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void void void BLI_movelisttolist(struct ListBase *dst, struct ListBase *src) 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)
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)
BMFace * BM_faces_join(BMesh *bm, BMFace **faces, int totface, const bool do_del)
Join Connected Faces.
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)
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)
ATTR_WARN_UNUSED_RESULT BMesh * bm
#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)
draw_view in_light_buf[] float
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
void *(* MEM_mallocN)(size_t len, const char *str)
static void error(const char *str)
struct BMLoop * radial_prev
struct BMLoop * radial_next
struct BLI_mempool * epool
struct BLI_mempool * vtoolflagpool
struct BLI_mempool * etoolflagpool
struct BLI_mempool * ftoolflagpool
struct BLI_mempool * fpool
struct BLI_mempool * vpool
struct BLI_mempool * lpool