[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52588] trunk/blender/source/blender: fix/ workaround [#33281] script goes into not responding

Campbell Barton ideasman42 at gmail.com
Tue Nov 27 00:18:05 CET 2012


Revision: 52588
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52588
Author:   campbellbarton
Date:     2012-11-26 23:18:04 +0000 (Mon, 26 Nov 2012)
Log Message:
-----------
fix/workaround [#33281] script goes into not responding 

scanfill remove-doubles pass assumes ordered edges (as with curves), otherwise it can hang.
workaround this problem by skipping removing-doubles for mesh ngons, since this isnt such a common case as it is with curves and we can just not support it.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/displist.c
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c
    trunk/blender/source/blender/blenkernel/intern/mesh.c
    trunk/blender/source/blender/blenlib/BLI_scanfill.h
    trunk/blender/source/blender/blenlib/intern/scanfill.c
    trunk/blender/source/blender/bmesh/operators/bmo_triangulate.c
    trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
    trunk/blender/source/blender/windowmanager/intern/wm_gesture.c

Modified: trunk/blender/source/blender/blenkernel/intern/displist.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/displist.c	2012-11-26 21:59:41 UTC (rev 52587)
+++ trunk/blender/source/blender/blenkernel/intern/displist.c	2012-11-26 23:18:04 UTC (rev 52588)
@@ -487,7 +487,7 @@
 		}
 
 		/* XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) { */
-		if (totvert && (tot = BLI_scanfill_calc(&sf_ctx, FALSE))) {
+		if (totvert && (tot = BLI_scanfill_calc(&sf_ctx, BLI_SCANFILL_CALC_REMOVE_DOUBLES))) {
 			if (tot) {
 				dlnew = MEM_callocN(sizeof(DispList), "filldisplist");
 				dlnew->type = DL_INDEX3;

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-11-26 21:59:41 UTC (rev 52587)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-11-26 23:18:04 UTC (rev 52588)
@@ -215,7 +215,7 @@
 			/* complete the loop */
 			BLI_scanfill_edge_add(&sf_ctx, sf_vert_first, sf_vert);
 
-			totfilltri = BLI_scanfill_calc_ex(&sf_ctx, FALSE, efa->no);
+			totfilltri = BLI_scanfill_calc_ex(&sf_ctx, 0, efa->no);
 			BLI_array_grow_items(looptris, totfilltri);
 
 			for (sf_tri = sf_ctx.fillfacebase.first; sf_tri; sf_tri = sf_tri->next) {

Modified: trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-11-26 21:59:41 UTC (rev 52587)
+++ trunk/blender/source/blender/blenkernel/intern/mask_rasterize.c	2012-11-26 23:18:04 UTC (rev 52588)
@@ -933,7 +933,7 @@
 			}
 
 			/* main scan-fill */
-			sf_tri_tot = BLI_scanfill_calc_ex(&sf_ctx, FALSE, zvec);
+			sf_tri_tot = BLI_scanfill_calc_ex(&sf_ctx, 0, zvec);
 
 			face_array = MEM_mallocN(sizeof(*face_array) * (sf_tri_tot + tot_feather_quads), "maskrast_face_index");
 			face_index = 0;

Modified: trunk/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-11-26 21:59:41 UTC (rev 52587)
+++ trunk/blender/source/blender/blenkernel/intern/mesh.c	2012-11-26 23:18:04 UTC (rev 52588)
@@ -2607,7 +2607,7 @@
 			}
 			BLI_scanfill_edge_add(&sf_ctx, sf_vert_last, sf_vert_first);
 			
-			totfilltri = BLI_scanfill_calc(&sf_ctx, FALSE);
+			totfilltri = BLI_scanfill_calc(&sf_ctx, 0);
 			if (totfilltri) {
 				BLI_array_grow_items(mface_to_poly_map, totfilltri);
 				BLI_array_grow_items(mface, totfilltri);

Modified: trunk/blender/source/blender/blenlib/BLI_scanfill.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_scanfill.h	2012-11-26 21:59:41 UTC (rev 52587)
+++ trunk/blender/source/blender/blenlib/BLI_scanfill.h	2012-11-26 23:18:04 UTC (rev 52588)
@@ -94,9 +94,18 @@
 struct ScanFillVert *BLI_scanfill_vert_add(ScanFillContext *sf_ctx, const float vec[3]);
 struct ScanFillEdge *BLI_scanfill_edge_add(ScanFillContext *sf_ctx, struct ScanFillVert *v1, struct ScanFillVert *v2);
 
+enum {
+	BLI_SCANFILL_CALC_QUADTRI_FASTPATH = (1 << 0),
+
+	/* note: using BLI_SCANFILL_CALC_REMOVE_DOUBLES
+	 * Assumes ordered edges, otherwise we risk an eternal loop
+	 * removing double verts. - campbell */
+	BLI_SCANFILL_CALC_REMOVE_DOUBLES   = (1 << 1),
+};
+
 int BLI_scanfill_begin(ScanFillContext *sf_ctx);
-int BLI_scanfill_calc(ScanFillContext *sf_ctx, const short do_quad_tri_speedup);
-int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const short do_quad_tri_speedup,
+int BLI_scanfill_calc(ScanFillContext *sf_ctx, const int flag);
+int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag,
                          const float nor_proj[3]);
 void BLI_scanfill_end(ScanFillContext *sf_ctx);
 

Modified: trunk/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/scanfill.c	2012-11-26 21:59:41 UTC (rev 52587)
+++ trunk/blender/source/blender/blenlib/intern/scanfill.c	2012-11-26 23:18:04 UTC (rev 52588)
@@ -503,8 +503,7 @@
 	}
 }
 
-
-static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf)
+static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf, const int flag)
 {
 	ScanFillVertLink *sc = NULL, *sc1;
 	ScanFillVert *eve, *v1, *v2, *v3;
@@ -530,26 +529,28 @@
 #endif
 
 	/* STEP 0: remove zero sized edges */
-	eed = sf_ctx->filledgebase.first;
-	while (eed) {
-		if (equals_v2v2(eed->v1->xy, eed->v2->xy)) {
-			if (eed->v1->f == SF_VERT_ZERO_LEN && eed->v2->f != SF_VERT_ZERO_LEN) {
-				eed->v2->f = SF_VERT_ZERO_LEN;
-				eed->v2->tmp.v = eed->v1->tmp.v;
+	if (flag & BLI_SCANFILL_CALC_REMOVE_DOUBLES) {
+		eed = sf_ctx->filledgebase.first;
+		while (eed) {
+			if (equals_v2v2(eed->v1->xy, eed->v2->xy)) {
+				if (eed->v1->f == SF_VERT_ZERO_LEN && eed->v2->f != SF_VERT_ZERO_LEN) {
+					eed->v2->f = SF_VERT_ZERO_LEN;
+					eed->v2->tmp.v = eed->v1->tmp.v;
+				}
+				else if (eed->v2->f == SF_VERT_ZERO_LEN && eed->v1->f != SF_VERT_ZERO_LEN) {
+					eed->v1->f = SF_VERT_ZERO_LEN;
+					eed->v1->tmp.v = eed->v2->tmp.v;
+				}
+				else if (eed->v2->f == SF_VERT_ZERO_LEN && eed->v1->f == SF_VERT_ZERO_LEN) {
+					eed->v1->tmp.v = eed->v2->tmp.v;
+				}
+				else {
+					eed->v2->f = SF_VERT_ZERO_LEN;
+					eed->v2->tmp.v = eed->v1;
+				}
 			}
-			else if (eed->v2->f == SF_VERT_ZERO_LEN && eed->v1->f != SF_VERT_ZERO_LEN) {
-				eed->v1->f = SF_VERT_ZERO_LEN;
-				eed->v1->tmp.v = eed->v2->tmp.v;
-			}
-			else if (eed->v2->f == SF_VERT_ZERO_LEN && eed->v1->f == SF_VERT_ZERO_LEN) {
-				eed->v1->tmp.v = eed->v2->tmp.v;
-			}
-			else {
-				eed->v2->f = SF_VERT_ZERO_LEN;
-				eed->v2->tmp.v = eed->v1;
-			}
+			eed = eed->next;
 		}
-		eed = eed->next;
 	}
 
 	/* STEP 1: make using FillVert and FillEdge lists a sorted
@@ -572,28 +573,42 @@
 
 	qsort(sf_ctx->_scdata, verts, sizeof(ScanFillVertLink), vergscdata);
 
-	eed = sf_ctx->filledgebase.first;
-	while (eed) {
-		nexted = eed->next;
-		BLI_remlink(&sf_ctx->filledgebase, eed);
-		/* This code is for handling zero-length edges that get
-		 * collapsed in step 0. It was removed for some time to
-		 * fix trunk bug #4544, so if that comes back, this code
-		 * may need some work, or there will have to be a better
-		 * fix to #4544. */
-		if (eed->v1->f == SF_VERT_ZERO_LEN) {
-			v1 = eed->v1;
-			while ((eed->v1->f == SF_VERT_ZERO_LEN) && (eed->v1->tmp.v != v1) && (eed->v1 != eed->v1->tmp.v))
-				eed->v1 = eed->v1->tmp.v;
+	if (flag & BLI_SCANFILL_CALC_REMOVE_DOUBLES) {
+		for (eed = sf_ctx->filledgebase.first; eed; eed = nexted) {
+			nexted = eed->next;
+			BLI_remlink(&sf_ctx->filledgebase, eed);
+			/* This code is for handling zero-length edges that get
+			 * collapsed in step 0. It was removed for some time to
+			 * fix trunk bug #4544, so if that comes back, this code
+			 * may need some work, or there will have to be a better
+			 * fix to #4544.
+			 *
+			 * warning, this can hang on un-ordered edges, see: [#33281]
+			 * for now disable 'BLI_SCANFILL_CALC_REMOVE_DOUBLES' for ngons.
+			 */
+			if (eed->v1->f == SF_VERT_ZERO_LEN) {
+				v1 = eed->v1;
+				while ((eed->v1->f == SF_VERT_ZERO_LEN) && (eed->v1->tmp.v != v1) && (eed->v1 != eed->v1->tmp.v))
+					eed->v1 = eed->v1->tmp.v;
+			}
+			if (eed->v2->f == SF_VERT_ZERO_LEN) {
+				v2 = eed->v2;
+				while ((eed->v2->f == SF_VERT_ZERO_LEN) && (eed->v2->tmp.v != v2) && (eed->v2 != eed->v2->tmp.v))
+					eed->v2 = eed->v2->tmp.v;
+			}
+			if (eed->v1 != eed->v2) {
+				addedgetoscanlist(sf_ctx, eed, verts);
+			}
 		}
-		if (eed->v2->f == SF_VERT_ZERO_LEN) {
-			v2 = eed->v2;
-			while ((eed->v2->f == SF_VERT_ZERO_LEN) && (eed->v2->tmp.v != v2) && (eed->v2 != eed->v2->tmp.v))
-				eed->v2 = eed->v2->tmp.v;
+	}
+	else {
+		for (eed = sf_ctx->filledgebase.first; eed; eed = nexted) {
+			nexted = eed->next;
+			BLI_remlink(&sf_ctx->filledgebase, eed);
+			if (eed->v1 != eed->v2) {
+				addedgetoscanlist(sf_ctx, eed, verts);
+			}
 		}
-		if (eed->v1 != eed->v2) addedgetoscanlist(sf_ctx, eed, verts);
-
-		eed = nexted;
 	}
 #if 0
 	sc = scdata;
@@ -775,12 +790,12 @@
 	return 1;
 }
 
-int BLI_scanfill_calc(ScanFillContext *sf_ctx, const short do_quad_tri_speedup)
+int BLI_scanfill_calc(ScanFillContext *sf_ctx, const int flag)
 {
-	return BLI_scanfill_calc_ex(sf_ctx, do_quad_tri_speedup, NULL);
+	return BLI_scanfill_calc_ex(sf_ctx, flag, NULL);
 }
 
-int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const short do_quad_tri_speedup, const float nor_proj[3])
+int BLI_scanfill_calc_ex(ScanFillContext *sf_ctx, const int flag, const float nor_proj[3])
 {
 	/*
 	 * - fill works with its own lists, so create that first (no faces!)
@@ -810,30 +825,32 @@
 		a += 1;
 	}
 
-	if (do_quad_tri_speedup && (a == 3)) {
-		eve = sf_ctx->fillvertbase.first;
+	if (flag & BLI_SCANFILL_CALC_QUADTRI_FASTPATH) {
+		if (a == 3) {
+			eve = sf_ctx->fillvertbase.first;
 
-		addfillface(sf_ctx, eve, eve->next, eve->next->next);
-		return 1;
-	}
-	else if (do_quad_tri_speedup && (a == 4)) {
-		float vec1[3], vec2[3];
+			addfillface(sf_ctx, eve, eve->next, eve->next->next);
+			return 1;
+		}
+		else if (a == 4) {
+			float vec1[3], vec2[3];
 
-		eve = sf_ctx->fillvertbase.first;
-		/* no need to check 'eve->next->next->next' is valid, already counted */
-		/* use shortest diagonal for quad */
-		sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
-		sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
+			eve = sf_ctx->fillvertbase.first;
+			/* no need to check 'eve->next->next->next' is valid, already counted */
+			/* use shortest diagonal for quad */
+			sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
+			sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
 
-		if (dot_v3v3(vec1, vec1) < dot_v3v3(vec2, vec2)) {
-			addfillface(sf_ctx, eve, eve->next, eve->next->next);
-			addfillface(sf_ctx, eve->next->next, eve->next->next->next, eve);
+			if (dot_v3v3(vec1, vec1) < dot_v3v3(vec2, vec2)) {
+				addfillface(sf_ctx, eve, eve->next, eve->next->next);
+				addfillface(sf_ctx, eve->next->next, eve->next->next->next, eve);
+			}
+			else {
+				addfillface(sf_ctx, eve->next, eve->next->next, eve->next->next->next);
+				addfillface(sf_ctx, eve->next->next->next, eve, eve->next);
+			}
+			return 2;
 		}

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list