[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60722] trunk/blender/source/blender/bmesh /intern/bmesh_polygon.c: fix [#37046] Dissolve edges and vertices problem with triangulate

Dalai Felinto dfelinto at gmail.com
Sun Oct 13 07:04:07 CEST 2013


Revision: 60722
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60722
Author:   dfelinto
Date:     2013-10-13 05:04:06 +0000 (Sun, 13 Oct 2013)
Log Message:
-----------
fix [#37046] Dissolve edges and vertices problem with triangulate
with review and collaboration from Campbell Barton

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2013-10-13 01:09:23 UTC (rev 60721)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2013-10-13 05:04:06 UTC (rev 60722)
@@ -813,6 +813,7 @@
  *
  * \note use_tag tags new flags and edges.
  */
+#define SF_EDGE_IS_BOUNDARY 0xff
 void BM_face_triangulate(BMesh *bm, BMFace *f,
                          BMFace **r_faces_new,
                          MemArena *sf_arena,
@@ -833,7 +834,7 @@
 
 		if (use_tag) {
 			BM_elem_flag_enable(l_new->e, BM_ELEM_TAG);
-			BM_elem_flag_enable(f, BM_ELEM_TAG);
+			BM_elem_flag_enable(f_new, BM_ELEM_TAG);
 		}
 
 		if (r_faces_new) {
@@ -844,6 +845,7 @@
 		/* scanfill */
 		ScanFillContext sf_ctx;
 		ScanFillVert *sf_vert, *sf_vert_prev = NULL;
+		ScanFillEdge *sf_edge;
 		ScanFillFace *sf_tri;
 		int totfilltri;
 
@@ -859,13 +861,15 @@
 
 		do {
 			sf_vert = BLI_scanfill_vert_add(&sf_ctx, l_iter->v->co);
-			BLI_scanfill_edge_add(&sf_ctx, sf_vert_prev, sf_vert);
+			sf_edge = BLI_scanfill_edge_add(&sf_ctx, sf_vert_prev, sf_vert);
+			sf_edge->tmp.c = SF_EDGE_IS_BOUNDARY;
 
 			sf_vert->tmp.p = l_iter;
 			sf_vert_prev = sf_vert;
 		} while ((l_iter = l_iter->next) != l_first);
 
-		BLI_scanfill_edge_add(&sf_ctx, sf_vert_prev, sf_ctx.fillvertbase.first);
+		sf_edge = BLI_scanfill_edge_add(&sf_ctx, sf_vert_prev, sf_ctx.fillvertbase.first);
+		sf_edge->tmp.c = SF_EDGE_IS_BOUNDARY;
 
 		/* calculate filled triangles */
 		totfilltri = BLI_scanfill_calc_ex(&sf_ctx, 0, f->no);
@@ -895,13 +899,27 @@
 			BM_elem_attrs_copy(bm, bm, l_tri[1], l_new->next);
 			BM_elem_attrs_copy(bm, bm, l_tri[2], l_new->prev);
 
-			if (use_tag) {
-				BM_elem_flag_enable(l_new->e, BM_ELEM_TAG);
+			/* add all but the last face which is swapped and removed (below) */
+			if (sf_tri->next) {
+				if (use_tag) {
+					BM_elem_flag_enable(f_new, BM_ELEM_TAG);
+				}
+				if (r_faces_new && sf_tri->next) {
+					r_faces_new[nf_i++] = f_new;
+				}
 			}
+		}
 
-			/* add all but the last face which is swapped and removed (below) */
-			if (r_faces_new && sf_tri->next) {
-				r_faces_new[nf_i++] = f_new;
+		if (use_tag) {
+			ScanFillEdge *sf_edge;
+			for (sf_edge = sf_ctx.filledgebase.first; sf_edge; sf_edge = sf_edge->next) {
+				if (sf_edge->tmp.c != SF_EDGE_IS_BOUNDARY) {
+					BMLoop *l1 = sf_edge->v1->tmp.p;
+					BMLoop *l2 = sf_edge->v2->tmp.p;
+
+					BMEdge *e = BM_edge_exists(l1->v, l2->v);
+					BM_elem_flag_enable(e, BM_ELEM_TAG);
+				}
 			}
 		}
 
@@ -910,10 +928,6 @@
 			 * so swap data and delete the last created tri */
 			bmesh_face_swap_data(bm, f, f_new);
 			BM_face_kill(bm, f_new);
-
-			if (use_tag) {
-				BM_elem_flag_enable(f, BM_ELEM_TAG);
-			}
 		}
 
 		/* garbage collection */




More information about the Bf-blender-cvs mailing list