[Bf-blender-cvs] [6ebbcbd] master: Fix F62828. UV stitch code did not handle non manifold edges very well. This made loops in linked lists of uvedges from duplicate members causing a hang. Now check all previous links before adding a new one. It is not much slower in practice because non-manifolds are not that frequent.

Antony Riakiotakis noreply at git.blender.org
Tue Mar 4 13:37:12 CET 2014


Commit: 6ebbcbd5df45c9a5953a3f6d3c068310fea58d7a
Author: Antony Riakiotakis
Date:   Tue Mar 4 14:36:46 2014 +0200
https://developer.blender.org/rB6ebbcbd5df45c9a5953a3f6d3c068310fea58d7a

Fix F62828. UV stitch code did not handle non manifold edges very well.
This made loops in linked lists of uvedges from duplicate members
causing a hang. Now check all previous links before adding a new one. It
is not much slower in practice because non-manifolds are not that
frequent.

===================================================================

M	source/blender/editors/uvedit/uvedit_smart_stitch.c

===================================================================

diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c
index a3fee69..6bf9315 100644
--- a/source/blender/editors/uvedit/uvedit_smart_stitch.c
+++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c
@@ -669,26 +669,30 @@ static void stitch_uv_edge_generate_linked_edges(GHash *edge_hash, StitchState *
 				if (iter2) {
 					int index1 = map[iter1 - first_element];
 					int index2 = map[iter2 - first_element];
+					UvEdge edgetmp;
+					UvEdge *edge2, *eiter;
+					bool valid = true;
 
-					/* make certain we do not have the same edge! */
-					if (state->uvs[index2] != element2 && state->uvs[index1] != element1) {
-						UvEdge edgetmp;
-						UvEdge *edge2;
+					/* make sure the indices are well behaved */
+					if (index1 > index2) {
+						SWAP(int, index1, index2);
+					}
 
+					edgetmp.uv1 = index1;
+					edgetmp.uv2 = index2;
 
-						/* make sure the indices are well behaved */
-						if (index1 < index2) {
-							edgetmp.uv1 = index1;
-							edgetmp.uv2 = index2;
-						}
-						else {
-							edgetmp.uv1 = index2;
-							edgetmp.uv2 = index1;
-						}
+					/* get the edge from the hash */
+					edge2 = BLI_ghash_lookup(edge_hash, &edgetmp);
 
-						/* get the edge from the hash */
-						edge2 = BLI_ghash_lookup(edge_hash, &edgetmp);
+					/* more iteration to make sure non-manifold case is handled nicely */
+					for (eiter = edge; eiter; eiter = eiter->next){
+						if (edge2 == eiter) {
+							valid = false;
+							break;
+						}
+					}
 
+					if (valid) {
 						/* here I am taking care of non manifold case, assuming more than two matching edges.
 						 * I am not too sure we want this though */
 						last_set->next = edge2;
@@ -1889,7 +1893,7 @@ static int stitch_init(bContext *C, wmOperator *op)
 				if (!(ts->uv_flag & UV_SYNC_SELECTION) && ((BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) || !BM_elem_flag_test(efa, BM_ELEM_SELECT)))
 					continue;
 
-				BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
+				BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
 					if (uvedit_edge_select_test(scene, l, cd_loop_uv_offset)) {
 						UvEdge *edge = uv_edge_get(l, state);
 						if (edge) {




More information about the Bf-blender-cvs mailing list