32 const uint pair_split_max = f->
len / 2;
38 BMLoop *l_tag_prev =
nullptr, *l_tag_first =
nullptr;
54 l_tag_prev = l_tag_first = l_iter;
63 l_pair[0] = l_tag_prev;
70 }
while ((l_iter = l_iter->
next) != l_first);
78 (((loops_split[0][0] == l_tag_first) && (loops_split[0][1] == l_tag_prev)) == 0))
81 l_pair[0] = l_tag_first;
82 l_pair[1] = l_tag_prev;
85 if (check_degenerate) {
92 for (i = 0; i <
STACK_SIZE(loops_split); i++) {
94 if (loops_split[i][0] ==
nullptr) {
99 v_pair[0] = loops_split[i][0]->
v;
100 v_pair[1] = loops_split[i][1]->
v;
106 for (i = 0; i <
STACK_SIZE(verts_pair); i++) {
112 bool edge_exists = (
BM_edge_exists(verts_pair[i][0], verts_pair[i][1]) !=
nullptr);
116 f_new =
BM_face_split(
bm, f, l_pair[0], l_pair[1], &l_new,
nullptr, edge_exists);
121 BMLoop **l_pair_deferred_remove =
nullptr;
122 for (
int j = 0; j < 2; j++) {
124 if (l_pair_deferred_remove ==
nullptr) {
126 l_pair_deferred_remove[0] =
nullptr;
127 l_pair_deferred_remove[1] =
nullptr;
129 l_pair_deferred_remove[j] = l_pair[j];
139 if (!l_new || !f_new) {
149 for (i = 0; i <
STACK_SIZE(loops_split); i++) {
150 for (
int j = 0; j < 2; j++) {
151 if (loops_split[i][j] !=
nullptr) {
#define BLI_array_alloca(arr, realsize)
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_FREE(var)
#define BLI_LINKSTACK_INIT(var)
#define BLI_LINKSTACK_POP(var)
#define STACK_CLEAR(stack)
#define STACK_DECLARE(stack)
#define STACK_SIZE(stack)
#define STACK_INIT(stack, stack_num)
#define STACK_PUSH_RET(stack)
#define BM_FACE_FIRST_LOOP(p)
void BM_face_kill(BMesh *bm, BMFace *f)
void BMO_error_raise(BMesh *bm, BMOperator *owner, eBMOpErrorLevel level, const char *msg) ATTR_NONNULL(1
#define BM_ITER_ELEM(ele, iter, data, itype)
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMFace * BM_face_split(BMesh *bm, BMFace *f, BMLoop *l_a, BMLoop *l_b, BMLoop **r_l, BMEdge *example, const bool no_double)
Face Split.
void BMO_slot_buffer_flag_enable(BMesh *bm, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
BMO_FLAG_BUFFER.
#define BMO_edge_flag_test(bm, e, oflag)
#define BMO_edge_flag_enable(bm, e, oflag)
#define BMO_vert_flag_enable(bm, e, oflag)
void BMO_slot_buffer_from_enabled_flag(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
#define BMO_face_flag_enable(bm, e, oflag)
#define BMO_ITER(ele, iter, slot_args, slot_name, restrict_flag)
#define BMO_vert_flag_test(bm, e, oflag)
#define BMO_face_flag_test(bm, e, oflag)
bool BMO_slot_bool_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
void BM_face_splits_check_optimal(BMFace *f, BMLoop *(*loops)[2], int len)
void BM_face_splits_check_legal(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len)
BMEdge * BM_edge_exists(BMVert *v_a, BMVert *v_b)
BMFace * BM_face_find_double(BMFace *f)
BMLoop * BM_face_vert_share_loop(BMFace *f, BMVert *v)
Return the Loop Shared by Face and Vertex.
BLI_INLINE bool BM_loop_is_adjacent(const BMLoop *l_a, const BMLoop *l_b) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
void bmo_connect_verts_exec(BMesh *bm, BMOperator *op)
static int bm_face_connect_verts(BMesh *bm, BMFace *f, const bool check_degenerate)
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]