[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39775] branches/bmesh/blender/source/ blender: fixed crash on loop cut of wire edge
Howard Trickey
howard.trickey at gmail.com
Mon Aug 29 16:13:15 CEST 2011
Revision: 39775
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39775
Author: howardt
Date: 2011-08-29 14:13:14 +0000 (Mon, 29 Aug 2011)
Log Message:
-----------
fixed crash on loop cut of wire edge
Part of fix was to make edgering walker work when initial
edge is a wire edge (has no faces attached): it will just
walk that one edge and quit now. I checked other uses
of the edgering walker and this won't hurt them. Had
to add a new wireedge variable to the edge ring walker state.
Modified Paths:
--------------
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_private.h
branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c 2011-08-29 13:59:11 UTC (rev 39774)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c 2011-08-29 14:13:14 UTC (rev 39775)
@@ -514,12 +514,18 @@
edgeringWalker *lwalk, owalk;
BMEdge *e = data;
- if (!e->l) return;
-
BMW_pushstate(walker);
lwalk = walker->currentstate;
lwalk->l = e->l;
+
+ if (!lwalk->l) {
+ lwalk->wireedge = e;
+ return;
+ } else {
+ lwalk->wireedge = NULL;
+ }
+
BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
/*rewind*/
@@ -546,17 +552,24 @@
if (!lwalk) return NULL;
- return lwalk->l->e;
+ if (lwalk->l)
+ return lwalk->l->e;
+ else
+ return lwalk->wireedge;
}
static void *edgeringWalker_step(BMWalker *walker)
{
edgeringWalker *lwalk = walker->currentstate;
- BMEdge *e = lwalk->l->e;
+ BMEdge *e;
BMLoop *l = lwalk->l /* , *origl = lwalk->l */;
BMW_popstate(walker);
+ if (!l)
+ return lwalk->wireedge;
+
+ e = l->e;
l = l->radial_next;
l = l->next->next;
@@ -568,6 +581,7 @@
BMW_pushstate(walker);
lwalk = walker->currentstate;
lwalk->l = l;
+ lwalk->wireedge = NULL;
BLI_ghash_insert(walker->visithash, l->e, NULL);
}
Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_private.h 2011-08-29 13:59:11 UTC (rev 39774)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers_private.h 2011-08-29 14:13:14 UTC (rev 39775)
@@ -66,6 +66,7 @@
typedef struct edgeringWalker {
struct edgeringWalker * prev;
BMLoop *l;
+ BMEdge *wireedge;
} edgeringWalker;
typedef struct uvedgeWalker {
Modified: branches/bmesh/blender/source/blender/editors/mesh/loopcut.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/loopcut.c 2011-08-29 13:59:11 UTC (rev 39774)
+++ branches/bmesh/blender/source/blender/editors/mesh/loopcut.c 2011-08-29 14:13:14 UTC (rev 39775)
@@ -249,7 +249,7 @@
lasteed = eed;
}
- if (BM_Edge_Share_Faces(lasteed, startedge)) {
+ if (lasteed != startedge && BM_Edge_Share_Faces(lasteed, startedge)) {
v[1][0] = v[0][0];
v[1][1] = v[0][1];
More information about the Bf-blender-cvs
mailing list