[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18966] branches/bmesh/blender/source/ blender/bmesh: extrude handles loop customdata properly, also added a BM_Face_CopyShared function to copy loop customdata in a face from adjacent faces .
Joseph Eagar
joeedh at gmail.com
Sat Feb 14 12:58:53 CET 2009
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*/
More information about the Bf-blender-cvs
mailing list