BMesh: util functions to get edge loops from verts

This commit is contained in:
Campbell Barton
2015-05-28 11:45:53 +10:00
parent 46d8bcb617
commit 3e0c6a8ca2
4 changed files with 42 additions and 18 deletions

View File

@@ -46,6 +46,37 @@
#define SELECT 1
/**
* Fill in an edge array from a vertex array (connected polygon loop).
*
* \returns false if any edges aren't found .
*/
bool BM_edges_from_verts(BMEdge **edge_arr, BMVert **vert_arr, const int len)
{
int i, i_prev = len - 1;
for (i = 0; i < len; i++) {
edge_arr[i_prev] = BM_edge_exists(vert_arr[i_prev], vert_arr[i]);
if (edge_arr[i_prev] == NULL) {
return false;
}
i_prev = i;
}
return true;
}
/**
* Fill in an edge array from a vertex array (connected polygon loop).
* Creating edges as-needed.
*/
void BM_edges_from_verts_ensure(BMesh *bm, BMEdge **edge_arr, BMVert **vert_arr, const int len)
{
int i, i_prev = len - 1;
for (i = 0; i < len; i++) {
edge_arr[i_prev] = BM_edge_create(bm, vert_arr[i_prev], vert_arr[i], NULL, BM_CREATE_NO_DOUBLE);
i_prev = i;
}
}
/* prototypes */
static void bm_loop_attrs_copy(
BMesh *source_mesh, BMesh *target_mesh,

View File

@@ -29,6 +29,9 @@
struct BMAllocTemplate;
bool BM_edges_from_verts(BMEdge **edge_arr, BMVert **vert_arr, const int len);
void BM_edges_from_verts_ensure(BMesh *bm, BMEdge **edge_arr, BMVert **vert_arr, const int len);
BMFace *BM_face_create_quad_tri(
BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4,
const BMFace *f_example, const eBMCreateFlag create_flag);

View File

@@ -485,21 +485,13 @@ BMFace *BM_face_create_verts(
const BMFace *f_example, const eBMCreateFlag create_flag, const bool create_edges)
{
BMEdge **edge_arr = BLI_array_alloca(edge_arr, len);
int i, i_prev = len - 1;
if (create_edges) {
for (i = 0; i < len; i++) {
edge_arr[i_prev] = BM_edge_create(bm, vert_arr[i_prev], vert_arr[i], NULL, BM_CREATE_NO_DOUBLE);
i_prev = i;
}
BM_edges_from_verts_ensure(bm, edge_arr, vert_arr, len);
}
else {
for (i = 0; i < len; i++) {
edge_arr[i_prev] = BM_edge_exists(vert_arr[i_prev], vert_arr[i]);
if (edge_arr[i_prev] == NULL) {
return NULL;
}
i_prev = i;
if (BM_edges_from_verts(edge_arr, vert_arr, len) == false) {
return NULL;
}
}

View File

@@ -166,8 +166,8 @@ static BMFace *bm_edgenet_face_from_path(
{
BMFace *f;
LinkNode *v_lnk;
unsigned int i;
unsigned int i_prev;
int i;
bool ok;
BMVert **vert_arr = BLI_array_alloca(vert_arr, path_len);
BMEdge **edge_arr = BLI_array_alloca(edge_arr, path_len);
@@ -176,11 +176,9 @@ static BMFace *bm_edgenet_face_from_path(
vert_arr[i] = v_lnk->link;
}
i_prev = path_len - 1;
for (i = 0; i < path_len; i++) {
edge_arr[i_prev] = BM_edge_exists(vert_arr[i], vert_arr[i_prev]);
i_prev = i;
}
ok = BM_edges_from_verts(edge_arr, vert_arr, i);
BLI_assert(ok);
UNUSED_VARS_NDEBUG(ok);
/* no need for this, we do overlap checks before allowing the path to be used */
#if 0