Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2012-03-22 01:40:42 +0400
committerAntony Riakiotakis <kalast@gmail.com>2012-03-22 01:40:42 +0400
commit95f66f162ce695310872950232b6a00633646e1e (patch)
tree35d244d049192a07eedd2aae537a30361709c620 /source/blender
parentff7088088f63a2cfb4ab9b2219c29afe751dfed8 (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/blender')
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers.c6
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers.h1
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers_impl.c7
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);
}