code cleanup: de-duplicate bmesh face creation code,

This commit is contained in:
Campbell Barton
2012-02-28 19:30:44 +00:00
parent 2a7f1af61e
commit dcfd1dd7e2
11 changed files with 89 additions and 95 deletions

View File

@@ -185,7 +185,7 @@ BMFace *BM_face_create_ngon(BMesh *bm, BMVert *v1, BMVert *v2, BMEdge **edges, i
BLI_array_append(edges2, e);
do {
e2 = bm_disk_edge_next(e2, v);
e2 = bmesh_disk_edge_next(e2, v);
if (e2 != e && BM_ELEM_API_FLAG_TEST(e2, _FLAG_MF)) {
v = BM_edge_other_vert(e2, v);
break;

View File

@@ -52,7 +52,7 @@ static int bm_edge_splice(BMesh *bm, BMEdge *e, BMEdge *etarget);
#endif
BMVert *BM_vert_create(BMesh *bm, const float co[3], const struct BMVert *example)
BMVert *BM_vert_create(BMesh *bm, const float co[3], const BMVert *example)
{
BMVert *v = BLI_mempool_calloc(bm->vpool);
@@ -236,6 +236,40 @@ BMFace *BM_face_copy(BMesh *bm, BMFace *f, const short copyverts, const short co
return f2;
}
/**
* only create the face, since this calloc's the length is initialized to 0,
* leave adding loops to the caller.
*/
BM_INLINE BMFace *bm_face_create__internal(BMesh *bm)
{
BMFace *f;
f = BLI_mempool_calloc(bm->fpool);
#ifdef USE_DEBUG_INDEX_MEMCHECK
DEBUG_MEMCHECK_INDEX_INVALIDATE(f)
#else
BM_elem_index_set(f, -1); /* set_ok_invalid */
#endif
bm->elem_index_dirty |= BM_FACE; /* may add to middle of the pool */
bm->totface++;
f->head.htype = BM_FACE;
/* allocate flag */
f->oflags = BLI_mempool_calloc(bm->toolflagpool);
CustomData_bmesh_set_default(&bm->pdata, &f->head.data);
#ifdef USE_BMESH_HOLES
f->totbounds = 0;
#endif
return f;
}
BMFace *BM_face_create(BMesh *bm, BMVert **verts, BMEdge **edges, const int len, int nodouble)
{
BMFace *f = NULL;
@@ -257,20 +291,8 @@ BMFace *BM_face_create(BMesh *bm, BMVert **verts, BMEdge **edges, const int len,
BLI_assert(f == NULL);
}
}
f = BLI_mempool_calloc(bm->fpool);
#ifdef USE_DEBUG_INDEX_MEMCHECK
DEBUG_MEMCHECK_INDEX_INVALIDATE(f)
#else
BM_elem_index_set(f, -1); /* set_ok_invalid */
#endif
bm->elem_index_dirty |= BM_FACE; /* may add to middle of the pool */
bm->totface++;
f->head.htype = BM_FACE;
f = bm_face_create__internal(bm);
startl = lastl = bm_face_boundary_add(bm, f, verts[0], edges[0]);
@@ -287,19 +309,10 @@ BMFace *BM_face_create(BMesh *bm, BMVert **verts, BMEdge **edges, const int len,
lastl = l;
}
/* allocate flag */
f->oflags = BLI_mempool_calloc(bm->toolflagpool);
CustomData_bmesh_set_default(&bm->pdata, &f->head.data);
startl->prev = lastl;
lastl->next = startl;
f->len = len;
#ifdef USE_BMESH_HOLES
f->totbounds = 0;
#endif
BM_CHECK_ELEMENT(bm, f);
@@ -608,7 +621,7 @@ void BM_vert_kill(BMesh *bm, BMVert *v)
e = v->e;
while (v->e) {
nexte = bm_disk_edge_next(e, v);
nexte = bmesh_disk_edge_next(e, v);
BM_edge_kill(bm, e);
e = nexte;
}
@@ -804,7 +817,7 @@ static int UNUSED_FUNCTION(count_flagged_disk)(BMVert *v, int flag)
do {
i += BM_ELEM_API_FLAG_TEST(e, flag) ? 1 : 0;
e = bm_disk_edge_next(e, v);
e = bmesh_disk_edge_next(e, v);
} while (e != v->e);
return i;
@@ -834,7 +847,7 @@ static int disk_is_flagged(BMVert *v, int flag)
l = l->radial_next;
} while (l != e->l);
e = bm_disk_edge_next(e, v);
e = bmesh_disk_edge_next(e, v);
} while (e != v->e);
return TRUE;
@@ -1034,40 +1047,20 @@ error:
/* BMESH_TODO - this is only used once, investigate sharing code with BM_face_create
*/
static BMFace *bm_face_create__internal(BMesh *bm, BMFace *UNUSED(example))
static BMFace *bm_face_create__sfme(BMesh *bm, BMFace *UNUSED(example))
{
BMFace *f;
#ifdef USE_BMESH_HOLES
BMLoopList *lst;
#endif
f = BLI_mempool_calloc(bm->fpool);
f = bm_face_create__internal(bm);
#ifdef USE_BMESH_HOLES
lst = BLI_mempool_calloc(bm->looplistpool);
#endif
f->head.htype = BM_FACE;
#ifdef USE_BMESH_HOLES
BLI_addtail(&f->loops, lst);
#endif
#ifdef USE_DEBUG_INDEX_MEMCHECK
DEBUG_MEMCHECK_INDEX_INVALIDATE(f)
#else
BM_elem_index_set(f, -1); /* set_ok_invalid */
#endif
bm->elem_index_dirty |= BM_FACE; /* may add to middle of the pool */
bm->totface++;
/* allocate flag */
f->oflags = BLI_mempool_calloc(bm->toolflagpool);
CustomData_bmesh_set_default(&bm->pdata, &f->head.data);
f->len = 0;
#ifdef USE_BMESH_HOLES
f->totbounds = 1;
#endif
@@ -1144,7 +1137,7 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
/* allocate new edge between v1 and v2 */
e = BM_edge_create(bm, v1, v2, example, FALSE);
f2 = bm_face_create__internal(bm, f);
f2 = bm_face_create__sfme(bm, f);
f1loop = bm_loop_create(bm, v2, e, f, v2loop);
f2loop = bm_loop_create(bm, v1, e, f2, v1loop);
@@ -1436,7 +1429,7 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
len = bmesh_disk_count(kv);
if (len == 2) {
oe = bm_disk_edge_next(ke, kv);
oe = bmesh_disk_edge_next(ke, kv);
tv = bmesh_edge_other_vert_get(ke, kv);
ov = bmesh_edge_other_vert_get(oe, kv);
halt = bmesh_verts_in_edge(kv, tv, oe); /* check for double edge */
@@ -1953,7 +1946,7 @@ static BMVert *bm_urmv_loop(BMesh *bm, BMLoop *sl)
* will leave the original sv on some *other* fan (not the
* one-face fan that holds the unglue face). */
while (sv->e == sl->e || sv->e == sl->prev->e) {
sv->e = bm_disk_edge_next(sv->e, sv);
sv->e = bmesh_disk_edge_next(sv->e, sv);
}
/* Split all fans connected to the vert, duplicating it for

View File

@@ -53,7 +53,7 @@ const char bm_iter_itype_htype_map[BM_ITYPE_MAX] = {
/*
* note, we have BM_vert_at_index/BM_edge_at_index/BM_face_at_index for arrays
*/
void *BM_iter_at_index(struct BMesh *bm, const char itype, void *data, int index)
void *BM_iter_at_index(BMesh *bm, const char itype, void *data, int index)
{
BMIter iter;
void *val;
@@ -83,7 +83,7 @@ void *BM_iter_at_index(struct BMesh *bm, const char itype, void *data, int index
* to avoid multiple calls to BM_iter_at_index.
*/
int BM_iter_as_array(struct BMesh *bm, const char type, void *data, void **array, const int len)
int BM_iter_as_array(BMesh *bm, const char type, void *data, void **array, const int len)
{
int i = 0;
@@ -197,7 +197,7 @@ void *bmiter__edge_of_vert_step(BMIter *iter)
BMEdge *current = iter->nextedge;
if (iter->nextedge)
iter->nextedge = bm_disk_edge_next(iter->nextedge, iter->vdata);
iter->nextedge = bmesh_disk_edge_next(iter->nextedge, iter->vdata);
if (iter->nextedge == iter->firstedge) iter->nextedge = NULL;

View File

@@ -452,7 +452,7 @@ void BM_select_mode_set(BMesh *bm, int selectmode)
/**
* counts number of elements with flag set
*/
int BM_mesh_count_flag(struct BMesh *bm, const char htype, const char hflag, int respecthide)
int BM_mesh_count_flag(BMesh *bm, const char htype, const char hflag, int respecthide)
{
BMElem *ele;
BMIter iter;
@@ -484,7 +484,7 @@ int BM_mesh_count_flag(struct BMesh *bm, const char htype, const char hflag, int
* \note use BM_elem_flag_test(ele, BM_ELEM_SELECT) to test selection
* \note by design, this will not touch the editselection history stuff
*/
void _bm_elem_select_set(struct BMesh *bm, BMHeader *head, int select)
void _bm_elem_select_set(BMesh *bm, BMHeader *head, int select)
{
switch (head->htype) {
case BM_VERT:

View File

@@ -113,7 +113,7 @@ int BM_disk_dissolve(BMesh *bm, BMVert *v)
/* v->e we keep, what else */
e = v->e;
do {
e = bm_disk_edge_next(e, v);
e = bmesh_disk_edge_next(e, v);
if (!(BM_edge_share_face_count(e, v->e))) {
keepedge = e;
baseedge = v->e;
@@ -180,7 +180,7 @@ int BM_disk_dissolve(BMesh *bm, BMVert *v)
done = 0;
break;
}
e = bm_disk_edge_next(e, v);
e = bmesh_disk_edge_next(e, v);
} while (e != v->e);
}
@@ -426,7 +426,7 @@ BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
/* now interpolate the vertex data */
BM_data_interp_from_verts(bm, kv, tv, kv, fac);
e2 = bm_disk_edge_next(ke, kv);
e2 = bmesh_disk_edge_next(ke, kv);
tv2 = BM_edge_other_vert(e2, kv);
if (join_faces) {

View File

@@ -338,7 +338,7 @@ void BMO_slot_bool_set(BMOperator *op, const char *slotname, const int i)
}
/* only supports square mats */
void BMO_slot_mat_set(struct BMOperator *op, const char *slotname, const float *mat, int size)
void BMO_slot_mat_set(BMOperator *op, const char *slotname, const float *mat, int size)
{
BMOpSlot *slot = BMO_slot_get(op, slotname);
BLI_assert(slot->slottype == BMO_OP_SLOT_MAT);
@@ -361,7 +361,7 @@ void BMO_slot_mat_set(struct BMOperator *op, const char *slotname, const float *
}
}
void BMO_slot_mat4_get(struct BMOperator *op, const char *slotname, float r_mat[4][4])
void BMO_slot_mat4_get(BMOperator *op, const char *slotname, float r_mat[4][4])
{
BMOpSlot *slot = BMO_slot_get(op, slotname);
BLI_assert(slot->slottype == BMO_OP_SLOT_MAT);
@@ -371,7 +371,7 @@ void BMO_slot_mat4_get(struct BMOperator *op, const char *slotname, float r_mat[
copy_m4_m4(r_mat, (float (*)[4])slot->data.p);
}
void BMO_slot_mat3_set(struct BMOperator *op, const char *slotname, float r_mat[3][3])
void BMO_slot_mat3_set(BMOperator *op, const char *slotname, float r_mat[3][3])
{
BMOpSlot *slot = BMO_slot_get(op, slotname);
BLI_assert(slot->slottype == BMO_OP_SLOT_MAT);
@@ -510,7 +510,7 @@ void BMO_mesh_flag_disable_all(BMesh *bm, BMOperator *UNUSED(op), const char hty
}
}
int BMO_slot_buf_count(struct BMesh *UNUSED(bm), struct BMOperator *op, const char *slotname)
int BMO_slot_buf_count(BMesh *UNUSED(bm), BMOperator *op, const char *slotname)
{
BMOpSlot *slot = BMO_slot_get(op, slotname);
BLI_assert(slot->slottype > BMO_OP_SLOT_VEC);
@@ -603,7 +603,7 @@ void *BMO_Grow_Array(BMesh *bm, BMOperator *op, int slotcode, int totadd)
}
#endif
void BMO_slot_map_to_flag(struct BMesh *bm, struct BMOperator *op,
void BMO_slot_map_to_flag(BMesh *bm, BMOperator *op,
const char *slotname, const short oflag)
{
GHashIterator it;
@@ -859,7 +859,7 @@ int BMO_vert_edge_flags_count(BMesh *bm, BMVert *v, const short oflag)
for (i = 0, curedge = v->e; i < len; i++) {
if (BMO_elem_flag_test(bm, curedge, oflag))
count++;
curedge = bm_disk_edge_next(curedge, v);
curedge = bmesh_disk_edge_next(curedge, v);
}
}
@@ -1096,7 +1096,7 @@ void *BMO_iter_step(BMOIter *iter)
return h;
}
else if (iter->slot->slottype == BMO_OP_SLOT_MAPPING) {
struct BMOElemMapping *map;
BMOElemMapping *map;
void *ret = BLI_ghashIterator_getKey(&iter->giter);
map = BLI_ghashIterator_getValue(&iter->giter);

View File

@@ -262,7 +262,7 @@ int BM_vert_is_wire(BMesh *UNUSED(bm), BMVert *v)
return FALSE;
}
curedge = bm_disk_edge_next(curedge, v);
curedge = bmesh_disk_edge_next(curedge, v);
} while (curedge != v->e);
return TRUE;
@@ -297,7 +297,7 @@ int BM_vert_is_manifold(BMesh *UNUSED(bm), BMVert *v)
/* count edges while looking for non-manifold edges */
oe = v->e;
for (len = 0, e = v->e; e != oe || (e == oe && len == 0); len++, e = bm_disk_edge_next(e, v)) {
for (len = 0, e = v->e; e != oe || (e == oe && len == 0); len++, e = bmesh_disk_edge_next(e, v)) {
if (e->l == NULL) {
/* loose edge */
return FALSE;
@@ -413,7 +413,7 @@ int BM_edge_share_face_count(BMEdge *e1, BMEdge *e2)
/**
* Tests to see if e1 shares a vertex with e2
*/
int BM_edge_share_vert_count(struct BMEdge *e1, struct BMEdge *e2)
int BM_edge_share_vert_count(BMEdge *e1, BMEdge *e2)
{
return (e1->v1 == e2->v1 ||
e1->v1 == e2->v2 ||
@@ -424,7 +424,7 @@ int BM_edge_share_vert_count(struct BMEdge *e1, struct BMEdge *e2)
/**
* Return the shared vertex between the two edges or NULL
*/
BMVert *BM_edge_share_vert(struct BMEdge *e1, struct BMEdge *e2)
BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2)
{
if (BM_vert_in_edge(e2, e1->v1)) {
return e1->v1;
@@ -507,9 +507,9 @@ float BM_vert_edge_angle(BMesh *UNUSED(bm), BMVert *v)
* get the edges and count them both at once */
if ((e1 = v->e) &&
(e2 = bm_disk_edge_next(e1, v)) &&
(e2 = bmesh_disk_edge_next(e1, v)) &&
/* make sure we come full circle and only have 2 connected edges */
(e1 == bm_disk_edge_next(e2, v)))
(e1 == bmesh_disk_edge_next(e2, v)))
{
BMVert *v1 = BM_edge_other_vert(e1, v);
BMVert *v2 = BM_edge_other_vert(e2, v);

View File

@@ -150,7 +150,7 @@ int bmesh_edge_swapverts(BMEdge *e, BMVert *orig, BMVert *newv)
* cycle order and all non-manifold conditions are represented trivially.
*
*/
int bmesh_disk_edge_append(struct BMEdge *e, struct BMVert *v)
int bmesh_disk_edge_append(BMEdge *e, BMVert *v)
{
if (!v->e) {
BMDiskLink *dl1 = BM_DISK_EDGE_LINK_GET(e, v);
@@ -176,7 +176,7 @@ int bmesh_disk_edge_append(struct BMEdge *e, struct BMVert *v)
return TRUE;
}
void bmesh_disk_edge_remove(struct BMEdge *e, struct BMVert *v)
void bmesh_disk_edge_remove(BMEdge *e, BMVert *v)
{
BMDiskLink *dl1, *dl2;
@@ -206,7 +206,7 @@ void bmesh_disk_edge_remove(struct BMEdge *e, struct BMVert *v)
* Pointer to the next edge in the disk cycle for the vertex v.
*/
struct BMEdge *bm_disk_edge_next(struct BMEdge *e, struct BMVert *v)
BMEdge *bmesh_disk_edge_next(BMEdge *e, BMVert *v)
{
if (v == e->v1)
return e->v1_disk_link.next;
@@ -215,7 +215,7 @@ struct BMEdge *bm_disk_edge_next(struct BMEdge *e, struct BMVert *v)
return NULL;
}
static BMEdge *bm_disk_edge_prev(BMEdge *e, BMVert *v)
BMEdge *bmesh_disk_edge_prev(BMEdge *e, BMVert *v)
{
if (v == e->v1)
return e->v1_disk_link.prev;
@@ -235,13 +235,13 @@ BMEdge *bmesh_disk_edge_exists(BMVert *v1, BMVert *v2)
if (bmesh_verts_in_edge(v1, v2, e_iter)) {
return e_iter;
}
} while ((e_iter = bm_disk_edge_next(e_iter, v1)) != e_first);
} while ((e_iter = bmesh_disk_edge_next(e_iter, v1)) != e_first);
}
return NULL;
}
int bmesh_disk_count(struct BMVert *v)
int bmesh_disk_count(BMVert *v)
{
if (v->e) {
BMEdge *e_first, *e_iter;
@@ -259,7 +259,7 @@ int bmesh_disk_count(struct BMVert *v)
return 0;
}
count++;
} while ((e_iter = bm_disk_edge_next(e_iter, v)) != e_first);
} while ((e_iter = bmesh_disk_edge_next(e_iter, v)) != e_first);
return count;
}
else {
@@ -278,10 +278,10 @@ int bmesh_disk_validate(int len, BMEdge *e, BMVert *v)
e_iter = e;
do {
if (len != 1 && bm_disk_edge_prev(e_iter, v) == e_iter) {
if (len != 1 && bmesh_disk_edge_prev(e_iter, v) == e_iter) {
return FALSE;
}
} while ((e_iter = bm_disk_edge_next(e_iter, v)) != e);
} while ((e_iter = bmesh_disk_edge_next(e_iter, v)) != e);
return TRUE;
}
@@ -308,7 +308,7 @@ int bmesh_disk_facevert_count(BMVert *v)
if (e_iter->l) {
count += bmesh_radial_facevert_count(e_iter->l, v);
}
} while ((e_iter = bm_disk_edge_next(e_iter, v)) != e_first);
} while ((e_iter = bmesh_disk_edge_next(e_iter, v)) != e_first);
return count;
}
else {
@@ -325,7 +325,7 @@ int bmesh_disk_facevert_count(BMVert *v)
* to it.
*/
struct BMEdge *bmesh_disk_faceedge_find_first(struct BMEdge *e, struct BMVert *v)
BMEdge *bmesh_disk_faceedge_find_first(BMEdge *e, BMVert *v)
{
BMEdge *searchedge = NULL;
searchedge = e;
@@ -333,20 +333,20 @@ struct BMEdge *bmesh_disk_faceedge_find_first(struct BMEdge *e, struct BMVert *v
if (searchedge->l && bmesh_radial_facevert_count(searchedge->l, v)) {
return searchedge;
}
} while ((searchedge = bm_disk_edge_next(searchedge, v)) != e);
} while ((searchedge = bmesh_disk_edge_next(searchedge, v)) != e);
return NULL;
}
struct BMEdge *bmesh_disk_faceedge_find_next(struct BMEdge *e, struct BMVert *v)
BMEdge *bmesh_disk_faceedge_find_next(BMEdge *e, BMVert *v)
{
BMEdge *searchedge = NULL;
searchedge = bm_disk_edge_next(e, v);
searchedge = bmesh_disk_edge_next(e, v);
do {
if (searchedge->l && bmesh_radial_facevert_count(searchedge->l, v)) {
return searchedge;
}
} while ((searchedge = bm_disk_edge_next(searchedge, v)) != e);
} while ((searchedge = bmesh_disk_edge_next(searchedge, v)) != e);
return e;
}

View File

@@ -47,7 +47,8 @@ int bmesh_loop_validate(BMFace *f);
/* DISK CYCLE MANAGMENT */
int bmesh_disk_edge_append(BMEdge *e, BMVert *v);
void bmesh_disk_edge_remove(BMEdge *e, BMVert *v);
BMEdge *bm_disk_edge_next(BMEdge *e, BMVert *v);
BMEdge *bmesh_disk_edge_next(BMEdge *e, BMVert *v);
BMEdge *bmesh_disk_edge_prev(BMEdge *e, BMVert *v);
int bmesh_disk_facevert_count(BMVert *v);
BMEdge *bmesh_disk_faceedge_find_first(BMEdge *e, BMVert *v);
BMEdge *bmesh_disk_faceedge_find_next(BMEdge *e, BMVert *v);

View File

@@ -152,7 +152,7 @@ static int BME_Bevel_Dissolve_Disk(BMesh *bm, BMVert *v)
}
e = v->e;
elast = bm_disk_edge_next(e, v);
elast = bmesh_disk_edge_next(e, v);
/* BMESH_TODO, figure out if its possible we had a double edge here and need to splice it,
* last bool arg */
@@ -274,7 +274,7 @@ static BMVert *BME_bevel_split_edge(BMesh *bm, BMVert *v, BMVert *v1, BMLoop *l,
return NULL;
}
e1 = v->e; /* we just use the first two edges */
e2 = bm_disk_edge_next(v->e, v);
e2 = bmesh_disk_edge_next(v->e, v);
if (e1 == e2) {
//printf("You need at least two edges to use BME_bevel_split_edge()\n");
return NULL;
@@ -964,7 +964,7 @@ static BMesh *BME_bevel_mesh(BMesh *bm, float value, int UNUSED(res), int option
BM_face_split(bm, l->f, l->next->v, l->prev->v, &l, l->e); /* clip this corner off */
if(l2->f->len > 3)
BM_face_split(bm, l2->f, l2->next->v, l2->prev->v, &l, l2->e); /* clip this corner off */
curedge = bm_disk_edge_next(curedge, v);
curedge = bmesh_disk_edge_next(curedge, v);
} while(curedge != v->e);
BME_Bevel_Dissolve_Disk(bm, v);
}

View File

@@ -1645,7 +1645,7 @@ void EDBM_convertsel(BMEditMesh *em, short oldmode, short selectmode)
}
void EDBM_deselect_by_material(struct BMEditMesh *em, const short index, const short select)
void EDBM_deselect_by_material(BMEditMesh *em, const short index, const short select)
{
BMIter iter;
BMFace *efa;
@@ -1692,7 +1692,7 @@ void EDBM_select_swap(BMEditMesh *em) /* exported for UV */
// if (EM_texFaceCheck())
}
int EDBM_select_interior_faces(struct BMEditMesh *em)
int EDBM_select_interior_faces(BMEditMesh *em)
{
BMesh *bm = em->bm;
BMIter iter;