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