[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45396] trunk/blender/source/blender/bmesh : fix [#30809] Limited dissolve leaves edges behind
Campbell Barton
ideasman42 at gmail.com
Wed Apr 4 17:10:22 CEST 2012
Revision: 45396
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45396
Author: campbellbarton
Date: 2012-04-04 15:10:20 +0000 (Wed, 04 Apr 2012)
Log Message:
-----------
fix [#30809] Limited dissolve leaves edges behind
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/intern/bmesh_core.c
trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_core.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-04-04 14:48:10 UTC (rev 45395)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_core.c 2012-04-04 15:10:20 UTC (rev 45396)
@@ -1035,6 +1035,13 @@
BM_vert_kill(bm, delverts[i]);
}
}
+ else {
+ /* otherwise we get both old and new faces */
+ for (i = 0; i < totface; i++) {
+ f = faces[i];
+ BM_face_kill(bm, f);
+ }
+ }
BLI_array_free(edges);
BLI_array_free(deledges);
Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2012-04-04 14:48:10 UTC (rev 45395)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2012-04-04 15:10:20 UTC (rev 45396)
@@ -505,14 +505,10 @@
const float angle = BM_edge_face_angle(e);
if (angle < angle_limit) {
- weight_elems[i].ele = (BMHeader *)e;
- weight_elems[i].weight = angle;
tot_found++;
}
- else {
- weight_elems[i].ele = NULL;
- weight_elems[i].weight = angle_max;
- }
+ weight_elems[i].ele = (BMHeader *)e;
+ weight_elems[i].weight = angle;
}
if (tot_found != 0) {
@@ -520,19 +516,38 @@
for (i = 0; i < tot_found; i++) {
BMEdge *e = (BMEdge *)weight_elems[i].ele;
- /* check twice because cumulative effect could dissolve over angle limit */
- if (BM_edge_face_angle(e) < angle_limit) {
+
+ if (/* may have become non-manifold */
+ BM_edge_is_manifold(e) &&
+ /* check twice because cumulative effect could dissolve over angle limit */
+ (BM_edge_face_angle(e) < angle_limit))
+ {
BMFace *nf = BM_faces_join_pair(bm, e->l->f,
e->l->radial_next->f,
e,
- TRUE); /* join faces */
+ FALSE); /* join faces */
/* there may be some errors, we don't mind, just move on */
- if (nf == NULL) {
+ if (nf) {
+ BM_face_normal_update(bm, nf);
+ }
+ else {
BMO_error_clear(bm);
}
}
}
+
+ /* remove all edges/verts left behind from dissolving */
+ for (i = 0; i < einput->len; i++) {
+ BMEdge *e = (BMEdge *)weight_elems[i].ele;
+ if (BM_edge_is_wire(e)) {
+ BMVert *v1 = e->v1;
+ BMVert *v2 = e->v2;
+ BM_edge_kill(bm, e);
+ if (v1->e == NULL) BM_vert_kill(bm, v1);
+ if (v2->e == NULL) BM_vert_kill(bm, v2);
+ }
+ }
}
/* --- second verts --- */
More information about the Bf-blender-cvs
mailing list