extrude region op now does wire vert extrudes too

This commit is contained in:
Joseph Eagar
2009-03-16 11:38:42 +00:00
parent ba4d6babbb
commit aa4915fdcf
7 changed files with 48 additions and 18 deletions

View File

@@ -259,6 +259,12 @@ void *BMO_Get_MapPointer(BMesh *bm, BMOperator *op, int slotcode,
for (; key; key=BMO_IterStep(&oiter)) {
val = BMO_IterMapVal(&oiter);
//do something with the key/val pair
//note that val is a pointer to the val data,
//whether it's a float, pointer, whatever.
//
// so to get a pointer, for example, use:
// *((void**)BMO_IterMapVal(&oiter));
//or something like that.
}
*/

View File

@@ -16,6 +16,7 @@ enum {
//bounding edges of split faces
BMOP_SPLIT_BOUNDS_EDGEMAP, /*boundarymap*/
BMOP_SPLIT_ISOLATED_VERTS_MAP, /*isovertmap*/
BMOP_SPLIT_TOTSLOT,
};
@@ -31,6 +32,7 @@ enum {
/*we need a map for verts duplicated not connected
to any faces, too.*/
BMOP_DUPE_BOUNDS_EDGEMAP, /*boundarymap*/
BMOP_DUPE_ISOLATED_VERTS_MAP, /*isovertmap*/
BMOP_DUPE_TOTSLOT
};

View File

@@ -103,7 +103,8 @@ BMOpDefine def_dupeop = {
{{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
{BMOP_OPSLOT_ELEMENT_BUF, "origout"},
{BMOP_OPSLOT_ELEMENT_BUF, "newout"},
{BMOP_OPSLOT_MAPPING, "boundarymap"}},
{BMOP_OPSLOT_MAPPING, "boundarymap"},
{BMOP_OPSLOT_MAPPING, "isovertmap"}},
dupeop_exec,
BMOP_DUPE_TOTSLOT,
0
@@ -113,7 +114,8 @@ BMOpDefine def_splitop = {
"split",
{{BMOP_OPSLOT_ELEMENT_BUF, "geom"},
{BMOP_OPSLOT_ELEMENT_BUF, "geomout"},
{BMOP_OPSLOT_MAPPING, "boundarymap"}},
{BMOP_OPSLOT_MAPPING, "boundarymap"},
{BMOP_OPSLOT_MAPPING, "isovertmap"}},
splitop_exec,
BMOP_SPLIT_TOTSLOT,
0

View File

@@ -637,7 +637,6 @@ void BM_Triangulate_Face(BMesh *bm, BMFace *f, float (*projectverts)[3],
}
}
#if 1
/*each pair of loops defines a new edge, a split. this function goes
through and sets pairs that are geometrically invalid to null. a
split is invalid, if it forms a concave angle or it intersects other
@@ -718,9 +717,6 @@ void BM_LegalSplits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len)
shrink_edgef(v1, v2, 1.00001f);
if (linecrossesf(p1, p2, mid, out)) clen++;
//else if (linecrossesf(p2, p1, out, mid)) clen++;
//else if (linecrossesf(p1, p2, out, mid)) clen++;
}
if (clen%2 == 0) {
@@ -764,4 +760,3 @@ void BM_LegalSplits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len)
if (projverts != projectverts) MEM_freeN(projverts);
if (edgeverts != edgevertsstack) MEM_freeN(edgeverts);
}
#endif

View File

@@ -147,7 +147,7 @@ static BMFace *copy_face(BMesh *source_mesh, BMFace *source_face, BMesh *target_
static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
{
BMVert *v = NULL;
BMVert *v = NULL, *v2;
BMEdge *e = NULL, **edar = NULL;
BMLoop *l = NULL;
BMFace *f = NULL;
@@ -215,7 +215,9 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
/*finally dupe all loose vertices*/
for(v = BMIter_New(&verts, source, BM_VERTS, source); v; v = BMIter_Step(&verts)){
if(BMO_TestFlag(source, (BMHeader*)v, DUPE_INPUT) && (!BMO_TestFlag(source, (BMHeader*)v, DUPE_DONE))){
copy_vertex(source, v, target, vhash);
v2 = copy_vertex(source, v, target, vhash);
BMO_Insert_MapPointer(source, op,
BMOP_DUPE_ISOLATED_VERTS_MAP, v, v2);
BMO_SetFlag(source, (BMHeader*)v, DUPE_DONE);
}
}
@@ -390,7 +392,9 @@ void splitop_exec(BMesh *bm, BMOperator *op)
BMO_CopySlot(&dupeop, splitop, BMOP_DUPE_NEW, BMOP_SPLIT_MULTOUT);
BMO_CopySlot(&dupeop, splitop, BMOP_DUPE_BOUNDS_EDGEMAP,
BMOP_SPLIT_BOUNDS_EDGEMAP);
BMO_CopySlot(&dupeop, splitop, BMOP_DUPE_ISOLATED_VERTS_MAP,
BMOP_SPLIT_ISOLATED_VERTS_MAP);
/*cleanup*/
BMO_Finish_Op(bm, &delop);
BMO_Finish_Op(bm, &dupeop);

View File

@@ -19,9 +19,9 @@ void extrude_edge_context_exec(BMesh *bm, BMOperator *op)
BMOperator dupeop, delop;
BMOIter siter;
BMIter iter, fiter, viter;
BMEdge *e, *newedge, *e2;
BMEdge *e, *newedge, *e2, *ce;
BMLoop *l, *l2;
BMVert *verts[4], *v;
BMVert *verts[4], *v, *v2;
BMFace *f;
int rlen, found, delorig=0, i, reverse;
@@ -100,8 +100,10 @@ void extrude_edge_context_exec(BMesh *bm, BMOperator *op)
newedge = BMO_IterMapVal(&siter);
newedge = *(BMEdge**)newedge;
if (!newedge) continue;
if (!newedge->loop) ce = e;
else ce = newedge;
if (newedge->loop->v == newedge->v1) {
if (ce->loop && (ce->loop->v == ce->v1)) {
verts[0] = e->v1;
verts[1] = e->v2;
verts[2] = newedge->v2;
@@ -150,7 +152,13 @@ void extrude_edge_context_exec(BMesh *bm, BMOperator *op)
}
}
/*link isolated verts*/
v = BMO_IterNew(&siter, bm, &dupeop, BMOP_DUPE_ISOLATED_VERTS_MAP);
for (; v; v=BMO_IterStep(&siter)) {
v2 = *((void**)BMO_IterMapVal(&siter));
BM_Make_Edge(bm, v, v2, v->edge, 1);
}
/*cleanup*/
if (delorig) BMO_Finish_Op(bm, &delop);
BMO_Finish_Op(bm, &dupeop);

View File

@@ -1165,7 +1165,7 @@ short BM_extrude_edgeflag(Object *obedit, BMesh *bm, int eflag, float *nor)
BMO_Init_Op(&extop, BMOP_EXTRUDE_EDGECONTEXT);
BMO_HeaderFlag_To_Slot(bm, &extop, BMOP_EXFACE_EDGEFACEIN,
flag, BM_EDGE|BM_FACE);
flag, BM_VERT|BM_EDGE|BM_FACE);
for (edge=BMIter_New(&iter, bm, BM_EDGES, NULL); edge; edge=BMIter_Step(&iter)) {
BM_Select_Edge(bm, edge, 0);
@@ -1802,9 +1802,22 @@ short extrudeflag_vert(Object *obedit, EditMesh *em, short flag, float *nor)
/* generic extrude */
short extrudeflag(Object *obedit, EditMesh *em, short flag, float *nor)
{
if(em->selectmode & SCE_SELECT_VERTEX)
return extrudeflag_vert(obedit, em, flag, nor);
else
if(em->selectmode & SCE_SELECT_VERTEX) {
EditEdge *eed;
/*ensure vert flags are consistent for edge selections*/
for (eed=em->edges.first; eed; eed=eed->next) {
if (eed->f & flag) {
eed->v1->f |= flag;
eed->v2->f |= flag;
} else {
if ((eed->v1->f & flag) && (eed->v2->f & flag))
eed->f |= flag;
}
}
return extrudeflag_edge(obedit, em, flag, nor);
} else
return extrudeflag_edge(obedit, em, flag, nor);
}