[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19306] branches/bmesh/blender/source/ blender/bmesh: some fixes for extrude, to better handle customdata, winding , etc.

Joseph Eagar joeedh at gmail.com
Mon Mar 16 10:41:33 CET 2009


Revision: 19306
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19306
Author:   joeedh
Date:     2009-03-16 10:41:33 +0100 (Mon, 16 Mar 2009)

Log Message:
-----------
some fixes for extrude, to better handle customdata, winding, etc.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/bmesh_error.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
    branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_error.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_error.h	2009-03-16 02:55:42 UTC (rev 19305)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_error.h	2009-03-16 09:41:33 UTC (rev 19306)
@@ -36,16 +36,18 @@
 #define BMERR_DISSOLVEFACES_FAILED		5
 #define BMERR_DISSOLVEVERTS_FAILED		6
 #define BMERR_TESSELATION			7
+#define BMERR_NONMANIFOLD			8
 
 static char *bmop_error_messages[] = {
        0,
        "Self intersection error",
        "Could not dissolve vert",
-       "Could not connect verts",
+       "Could not connect vertices",
        "Could not traverse mesh",
        "Could not dissolve faces",
        "Could not dissolve vertices",
        "Tesselation error",
+       "Can not deal with non-manifold geometry"
 };
 
 #endif /* _BMESH_ERROR_H */
\ No newline at end of file

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-03-16 02:55:42 UTC (rev 19305)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_walkers.h	2009-03-16 09:41:33 UTC (rev 19306)
@@ -19,7 +19,9 @@
 	GHash *visithash;
 } BMWalker;
 
-void BMW_Init(struct BMWalker *walker, BMesh *bm,int type, int searchmask);
+/*initialize a walker.  searchmask restricts some (not all) walkers to
+  elements with a specific tool flag set.*/
+void BMW_Init(struct BMWalker *walker, BMesh *bm, int type, int searchmask);
 void *BMW_Begin(BMWalker *walker, void *start);
 void *BMW_Step(struct BMWalker *walker);
 void BMW_End(struct BMWalker *walker);
@@ -38,12 +40,24 @@
 BMW_End(&walker);
 */
 
+/*walk over connected geometry.  can restrict to a search flag,
+  or not, it's optional.*/
 #define BMW_SHELL	0
+
+/*walk over an edge loop.  search flag doesn't do anything.*/
 #define BMW_LOOP	1
 /*#define BMW_RING	2
 #define BMW_UVISLANDS	3*/
+/*walk over an island of flagged faces.  note, that this doesn't work on
+  non-manifold geometry.  it might be better to rewrite this to extract
+  boundary info from the island walker, rather then directly walking
+  over the boundary.  raises an error if it encouters nonmanifold
+  geometry.*/
 #define BMW_ISLANDBOUND	2
+
+/*walk over all faces in an island of tool flagged faces.*/
 #define BMW_ISLAND	3
+
 #define BMW_MAXWALKERS	4
 
 #endif
\ No newline at end of file

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-03-16 02:55:42 UTC (rev 19305)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-03-16 09:41:33 UTC (rev 19306)
@@ -573,7 +573,7 @@
 	int isear, i=0;
 	
 	l = f->loopbase;
-	do{
+	do {
 		isear = 1;
 		
 		v1 = ((BMLoop*)(l->head.prev))->v;
@@ -586,9 +586,9 @@
 			               v3->head.eflag2, nvert))
 			isear = 0;
 
-		if(isear){
+		if(isear) {
 			angle = VecAngle3(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2]);
-			if(!bestear || ABS(angle-45.0f) < bestangle){
+			if(!bestear || ABS(angle-45.0f) < bestangle) {
 				bestear = l;
 				bestangle = ABS(45.0f-angle);
 			}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-03-16 02:55:42 UTC (rev 19305)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_walkers.c	2009-03-16 09:41:33 UTC (rev 19306)
@@ -382,7 +382,7 @@
 		BMW_reset(walker);
 		BMO_RaiseError(walker->bm, NULL,BMERR_WALKER_FAILED,
 			"Non-manifold vert"
-			"while searching region boundary");
+			" while searching region boundary");
 		return NULL;
 	}
 	

Modified: branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c	2009-03-16 02:55:42 UTC (rev 19305)
+++ branches/bmesh/blender/source/blender/bmesh/operators/extrudeops.c	2009-03-16 09:41:33 UTC (rev 19306)
@@ -23,7 +23,7 @@
 	BMLoop *l, *l2;
 	BMVert *verts[4], *v;
 	BMFace *f;
-	int rlen, found, delorig=0, i;
+	int rlen, found, delorig=0, i, reverse;
 
 	/*initialize our sub-operators*/
 	BMO_Init_Op(&dupeop, BMOP_DUPE);
@@ -86,6 +86,15 @@
 	
 	BMO_Exec_Op(bm, &dupeop);
 	if (delorig) BMO_Exec_Op(bm, &delop);
+	
+	/*if not delorig, reverse loops of original faces*/
+	if (!delorig) {
+		for (f=BMIter_New(&iter, bm, BM_FACES, NULL); f; f=BMIter_Step(&iter)) {
+			if (BMO_TestFlag(bm, f, EXT_INPUT)) {
+				BM_flip_normal(bm, f);
+			}
+		}
+	}
 
 	BMO_CopySlot(&dupeop, op, BMOP_DUPE_NEW, BMOP_EXFACE_MULTOUT);
 	e = BMO_IterNew(&siter, bm, &dupeop, BMOP_DUPE_BOUNDS_EDGEMAP);
@@ -95,21 +104,39 @@
 		newedge = BMO_IterMapVal(&siter);
 		newedge = *(BMEdge**)newedge;
 		if (!newedge) continue;
+		
+		if (newedge->loop->v == newedge->v1) {
+			verts[0] = e->v1;
+			verts[1] = e->v2;
+			verts[2] = newedge->v2;
+			verts[3] = newedge->v1;
+		} else {
+			verts[3] = e->v1;
+			verts[2] = e->v2;
+			verts[1] = newedge->v2;
+			verts[0] = newedge->v1;
+		}
 
-		verts[0] = e->v1;
-		verts[1] = e->v2;
-		verts[2] = newedge->v2;
-		verts[3] = newedge->v1;
-		
-		//not sure what to do about example face, pass NULL for now.
+		/*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)) {
+			if (l->e != e && l->e != newedge) continue;
 			l2 = l->radial.next->data;
 			
-			if (l2 && l2 != l) {
+			if (l2 == l) {
+				l2 = newedge->loop;
+				BM_Copy_Attributes(bm, bm, l2->f, l->f);
+
+				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 {
+				BM_Copy_Attributes(bm, bm, l2->f, l->f);
+
 				/*copy data*/
 				if (l2->v == l->v) {
 					BM_Copy_Attributes(bm, bm, l2, l);





More information about the Bf-blender-cvs mailing list