diff options
author | Antony Riakiotakis <kalast@gmail.com> | 2012-03-22 01:40:42 +0400 |
---|---|---|
committer | Antony Riakiotakis <kalast@gmail.com> | 2012-03-22 01:40:42 +0400 |
commit | 95f66f162ce695310872950232b6a00633646e1e (patch) | |
tree | 35d244d049192a07eedd2aae537a30361709c620 /source | |
parent | ff7088088f63a2cfb4ab9b2219c29afe751dfed8 (diff) |
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.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers.c | 6 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers_impl.c | 7 |
3 files changed, 12 insertions, 2 deletions
diff --git a/source/blender/bmesh/intern/bmesh_walkers.c b/source/blender/bmesh/intern/bmesh_walkers.c index 029bc35f2e7..bf646827a51 100644 --- a/source/blender/bmesh/intern/bmesh_walkers.c +++ b/source/blender/bmesh/intern/bmesh_walkers.c @@ -86,7 +86,8 @@ void BMW_init(BMWalker *walker, BMesh *bm, int type, 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 @@ void BMW_end(BMWalker *walker) { BLI_mempool_destroy(walker->worklist); BLI_ghash_free(walker->visithash, NULL, NULL); + BLI_ghash_free(walker->secvisithash, NULL, NULL); } @@ -251,5 +253,7 @@ void BMW_reset(BMWalker *walker) } 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"); } diff --git a/source/blender/bmesh/intern/bmesh_walkers.h b/source/blender/bmesh/intern/bmesh_walkers.h index 90f7b36e3a2..1d548a0d4c7 100644 --- a/source/blender/bmesh/intern/bmesh_walkers.h +++ b/source/blender/bmesh/intern/bmesh_walkers.h @@ -61,6 +61,7 @@ typedef struct BMWalker { short mask_face; GHash *visithash; + GHash *secvisithash; int depth; } BMWalker; diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index 8efcf9498f4..4821ec5edd2 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -594,7 +594,7 @@ static int bmw_FaceLoopWalker_include_face(BMWalker *walker, BMLoop *l) } /* 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 @@ static void bmw_FaceLoopWalker_begin(BMWalker *walker, void *data) *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 @@ static void *bmw_FaceLoopWalker_step(BMWalker *walker) lwalk->nocalc = 0; } + BLI_ghash_insert(walker->secvisithash, l->e, NULL); BLI_ghash_insert(walker->visithash, l->f, NULL); } |