[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44006] branches/bmesh/blender/source/ blender: add option to dissolve resulting verts with 2 edges after dissolving faces /edges.
Campbell Barton
ideasman42 at gmail.com
Fri Feb 10 02:40:42 CET 2012
Revision: 44006
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44006
Author: campbellbarton
Date: 2012-02-10 01:40:37 +0000 (Fri, 10 Feb 2012)
Log Message:
-----------
add option to dissolve resulting verts with 2 edges after dissolving faces/edges.
in some cases you want these, but many times they end up neededing dissolving too.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c
branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2012-02-09 14:28:59 UTC (rev 44005)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2012-02-10 01:40:37 UTC (rev 44006)
@@ -636,6 +636,7 @@
"dissolveedges",
{{BMOP_OPSLOT_ELEMENT_BUF, "edges"},
{BMOP_OPSLOT_ELEMENT_BUF, "regionout"},
+ {BMOP_OPSLOT_INT, "use_verts"}, // dissolve verts left between only 2 edges.
{0} /* null-terminating sentine */},
dissolveedges_exec,
BMOP_UNTAN_MULTIRES
@@ -654,6 +655,7 @@
"dissolvefaces",
{{BMOP_OPSLOT_ELEMENT_BUF, "faces"},
{BMOP_OPSLOT_ELEMENT_BUF, "regionout"},
+ {BMOP_OPSLOT_INT, "use_verts"}, // dissolve verts left between only 2 edges.
{0} /* null-terminating sentine */},
dissolvefaces_exec,
BMOP_UNTAN_MULTIRES
Modified: branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c 2012-02-09 14:28:59 UTC (rev 44005)
+++ branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c 2012-02-10 01:40:37 UTC (rev 44006)
@@ -83,6 +83,24 @@
BMWalker regwalker;
int i;
+ int use_verts = BMO_Get_Int(op, "use_verts");
+
+ if (use_verts) {
+ /* tag verts that start out with only 2 edges,
+ * don't remove these later */
+ BMIter viter;
+ BMVert *v;
+
+ BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ if (BM_Vert_EdgeCount(v) == 2) {
+ BMO_ClearFlag(bm, v, VERT_MARK);
+ }
+ else {
+ BMO_SetFlag(bm, v, VERT_MARK);
+ }
+ }
+ }
+
BMO_Flag_Buffer(bm, op, "faces", FACE_MARK, BM_FACE);
/* collect region */
@@ -147,6 +165,21 @@
}
BMO_CallOpf(bm, "del geom=%ff context=%d", FACE_ORIG, DEL_FACES);
+
+
+ if (use_verts) {
+ BMIter viter;
+ BMVert *v;
+
+ BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ if (BMO_TestFlag(bm, v, VERT_MARK)) {
+ if (BM_Vert_EdgeCount(v) == 2) {
+ BM_Collapse_Vert_Edges(bm, v->e, v);
+ }
+ }
+ }
+ }
+
if (BMO_HasError(bm)) goto cleanup;
BMO_Flag_To_Slot(bm, op, "regionout", FACE_NEW, BM_FACE);
@@ -210,33 +243,31 @@
void dissolveedges_exec(BMesh *bm, BMOperator *op)
{
/* might want to make this an option or mode - campbell */
-#define DISSOLVE_EDGE_VERTS
/* BMOperator fop; */
BMOIter eiter;
BMEdge *e;
-#ifdef DISSOLVE_EDGE_VERTS
BMIter viter;
BMVert *v;
-#endif
+ int use_verts = BMO_Get_Int(op, "use_verts");
-#ifdef DISSOLVE_EDGE_VERTS
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
- BMO_ClearFlag(bm, v, VERT_MARK);
+ if (use_verts) {
+ BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BMO_ClearFlag(bm, v, VERT_MARK);
+ }
}
-#endif /* DISSOLVE_EDGE_VERTS */
BMO_ITER(e, &eiter, bm, op, "edges", BM_EDGE) {
const int edge_face_count = BM_Edge_FaceCount(e);
if (edge_face_count == 2) {
-#ifdef DISSOLVE_EDGE_VERTS
- /* later check if these verts are between 2 edges and can dissolve */
- BMO_SetFlag(bm, e->v1, VERT_MARK);
- BMO_SetFlag(bm, e->v2, VERT_MARK);
-#endif /* DISSOLVE_EDGE_VERTS */
+ if (use_verts) {
+ /* later check if these verts are between 2 edges and can dissolve */
+ BMO_SetFlag(bm, e->v1, VERT_MARK);
+ BMO_SetFlag(bm, e->v2, VERT_MARK);
+ }
/* join faces */
BM_Join_TwoFaces(bm, e->l->f,
@@ -254,16 +285,15 @@
}
}
-#ifdef DISSOLVE_EDGE_VERTS
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
- if (BMO_TestFlag(bm, v, VERT_MARK)) {
- if (BM_Vert_EdgeCount(v) == 2) {
- BM_Collapse_Vert_Edges(bm, v->e, v);
+ if (use_verts) {
+ BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ if (BMO_TestFlag(bm, v, VERT_MARK)) {
+ if (BM_Vert_EdgeCount(v) == 2) {
+ BM_Collapse_Vert_Edges(bm, v->e, v);
+ }
}
}
}
-#endif /* DISSOLVE_EDGE_VERTS */
-
}
static int test_extra_verts(BMesh *bm, BMVert *v)
Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2012-02-09 14:28:59 UTC (rev 44005)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c 2012-02-10 01:40:37 UTC (rev 44006)
@@ -915,13 +915,14 @@
return OPERATOR_CANCELLED;
}
else if (event==7) {
+ int use_verts = RNA_boolean_get(op->ptr, "use_verts");
//"Dissolve"
if (bem->selectmode & SCE_SELECT_FACE) {
- if (!EDBM_CallOpf(bem, op, "dissolvefaces faces=%hf",BM_SELECT))
+ if (!EDBM_CallOpf(bem, op, "dissolvefaces faces=%hf use_verts=%i", BM_SELECT, use_verts))
return OPERATOR_CANCELLED;
}
else if (bem->selectmode & SCE_SELECT_EDGE) {
- if (!EDBM_CallOpf(bem, op, "dissolveedges edges=%he",BM_SELECT))
+ if (!EDBM_CallOpf(bem, op, "dissolveedges edges=%he use_verts=%i", BM_SELECT, use_verts))
return OPERATOR_CANCELLED;
}
else if (bem->selectmode & SCE_SELECT_VERTEX) {
@@ -1008,9 +1009,13 @@
/* flags */
ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
-
+
/*props */
ot->prop = RNA_def_enum(ot->srna, "type", prop_mesh_delete_types, 10, "Type", "Method used for deleting mesh data");
+
+ /* TODO, move dissolve into its own operator so this doesnt confuse non-dissolve options */
+ RNA_def_boolean(ot->srna, "use_verts", 0, "Dissolve Verts",
+ "When dissolving faaces/edges, also dissolve remaining vertices");
}
More information about the Bf-blender-cvs
mailing list