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];
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to