Revision: 19214
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19214
Author:   briggs
Date:     2009-03-06 20:41:57 +0100 (Fri, 06 Mar 2009)

Log Message:
-----------
-> Added new restrction to Join Face Kill Edge Euler

Join Face Kill Edge now checks to make sure it wont create
a face where the same vertex appears twice in the loop cycle.

Note to Joe:

This is what we talked about on IRC a while back. It
seems to work from here, but you should probably give it a
really good test in the vert dissolve code.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c   
2009-03-06 18:57:43 UTC (rev 19213)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_eulers.c   
2009-03-06 19:41:57 UTC (rev 19214)
@@ -903,6 +903,8 @@
  *     A BMFace pointer
 */
 
+//disregarding f1loop and f2loop, if a vertex appears in a joined face more 
than once, we cancel
+
 BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
 {
        
@@ -935,7 +937,7 @@
        if(f1loop->v == f2loop->v) return NULL;
        
        /*
-               Finally validate that for each face, each vertex has another 
edge in its disk cycle that is 
+               validate that for each face, each vertex has another edge in 
its disk cycle that is 
                not e, and not shared.
        */
        if(bmesh_radial_find_face( ((BMLoop*)(f1loop->head.next))->e,f2)) 
return NULL;
@@ -947,6 +949,29 @@
        shared = BM_Face_Sharededges(f1,f2);
        if(shared > 1) return NULL;
 
+       /*validate no internal joins*/
+       for(i=0, curloop = f1->loopbase; i < f1len; i++, curloop = 
((BMLoop*)(curloop->head.next)) ) curloop->v->head.eflag1 = 0;
+       for(i=0, curloop = f2->loopbase; i < f2len; i++, curloop = 
((BMLoop*)(curloop->head.next)) ) curloop->v->head.eflag1 = 0;
+
+       for(i=0, curloop = f1->loopbase; i < f1len; i++, curloop = 
((BMLoop*)(curloop->head.next)) ){
+               if(curloop != f1loop)
+                       curloop->v->head.eflag1++;
+       }
+       for(i=0, curloop = f2->loopbase; i < f2len; i++, curloop = 
((BMLoop*)(curloop->head.next)) ){
+               if(curloop != f2loop)
+                       curloop->v->head.eflag1++;
+       }
+
+       for(i=0, curloop = f1->loopbase; i < f1len; i++, curloop = 
((BMLoop*)(curloop->head.next)) ){
+               if(curloop->v->head.eflag1 > 1)
+                       return NULL;
+       }
+       
+       for(i=0, curloop = f2->loopbase; i < f2len; i++, curloop = 
((BMLoop*)(curloop->head.next)) ){
+               if(curloop->v->head.eflag1 > 1)
+                       return NULL;
+       }
+
        /*join the two loops*/
        f1loop->head.prev->next = f2loop->head.next;
        f2loop->head.next->prev = f1loop->head.prev;


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

Reply via email to