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;
	}
}
Example #2
0
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);
}
Example #3
0
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);
}