[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