Add nodoubles arg to BM_Make_Face

This commit is contained in:
Andrew Wiggin
2011-10-13 04:58:34 +00:00
parent 421fd9f286
commit cccb06d92b
9 changed files with 37 additions and 38 deletions

View File

@@ -131,7 +131,7 @@ struct BMVert *BM_Make_Vert ( struct BMesh *bm, float co[3], const struct BMVert
struct BMEdge *BM_Make_Edge ( struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, const struct BMEdge *example, int nodouble );
struct BMFace *BM_Make_Quadtriangle ( struct BMesh *bm, struct BMVert **verts, BMEdge **edges, int len, const struct BMFace *example, int nodouble );
BMFace *BM_Make_Face(BMesh *bm, BMVert **verts, BMEdge **edges, int len);
BMFace *BM_Make_Face(BMesh *bm, BMVert **verts, BMEdge **edges, int len, int nodouble);
/*more easier to use version of BM_Make_Quadtriangle.
creates edges if necassary.*/

View File

@@ -207,7 +207,7 @@ BMFace *BM_Make_Quadtriangle(BMesh *bm, BMVert **verts, BMEdge **edges, int len,
if(!edar[2]) edar[2] = BM_Make_Edge(bm, verts[2], verts[0], NULL, 0);
}
f = BM_Make_Face(bm, verts, edar, len);
f = BM_Make_Face(bm, verts, edar, len, 0);
if(example && f)
BM_Copy_Attributes(bm, bm, example, f);
@@ -353,15 +353,7 @@ BMFace *BM_Make_Ngon(BMesh *bm, BMVert *v1, BMVert *v2, BMEdge **edges, int len,
goto err;
}
/*check if face already exists*/
if(nodouble)
overlap = BM_Face_Exists(bm, verts, len, &f);
/*create the face, if necassary*/
if (!f && !overlap)
f = BM_Make_Face(bm, verts, edges2, len);
else if (!overlap)
f = NULL;
f = BM_Make_Face(bm, verts, edges2, len, nodouble);
/*clean up flags*/
for (i=0; i<len; i++) {

View File

@@ -470,7 +470,7 @@ BMEdge* BM_Collapse_Vert(BMesh *bm, BMEdge *ke, BMVert *kv, float fac){
l = l->next;
} while (l != bm_firstfaceloop(f));
f2 = BM_Make_Face(bm, verts, edges, BLI_array_count(verts));
f2 = BM_Make_Face(bm, verts, edges, BLI_array_count(verts), 0);
l = bm_firstfaceloop(f2);
i = 0;
do {

View File

@@ -179,7 +179,7 @@ BMFace *BM_Copy_Face(BMesh *bm, BMFace *f, int copyedges, int copyverts)
l = l->next;
} while (l != bm_firstfaceloop(f));
f2 = BM_Make_Face(bm, verts, edges, f->len);
f2 = BM_Make_Face(bm, verts, edges, f->len, 0);
BM_Copy_Attributes(bm, bm, f, f2);
@@ -194,16 +194,27 @@ BMFace *BM_Copy_Face(BMesh *bm, BMFace *f, int copyedges, int copyverts)
return f2;
}
BMFace *BM_Make_Face(BMesh *bm, BMVert **verts, BMEdge **edges, int len) {
BMFace *f;
BMFace *BM_Make_Face(BMesh *bm, BMVert **verts, BMEdge **edges, int len, int nodouble) {
BMFace *f = NULL;
BMLoop *l, *startl, *lastl;
int i;
int i, overlap;
if (len == 0) {
/*just return NULL for now*/
return NULL;
}
if (nodouble) {
/* Check if face already exists */
overlap = BM_Face_Exists(bm, verts, len, &f);
if (overlap) {
return f;
}
else {
BLI_assert(f == NULL);
}
}
f = BLI_mempool_calloc(bm->fpool);
bm->totface += 1;
f->head.type = BM_FACE;
@@ -1752,7 +1763,7 @@ static BMVert *bmesh_urmv_loop(BMesh *bm, BMLoop *sl)
/*
* BMESH UNGLUE REGION MAKE VERT
*
* Disconnects a face from its vertex fan at loop sl.
* Disconnects sf from the vertex fan at sv
*/
BMVert *bmesh_urmv(BMesh *bm, BMFace *sf, BMVert *sv)
{

View File

@@ -128,10 +128,8 @@ static void calc_corner_co(BMesh *bm, BMLoop *l, float *co, float fac)
}
#else
/*oddly, this simplistic method seems to work the best*/
mul_v3_fl(vec1, fac);
mul_v3_fl(vec2, fac);
add_v3_v3(vec1, vec2);
mul_v3_fl(vec1, 0.5);
mul_v3_fl(vec1, fac * 0.5);
if (inv)
negate_v3(vec1);
@@ -151,7 +149,7 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
BMVert *v;
BMFace **faces = NULL, *f;
LoopTag *tags=NULL, *tag;
EdgeTag *etags = NULL, *etag;
EdgeTag *etags = NULL;
BMVert **verts = NULL;
BMEdge **edges = NULL;
BLI_array_declare(faces);
@@ -186,7 +184,7 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
BMEdge *edges[2] = {e, BM_Make_Edge(bm, e->v1, e->v2, e, 0)};
BMO_SetFlag(bm, edges[1], BEVEL_FLAG);
BM_Make_Face(bm, verts, edges, 2);
BM_Make_Face(bm, verts, edges, 2, 0);
}
#endif
}
@@ -383,7 +381,7 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
}
}
/*create new faces*/
/*create new faces inset from original faces*/
for (i=0; i<BLI_array_count(faces); i++) {
BMLoop *l;
BMIter liter;
@@ -411,8 +409,7 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
}
lastv=tag->newv;
etag = etags + BM_GetIndex(l->e);
v2 = l->next->v == l->e->v1 ? etag->newv1 : etag->newv2;
v2 = ETAG_GET(l->e, l->next->v);
tag = tags + BM_GetIndex(l->next);
if (!BMO_TestFlag(bm, l->e, BEVEL_FLAG) && v2 && v2 != tag->newv) {
@@ -431,9 +428,9 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
BM_Copy_Attributes(bm, bm, bm_firstfaceloop(faces[i])->prev->e, e);
BLI_array_append(edges, e);
f = BM_Make_Ngon(bm, verts[0], verts[1], edges, BLI_array_count(verts), 0);
f = BM_Make_Ngon(bm, verts[0], verts[1], edges, BLI_array_count(edges), 0);
if (!f) {
printf("eck!!\n");
printf("eek!!\n");
continue;
}
@@ -463,6 +460,7 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
v4 = tags[BM_GetIndex(l->radial_next->next)].newv;
}
} else {
/*the loop is on a boundary*/
v3 = l->next->v;
v4 = l->v;
@@ -628,7 +626,7 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
}
/*find edges that exist between vertices in verts. this is basically
a topological walk of the edges connecting them.*/
a topological walk of the edges connecting them.*/
vstart = vstart ? vstart : verts[0];
vv = vstart;
do {
@@ -661,8 +659,8 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
continue;
/*there may not be a complete loop of edges, so start again and make
final edge afterwards. in this case, the previous loop worked to
find one of the two edges at the extremes.*/
final edge afterwards. in this case, the previous loop worked to
find one of the two edges at the extremes.*/
if (vv != vstart) {
/*undo previous tagging*/
for (i=0; i<BLI_array_count(verts); i++) {
@@ -791,7 +789,7 @@ void bmesh_bevel_exec(BMesh *bm, BMOperator *op)
}
}
#if 0
/*clean up any remainin 2-edged faces*/
/*clean up any remaining 2-edged faces*/
BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
if (f->len == 2) {
BMFace *faces[2] = {f, bm_firstfaceloop(f)->radial_next->f};

View File

@@ -124,7 +124,7 @@ static BMFace *copy_face(BMOperator *op, BMesh *source_mesh,
}
/*create new face*/
target_face = BM_Make_Face(target_mesh, vtar, edar, source_face->len);
target_face = BM_Make_Face(target_mesh, vtar, edar, source_face->len, 0);
BMO_Insert_MapPointer(source_mesh, op,
"facemap", source_face, target_face);
BMO_Insert_MapPointer(source_mesh, op,
@@ -259,6 +259,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
if (edar) {
MEM_freeN(edar);
}
/*free vert pointer array*/
if (vtar) {
MEM_freeN(vtar);
}

View File

@@ -90,7 +90,7 @@ static BMFace *remake_face(BMesh *bm, EdgeTag *etags, BMFace *f, BMVert **verts,
edges_tmp[i] = BM_Make_Edge(bm, lastv1, lastv2, NULL, 1);
f2 = BM_Make_Face(bm, verts, edges_tmp, f->len);
f2 = BM_Make_Face(bm, verts, edges_tmp, f->len, 0);
if (!f2) {
return NULL;
}

View File

@@ -59,7 +59,7 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
float (*keyco)[3]= NULL;
int *keyi;
int set_key = BMO_Get_Int(op, "set_shapekey");
int totuv, i, j, li, allocsize[4] = {512, 512, 2048, 512};
int totuv, i, j, allocsize[4] = {512, 512, 2048, 512};
if (!me || !me->totvert) return; /*sanity check*/
@@ -191,7 +191,6 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
}
mpoly = me->mpoly;
li = 0;
for (i=0; i<me->totpoly; i++, mpoly++) {
BMVert *v1, *v2;
BMIter iter;
@@ -220,7 +219,7 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
v2 = fedges[0]->v1;
}
f = BM_Make_Face(bm, verts, fedges, mpoly->totloop);
f = BM_Make_Face(bm, verts, fedges, mpoly->totloop, 0);
if (!f) {
printf("Warning! Bad face in mesh"
@@ -241,7 +240,6 @@ void mesh_to_bmesh_exec(BMesh *bm, BMOperator *op) {
j = 0;
BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
CustomData_to_bmesh_block(&me->ldata, &bm->ldata, mpoly->loopstart+j, &l->head.data);
li++;
j++;
}

View File

@@ -2355,7 +2355,6 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
BMLoop *l;
BMEdge *e, *e2, *closest = NULL;
BMVert *v, *ripvert = NULL;
BMFace *f;
int side = 0, i, singlesel = 0;
float projectMat[4][4], fmval[3] = {event->mval[0], event->mval[1]};
float dist = FLT_MAX, d;