[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