Revision: 44449
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44449
Author:   campbellbarton
Date:     2012-02-26 05:48:12 +0000 (Sun, 26 Feb 2012)
Log Message:
-----------
bmesh - remove faces with <3 sides after dissolve/collapse (most tools already 
did this).

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/bmesh.h
    trunk/blender/source/blender/bmesh/bmesh_class.h
    trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
    trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
    trunk/blender/source/blender/bmesh/tools/BME_bevel.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c

Modified: trunk/blender/source/blender/bmesh/bmesh.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh.h  2012-02-26 05:04:30 UTC (rev 
44448)
+++ trunk/blender/source/blender/bmesh/bmesh.h  2012-02-26 05:48:12 UTC (rev 
44449)
@@ -219,8 +219,10 @@
                       struct BMLoop **nl, BMEdge *example);
 
 /* these 2 functions are very similar */
-BMEdge* BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac, 
const int join_faces);
-BMEdge* BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv);
+BMEdge* BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
+                               const short join_faces, const short 
kill_degenerate_faces);
+BMEdge* BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv,
+                              const short kill_degenerate_faces);
 
 
 /* splits an edge.  ne is set to the new edge created. */

Modified: trunk/blender/source/blender/bmesh/bmesh_class.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_class.h    2012-02-26 05:04:30 UTC 
(rev 44448)
+++ trunk/blender/source/blender/bmesh/bmesh_class.h    2012-02-26 05:48:12 UTC 
(rev 44449)
@@ -51,7 +51,7 @@
 typedef struct BMHeader {
        void *data; /* customdata layers */
        int index; /* notes:
-                   * - Use BM_elem_index_get/SetIndex macros for index
+                   * - Use BM_elem_index_get/set macros for index
                    * - Unitialized to -1 so we can easily tell its not set.
                    * - Used for edge/vert/face, check BMesh.elem_index_dirty 
for valid index values,
                    *   this is abused by various tools which set it dirty.

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mods.c      2012-02-26 
05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mods.c      2012-02-26 
05:48:12 UTC (rev 44449)
@@ -72,7 +72,7 @@
                }
                else if (!v->e->l) {
                        if (len == 2) {
-                               return (BM_vert_collapse_edge(bm, v->e, v) != 
NULL);
+                               return (BM_vert_collapse_edge(bm, v->e, v, 
TRUE) != NULL);
                        }
                        else {
                                /* used to kill the vertex here, but it may be 
connected to faces.
@@ -86,7 +86,7 @@
        }
        else if (len == 2 && BM_vert_face_count(v) == 1) {
                /* boundry vertex on a face */
-               return (BM_vert_collapse_edge(bm, v->e, v) != NULL);
+               return (BM_vert_collapse_edge(bm, v->e, v, TRUE) != NULL);
        }
        else {
                return BM_disk_dissolve(bm, v);
@@ -134,7 +134,7 @@
        }
        else if (keepedge == NULL && len == 2) {
                /* collapse the verte */
-               e = BM_vert_collapse_faces(bm, v->e, v, 1.0, TRUE);
+               e = BM_vert_collapse_faces(bm, v->e, v, 1.0, TRUE, TRUE);
 
                if (!e) {
                        return FALSE;
@@ -179,7 +179,7 @@
                }
 
                /* collapse the verte */
-               e = BM_vert_collapse_faces(bm, baseedge, v, 1.0, TRUE);
+               e = BM_vert_collapse_faces(bm, baseedge, v, 1.0, TRUE, TRUE);
 
                if (!e) {
                        return FALSE;
@@ -410,7 +410,8 @@
  *  @returns The New Edge
  */
 
-BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac, 
const int join_faces)
+BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
+                               const short join_faces, const short 
kill_degenerate_faces)
 {
        BMEdge *ne = NULL;
        BMVert *tv = bmesh_edge_getothervert(ke, kv);
@@ -471,16 +472,29 @@
                }
 
                BLI_array_free(faces);
+       }
+       else {
+               /* single face or no faces */
+               /* same as BM_vert_collapse_edge() however we already
+                * have vars to perform this operation so dont call. */
+               ne = bmesh_jekv(bm, ke, kv, TRUE);
+               /* ne = BM_edge_exists(tv, tv2); */ /* same as return above */
 
-               return ne;
+               if (kill_degenerate_faces) {
+                       BMIter fiter;
+                       BMFace *f;
+                       BMVert *verts[2] = {ne->v1, ne->v2};
+                       int i;
+                       for (i = 0; i < 2; i++) {
+                               BM_ITER(f, &fiter, bm, BM_FACES_OF_VERT, 
verts[i]) {
+                                       if (f->len < 3) {
+                                               BM_face_kill(bm, f);
+                                       }
+                               }
+                       }
+               }
        }
 
-       /* single face or no faces */
-       /* same as BM_vert_collapse_edge() however we already
-        * have vars to perform this operation so dont call. */
-       ne = bmesh_jekv(bm, ke, kv, TRUE);
-       /* ne = BM_edge_exists(tv, tv2); */ /* same as return above */
-
        return ne;
 }
 
@@ -494,7 +508,8 @@
  * The New Edge
  */
 
-BMEdge *BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv)
+BMEdge *BM_vert_collapse_edge(BMesh *bm, BMEdge *ke, BMVert *kv,
+                              const short kill_degenerate_faces)
 {
        /* nice example implementation but we want loops to have their 
customdata
         * accounted for */
@@ -523,7 +538,7 @@
 #else
        /* with these args faces are never joined, same as above
         * but account for loop customdata */
-       return BM_vert_collapse_faces(bm, ke, kv, 1.0f, FALSE);
+       return BM_vert_collapse_faces(bm, ke, kv, 1.0f, FALSE, 
kill_degenerate_faces);
 #endif
 }
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2012-02-26 
05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/operators/bmo_dissolve.c 2012-02-26 
05:48:12 UTC (rev 44449)
@@ -165,7 +165,7 @@
                BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
                        if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
                                if (BM_vert_edge_count(v) == 2) {
-                                       BM_vert_collapse_edge(bm, v->e, v);
+                                       BM_vert_collapse_edge(bm, v->e, v, 
TRUE);
                                }
                        }
                }
@@ -216,7 +216,7 @@
        /* clean up extreneous 2-valence vertice */
        for (i = 0; i < BLI_array_count(verts); i++) {
                if (verts[i]->e) {
-                       BM_vert_collapse_edge(bm, verts[i]->e, verts[i]);
+                       BM_vert_collapse_edge(bm, verts[i]->e, verts[i], TRUE);
                }
        }
        
@@ -265,7 +265,7 @@
                BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
                        if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
                                if (BM_vert_edge_count(v) == 2) {
-                                       BM_vert_collapse_edge(bm, v->e, v);
+                                       BM_vert_collapse_edge(bm, v->e, v, 
TRUE);
                                }
                        }
                }
@@ -334,7 +334,14 @@
                        if (BM_vert_edge_count(v) == 2) {
 
                                /* collapse the ver */
-                               BM_vert_collapse_faces(bm, v->e, v, 1.0f, 
FALSE);
+                               /* previously the faces were joined, but 
collapsing between 2 edges
+                                * gives some advantage/difference in using 
vertex-dissolve over edge-dissolve */
+#if 0
+                               BM_vert_collapse_faces(bm, v->e, v, 1.0f, TRUE, 
TRUE);
+#else
+                               BM_vert_collapse_edge(bm, v->e, v, TRUE);
+#endif
+
                                continue;
                        }
 
@@ -540,7 +547,7 @@
                        BMVert *v = (BMVert *)weight_elems[i].ele;
                        /* check twice because cumulative effect could disolve 
over angle limit */
                        if (BM_vert_edge_angle(bm, v) < angle_limit) {
-                               BM_vert_collapse_edge(bm, v->e, v); /* join 
edges */
+                               BM_vert_collapse_edge(bm, v->e, v, TRUE); /* 
join edges */
                        }
                }
        }

Modified: trunk/blender/source/blender/bmesh/tools/BME_bevel.c
===================================================================
--- trunk/blender/source/blender/bmesh/tools/BME_bevel.c        2012-02-26 
05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/bmesh/tools/BME_bevel.c        2012-02-26 
05:48:12 UTC (rev 44449)
@@ -530,14 +530,14 @@
                        ke = kl->e;
                        /* BMESH-TODO: jfke doesn't handle customdata */
                        jf = bmesh_jfke(bm, kl->prev->radial_next->f, kl->f, 
kl->prev->e);
-                       BM_vert_collapse_edge(bm, ke, kv);
+                       BM_vert_collapse_edge(bm, ke, kv, FALSE);
                }
                else {
                        BM_face_split(bm, kl->f, kl->next->next->v, kl->v, &nl, 
kl->next->e);
                        ke = kl->e;
                        /* BMESH-TODO: jfke doesn't handle customdata */
                        jf = bmesh_jfke(bm, kl->next->radial_next->f, kl->f, 
kl->next->e);
-                       BM_vert_collapse_edge(bm, ke, kv);
+                       BM_vert_collapse_edge(bm, ke, kv, FALSE);
                }
                /* find saved loop pointer */
                l = se->l;
@@ -576,14 +576,14 @@
                        ke = kl->e;
                        /* BMESH-TODO: jfke doesn't handle customdata */
                        jf = bmesh_jfke(bm, kl->prev->radial_next->f, kl->f, 
kl->prev->e);
-                       BM_vert_collapse_edge(bm, ke, kv);
+                       BM_vert_collapse_edge(bm, ke, kv, FALSE);
                }
                else {
                        BM_face_split(bm, kl->f, kl->next->next->v, kl->v, &nl, 
kl->next->e);
                        ke = kl->e;
                        /* BMESH-TODO: jfke doesn't handle customdata */
                        jf = bmesh_jfke(bm, kl->next->radial_next->f, kl->f, 
kl->next->e);
-                       BM_vert_collapse_edge(bm, ke, kv);
+                       BM_vert_collapse_edge(bm, ke, kv, FALSE);
                }
                /* find saved loop pointer */
                l = se->l;

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c  2012-02-26 
05:04:30 UTC (rev 44448)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_utils.c  2012-02-26 
05:48:12 UTC (rev 44449)
@@ -88,7 +88,7 @@
 
        bm = py_edge->bm;
 
-       e_new = BM_vert_collapse_edge(bm, py_edge->e, py_vert->v);
+       e_new = BM_vert_collapse_edge(bm, py_edge->e, py_vert->v, TRUE);
 
        if (e_new) {
                return BPy_BMEdge_CreatePyObject(bm, e_new);
@@ -154,7 +154,7 @@
 
        bm = py_edge->bm;
 
-       e_new = BM_vert_collapse_faces(bm, py_edge->e, py_vert->v, CLAMPIS(fac, 
0.0f, 1.0f), do_join_faces);
+       e_new = BM_vert_collapse_faces(bm, py_edge->e, py_vert->v, CLAMPIS(fac, 
0.0f, 1.0f), do_join_faces, TRUE);
 
        if (e_new) {
                return BPy_BMEdge_CreatePyObject(bm, e_new);

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

Reply via email to