[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45072] trunk/blender/source/blender/bmesh /intern: Fix #30504 selecting self-intersecting face loop won' t work correctly.

Antony Riakiotakis kalast at gmail.com
Wed Mar 21 22:40:42 CET 2012


Revision: 45072
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45072
Author:   psy-fi
Date:     2012-03-21 21:40:42 +0000 (Wed, 21 Mar 2012)
Log Message:
-----------
Fix #30504 selecting self-intersecting face loop won't work correctly.

Added generic secondary hash to walker. In faceloop select it is used to remember if edge has been previously visited, in addition to the hash used for faces. This solves the case where walker stops if it finds an already added face.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c
    trunk/blender/source/blender/bmesh/intern/bmesh_walkers.h
    trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c	2012-03-21 21:01:58 UTC (rev 45071)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c	2012-03-21 21:40:42 UTC (rev 45072)
@@ -86,7 +86,8 @@
 	walker->mask_face = mask_face;
 
 	walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 1");
-	
+	walker->secvisithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers sec 1");
+
 	if (UNLIKELY(type >= BMW_MAXWALKERS || type < 0)) {
 		fprintf(stderr,
 		        "Invalid walker type in BMW_init; type: %d, "
@@ -125,6 +126,7 @@
 {
 	BLI_mempool_destroy(walker->worklist);
 	BLI_ghash_free(walker->visithash, NULL, NULL);
+	BLI_ghash_free(walker->secvisithash, NULL, NULL);
 }
 
 
@@ -251,5 +253,7 @@
 	}
 	walker->depth = 0;
 	BLI_ghash_free(walker->visithash, NULL, NULL);
+	BLI_ghash_free(walker->secvisithash, NULL, NULL);
 	walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 1");
+	walker->secvisithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers sec 1");
 }

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers.h
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers.h	2012-03-21 21:01:58 UTC (rev 45071)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers.h	2012-03-21 21:40:42 UTC (rev 45072)
@@ -61,6 +61,7 @@
 	short mask_face;
 
 	GHash *visithash;
+	GHash *secvisithash;
 	int depth;
 } BMWalker;
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2012-03-21 21:01:58 UTC (rev 45071)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c	2012-03-21 21:40:42 UTC (rev 45072)
@@ -594,7 +594,7 @@
 	}
 
 	/* the face must not have been already visite */
-	if (BLI_ghash_haskey(walker->visithash, l->f)) {
+	if (BLI_ghash_haskey(walker->visithash, l->f) && BLI_ghash_haskey(walker->secvisithash, l->e)) {
 		return FALSE;
 	}
 
@@ -652,6 +652,10 @@
 	*lwalk = owalk;
 	lwalk->nocalc = 0;
 
+	BLI_ghash_free(walker->secvisithash, NULL, NULL);
+	walker->secvisithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 3");
+	BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
+
 	BLI_ghash_free(walker->visithash, NULL, NULL);
 	walker->visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh walkers 3");
 	BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
@@ -703,6 +707,7 @@
 			lwalk->nocalc = 0;
 		}
 
+		BLI_ghash_insert(walker->secvisithash, l->e, NULL);
 		BLI_ghash_insert(walker->visithash, l->f, NULL);
 	}
 




More information about the Bf-blender-cvs mailing list