static PyObject *bpy_bm_utils_face_split_edgenet(PyObject *UNUSED(self), PyObject *args, PyObject *kw) { static const char *kwlist[] = {"face", "edgenet", NULL}; BPy_BMFace *py_face; PyObject *edge_seq; BMEdge **edge_array; Py_ssize_t edge_array_len; BMesh *bm; BMFace **face_arr; int face_arr_len; bool ok; if (!PyArg_ParseTupleAndKeywords(args, kw, "O!O:face_split_edgenet", (char **)kwlist, &BPy_BMFace_Type, &py_face, &edge_seq)) { return NULL; } BPY_BM_CHECK_OBJ(py_face); bm = py_face->bm; edge_array = BPy_BMElem_PySeq_As_Array(&bm, edge_seq, 1, PY_SSIZE_T_MAX, &edge_array_len, BM_EDGE, true, true, "face_split_edgenet(...)"); if (edge_array == NULL) { return NULL; } /* --- main function body --- */ ok = BM_face_split_edgenet(bm, py_face->f, edge_array, edge_array_len, &face_arr, &face_arr_len); PyMem_FREE(edge_array); if (ok) { PyObject *ret = BPy_BMFace_Array_As_Tuple(bm, face_arr, face_arr_len); if (face_arr) { MEM_freeN(face_arr); } return ret; } else { PyErr_SetString(PyExc_ValueError, "face_split_edgenet(...): couldn't split the face, internal error"); return NULL; } }
static void face_edges_split( BMesh *bm, BMFace *f, struct LinkBase *e_ls_base, bool use_island_connect, MemArena *mem_arena_edgenet) { unsigned int i; unsigned int edge_arr_len = e_ls_base->list_len; BMEdge **edge_arr = BLI_array_alloca(edge_arr, edge_arr_len); LinkNode *node; BLI_assert(f->head.htype == BM_FACE); for (i = 0, node = e_ls_base->list; i < e_ls_base->list_len; i++, node = node->next) { edge_arr[i] = node->link; } BLI_assert(node == NULL); #ifdef USE_DUMP printf("# %s: %d %u\n", __func__, BM_elem_index_get(f), e_ls_base->list_len); #endif #ifdef USE_NET_ISLAND_CONNECT if (use_island_connect) { unsigned int edge_arr_holes_len; BMEdge **edge_arr_holes; if (BM_face_split_edgenet_connect_islands( bm, f, edge_arr, edge_arr_len, false, mem_arena_edgenet, &edge_arr_holes, &edge_arr_holes_len)) { edge_arr_len = edge_arr_holes_len; edge_arr = edge_arr_holes; /* owned by the arena */ } } #else UNUSED_VARS(use_island_connect, mem_arena_edgenet); #endif BM_face_split_edgenet(bm, f, edge_arr, (int)edge_arr_len, NULL, NULL); }
static void face_edges_split( BMesh *bm, BMFace *f, struct LinkBase *e_ls_base) { unsigned int i; BMEdge **edge_arr = BLI_array_alloca(edge_arr, e_ls_base->list_len); LinkNode *node; BLI_assert(f->head.htype == BM_FACE); for (i = 0, node = e_ls_base->list; i < e_ls_base->list_len; i++, node = node->next) { edge_arr[i] = node->link; } BLI_assert(node == NULL); #ifdef USE_DUMP printf("# %s: %d %u\n", __func__, BM_elem_index_get(f), e_ls_base->list_len); #endif BM_face_split_edgenet(bm, f, edge_arr, (int)e_ls_base->list_len, NULL, NULL); }