diff options
author | Howard Trickey <howard.trickey@gmail.com> | 2013-09-19 16:47:35 +0400 |
---|---|---|
committer | Howard Trickey <howard.trickey@gmail.com> | 2013-09-19 16:47:35 +0400 |
commit | 67fa1a57ba953c749dac526104b4b185ab027476 (patch) | |
tree | 750a488ef30eab94d8ed3bf01eccf1b768f4821e | |
parent | 0be2e21e2d7e3ad170021ddf5ca82e634175324b (diff) |
Fix potential crash in knife.
A crash was reported but without info to reproduce.
This is a likely crash introduced by previous fix
to allow linehits to snap to vertices.
The function to find connected linehits can't
assume all linehits have edges any more.
-rw-r--r-- | source/blender/editors/mesh/editmesh_knife.c | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c index 7ea1432a791..5051a5ac259 100644 --- a/source/blender/editors/mesh/editmesh_knife.c +++ b/source/blender/editors/mesh/editmesh_knife.c @@ -590,25 +590,57 @@ static int verge_linehit(const void *vlh1, const void *vlh2) static int find_connected_linehit(KnifeTool_OpData *kcd, int testi, BMFace *f, int firsti, int lasti) { int i; - - for (i = firsti; i <= lasti; i++) { - if (testi >= 0 && testi < kcd->totlinehit) { - if (knife_find_common_face(&kcd->linehits[testi].kfe->faces, - &kcd->linehits[i].kfe->faces)) - { - return i; - } - else if (kcd->linehits[testi].v && - kcd->linehits[testi].v == kcd->linehits[i].v) - { - return i; - } - } - else if (f) { - if (find_ref(&kcd->linehits[i].kfe->faces, f)) - return i; + ListBase *testfaces, *ifaces; + BMFace *testface, *iface; + BMEdgeHit *lh; + bool shareface; + + if (testi >= 0 && testi < kcd->totlinehit) { + testface = NULL; + testfaces = NULL; + lh = &kcd->linehits[testi]; + if (lh->v) + testfaces = &lh->v->faces; + else if (lh->kfe) + testfaces = &lh->kfe->faces; + else if (lh->f) { + testfaces = NULL; + testface = lh->f; } } + else { + testface = f; + testfaces = NULL; + } + for (i = firsti; i <= lasti; i++) { + shareface = false; + lh = &kcd->linehits[i]; + iface = NULL; + ifaces = NULL; + if (lh->v) + ifaces = &lh->v->faces; + else if (lh->kfe) + ifaces = &lh->kfe->faces; + else if (lh->f) { + ifaces = NULL; + iface = lh->f; + } + if (testfaces) { + if (ifaces) + shareface = knife_find_common_face(testfaces, ifaces); + else if (iface) + shareface = find_ref(testfaces, iface); + } + else if (ifaces) { + if (testface) + shareface = find_ref(ifaces, testface); + } + else if (testface && iface) { + shareface = (testface == iface); + } + if (shareface) + return i; + } return -1; } |