Revision: 18966
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18966
Author:   joeedh
Date:     2009-02-14 12:58:52 +0100 (Sat, 14 Feb 2009)

Log Message:
-----------
extrude handles loop customdata properly,  also added a BM_Face_CopyShared 
function to copy loop customdata in a face from adjacent faces.  it's not used 
(didn't work in this case) but it seemed fairly useful.  may remove if it turns 
out to not be necassary.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-02-14 10:03:24 UTC 
(rev 18965)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-02-14 11:58:52 UTC 
(rev 18966)
@@ -144,7 +144,7 @@
        struct BMNode d1, d2;
        struct BMLoop *loop;
        void *data;
-       float crease, bweight;                                                  
                        /*make these custom data.... no really, please....*/
+       float crease, bweight; /*make these custom data.... no really, 
please....*/
 } BMEdge;
 
 typedef struct BMLoop  {
@@ -180,6 +180,8 @@
 struct BMEdge *BM_Make_Edge(struct BMesh *bm, struct BMVert *v1, struct BMVert 
*v2, struct BMEdge *example, int nodouble);
 struct BMFace *BM_Make_Quadtriangle(struct BMesh *bm, struct BMVert **verts, 
BMEdge **edges, int len, struct BMFace *example, int nodouble);
 struct BMFace *BM_Make_Ngon(struct BMesh *bm, struct BMVert *v1, struct BMVert 
*v2, struct BMEdge **edges, int len, int nodouble);
+/*copies loop data from adjacent faces*/
+void BM_Face_CopyShared(BMesh *bm, BMFace *f);
 void BM_Copy_Attributes(struct BMesh *source_mesh, struct BMesh *target_mesh, 
void *source, void *target);
 void BM_remove_tagged_faces(struct BMesh *bm, int flag);
 void BM_remove_tagged_edges(struct BMesh *bm, int flag);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c        
2009-02-14 10:03:24 UTC (rev 18965)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c        
2009-02-14 11:58:52 UTC (rev 18966)
@@ -36,6 +36,10 @@
 #include "bmesh.h"
 #include "bmesh_private.h"
 
+/*prototypes*/
+static void bm_copy_loop_attributes(BMesh *source_mesh, BMesh *target_mesh,
+                                    BMLoop *source_loop, BMLoop *target_loop);
+
 /*
  * BM_CONSTRUCT.C
  *
@@ -170,6 +174,29 @@
        return f;
 }
 
+
+/*copies face data from shared adjacent faces*/
+void BM_Face_CopyShared(BMesh *bm, BMFace *f) {
+       BMIter iter;
+       BMLoop *l, *l2;
+
+       if (!f) return;
+
+       l=BMIter_New(&iter, bm, BM_LOOPS_OF_FACE, f);
+       for (; l; l=BMIter_Step(&iter)) {
+               l2 = l->radial.next->data;
+               
+               if (l2 && l2 != l) {
+                       if (l2->v == l->v) {
+                               bm_copy_loop_attributes(bm, bm, l2, l);
+                       } else {
+                               l2 = (BMLoop*) l2->head.next;
+                               bm_copy_loop_attributes(bm, bm, l2, l);
+                       }
+               }
+       }
+}
+
 /*
  * BMESH MAKE NGON
  *
@@ -196,7 +223,7 @@
                                verts[i] = edges[i]->v1;
                        } else if(!BMO_TestFlag(bm, edges[i]->v2, BM_EDGEVERT)) 
{
                                BMO_SetFlag(bm, edges[i]->v2, BM_EDGEVERT);
-                               verts[i] =      edges[i]->v2;
+                               verts[i] = edges[i]->v2;
                        }
                }
                
@@ -211,9 +238,10 @@
                if(len > VERT_BUF_SIZE)
                        MEM_freeN(verts);
        }
-               
-       if((!f) && (!overlap))
+
+       if((!f) && (!overlap)) {
                f = bmesh_mf(bm, v1, v2, edges, len);
+       }
 
        return f;
 }

Modified: branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c  
2009-02-14 10:03:24 UTC (rev 18965)
+++ branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c  
2009-02-14 11:58:52 UTC (rev 18966)
@@ -19,6 +19,7 @@
        BMOIter siter;
        BMIter iter, fiter;
        BMEdge *edge, *newedge;
+       BMLoop *l, *l2;
        BMVert *verts[4];
        BMFace *f;
        int totflagged, rlen;
@@ -65,6 +66,28 @@
                
                //not sure what to do about example face, pass NULL for now.
                f = BM_Make_Quadtriangle(bm, verts, NULL, 4, NULL, 0);          
+
+               /*copy attributes*/
+               l=BMIter_New(&iter, bm, BM_LOOPS_OF_FACE, f);
+               for (; l; l=BMIter_Step(&iter)) {
+                       l2 = l->radial.next->data;
+                       
+                       if (l2 && l2 != l) {
+                               /*copy data*/
+                               if (l2->v == l->v) {
+                                       BM_Copy_Attributes(bm, bm, l2, l);
+                                       l2 = (BMLoop*) l2->head.next;
+                                       l = (BMLoop*) l->head.next;
+                                       BM_Copy_Attributes(bm, bm, l2, l);
+                               } else {
+                                       l2 = (BMLoop*) l2->head.next;
+                                       BM_Copy_Attributes(bm, bm, l2, l);
+                                       l2 = (BMLoop*) l2->head.prev;
+                                       l = (BMLoop*) l->head.next;
+                                       BM_Copy_Attributes(bm, bm, l2, l);
+                               }
+                       }
+               }
        }
        
        /*cleanup*/


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to