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 --- */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to