[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