[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