Revision: 18604 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18604 Author: joeedh Date: 2009-01-21 11:11:01 +0100 (Wed, 21 Jan 2009)
Log Message: ----------- conversion code now uses triangulator for fgonafication of ngons. also implemented a collapse vert operator (execute it with jkey). note to Briggs: BM_Collapse_Disk wasn't quite finished. . .I got it to mostly work, but it still needs work (and the way I had it handle 2- and 3-valence verts may be wrong). Also it can make 2-edged faces in certain situations. Need to work through the code some more. Modified Paths: -------------- branches/bmesh/blender/source/blender/bmesh/bmesh.h branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c Added Paths: ----------- branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c Removed Paths: ------------- branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h =================================================================== --- branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/bmesh.h 2009-01-21 10:11:01 UTC (rev 18604) @@ -191,6 +191,7 @@ struct BMVert *BM_Split_Edge(struct BMesh *bm, struct BMVert *v, struct BMEdge *e, struct BMEdge **ne, float percent, int calcnorm); struct BMVert *BM_Split_Edge_Multi(struct BMesh *bm, struct BMEdge *e, int numcuts); BMEdge *BM_Connect_Verts(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **nf); +void BM_Dissolve_Disk(BMesh *bm, BMVert *v); /*Interpolation*/ void BM_Data_Interp_From_Verts(struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMVert *v, float fac); Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h =================================================================== --- branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/bmesh_operators.h 2009-01-21 10:11:01 UTC (rev 18604) @@ -141,8 +141,8 @@ #define BMOP_TRIANGULATE 6 #define BMOP_TRIANG_FACEIN 0 -#define BMOP_NEW_EDGES 1 -#define BMOP_NEW_FACES 2 +#define BMOP_TRIANG_NEW_EDGES 1 +#define BMOP_TRIANG_NEW_FACES 2 #define BMOP_TRIANG_TOTSLOT 3 /*dissolve faces*/ @@ -151,8 +151,17 @@ #define BMOP_DISFACES_FACEIN 0 #define BMOP_DISFACES_TOTSLOT 1 +/*dissolve verts*/ +#define BMOP_DISSOLVE_VERTS 8 + +#define BMOP_DISVERTS_VERTIN 0 +#define BMOP_DISVERTS_TOTSLOT 1 + +#define BMOP_MAKE_FGONS 9 +#define BMOP_MAKE_FGONS_TOTSLOT 0 + /*keep this updated!*/ -#define BMOP_TOTAL_OPS 8 +#define BMOP_TOTAL_OPS 10 /*-------------------------------end operator defines-------------------------------*/ extern BMOpDefine *opdefines[]; Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c =================================================================== --- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c 2009-01-21 10:11:01 UTC (rev 18604) @@ -40,9 +40,10 @@ * 1 for success, 0 for failure. */ -void BM_Dissolve_Disk(BMesh *bm, BMVert *v){ +void BM_Dissolve_Disk(BMesh *bm, BMVert *v) { BMFace *f, *f2; BMEdge *e, *keepedge=NULL, *baseedge=NULL; + BMLoop *loop; int done, len; if(BM_Nonmanifold_Vert(bm, v)) return; @@ -50,6 +51,7 @@ if(v->edge){ /*v->edge we keep, what else?*/ e = v->edge; + len = 0; do{ e = bmesh_disk_nextedge(e,v); if(!(BM_Edge_Share_Faces(e, v->edge))){ @@ -57,9 +59,30 @@ baseedge = v->edge; break; } + len++; }while(e != v->edge); } + /*this code for handling 2 and 3-valence verts + may be totally bad.*/ + if (keepedge == NULL && len == 3) { + /*handle specific case for three-valence. solve it by + increasing valence to four. this may be hackish. . .*/ + loop = e->loop; + if (loop->v == v) loop = (BMLoop*) loop->head.next; + BM_Split_Face(bm, loop->f, v, loop->v, NULL, NULL, 0); + + BM_Dissolve_Disk(bm, v); + return; + } else if (keepedge == NULL && len == 2) { + /*handle two-valence*/ + f = v->edge->loop->f; + f2 = ((BMLoop*)v->edge->loop->radial.next->data)->f; + /*collapse the vertex*/ + BM_Collapse_Vert(bm, v->edge, v, 1.0, 0); + BM_Join_Faces(bm, f, f2, NULL, 0, 0); + } + if(keepedge){ done = 0; while(!done){ @@ -74,14 +97,18 @@ done = 0; break; } + e = bmesh_disk_nextedge(e, v); }while(e != v->edge); } /*get remaining two faces*/ f = v->edge->loop->f; - f2 = ((BMLoop*)f->loopbase->radial.next->data)->f; + f2 = ((BMLoop*)v->edge->loop->radial.next->data)->f; /*collapse the vertex*/ BM_Collapse_Vert(bm, baseedge, v, 1.0, 0); + + /*join two remaining faces*/ + BM_Join_Faces(bm, f, f2, NULL, 0, 0); } } Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c =================================================================== --- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c 2009-01-21 10:11:01 UTC (rev 18604) @@ -3,6 +3,20 @@ #include <stdio.h> +BMOpDefine def_makefgonsop = { + {0}, + bmesh_make_fgons_exec, + BMOP_MAKE_FGONS_TOTSLOT, + 0 +}; + +BMOpDefine def_dissolvevertsop = { + {BMOP_OPSLOT_PNT_BUF}, + dissolveverts_exec, + BMOP_DISVERTS_TOTSLOT, + 0 +}; + BMOpDefine def_dissolvefacesop = { {BMOP_OPSLOT_PNT_BUF}, dissolvefaces_exec, @@ -70,6 +84,8 @@ &def_subdop, &def_triangop, &def_dissolvefacesop, + &def_dissolvevertsop, + &def_makefgonsop, }; int bmesh_total_ops = (sizeof(opdefines) / sizeof(void*)); Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h =================================================================== --- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h 2009-01-21 10:11:01 UTC (rev 18604) @@ -15,5 +15,7 @@ void bmesh2edit_exec(BMesh *bmesh, BMOperator *op); void triangulate_exec(BMesh *bmesh, BMOperator *op); void dissolvefaces_exec(BMesh *bmesh, BMOperator *op); +void dissolveverts_exec(BMesh *bmesh, BMOperator *op); +void bmesh_make_fgons_exec(BMesh *bmesh, BMOperator *op); #endif Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c =================================================================== --- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c 2009-01-21 10:11:01 UTC (rev 18604) @@ -431,7 +431,7 @@ return 1; } l = (BMLoop*)(l->radial.next->data); - }while(l != f->loopbase); + }while(l != e1->loop); } return 0; } Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c =================================================================== --- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c 2009-01-21 10:11:01 UTC (rev 18604) @@ -224,6 +224,9 @@ bmeshface_to_editface(bm, em, f, evlist, numCol, numTex); MEM_freeN(evlist); + + EM_fgon_flags(em); + return em; } @@ -232,15 +235,52 @@ BMO_Set_Pnt(op, BMOP_TO_EDITMESH_EMOUT, bmesh_to_editmesh_intern(bmesh)); } +#define FACE_NGON 1 + +void bmesh_make_fgons_exec(BMesh *bmesh, BMOperator *op) +{ + BMOperator triop; + BMFace *face; + BMIter iter; + BMEdge *edge; + BMOpSlot *eout; + int i; + + BMO_Init_Op(&triop, BMOP_TRIANGULATE); + + /*HACK: I don't know if this'll conflict with other flags at all!*/ + for (face = BMIter_New(&iter, bmesh, BM_FACES, NULL); face; face=BMIter_Step(&iter)) { + if (face->len > 4) { + BMO_SetFlag(bmesh, face, FACE_NGON); + } + } + + BMO_Flag_To_Slot(bmesh, &triop, BMOP_TRIANG_FACEIN, FACE_NGON, BM_FACE); + BMO_Exec_Op(bmesh, &triop); + + eout = BMO_GetSlot(&triop, BMOP_TRIANG_NEW_EDGES); + for (i=0; i<eout->len; i++) { + edge = ((BMEdge**)eout->data.buf)[i]; + edge->head.flag |= BM_FGON; + } + + BMO_Finish_Op(bmesh, &triop); +} + EditMesh *bmesh_to_editmesh(BMesh *bmesh) { - BMOperator conv; + BMOperator conv, makefgon; EditMesh *em; + + /*first fgon-afy the mesh*/ + BMO_Init_Op(&makefgon, BMOP_MAKE_FGONS); + BMO_Exec_Op(bmesh, &makefgon); + BMO_Finish_Op(bmesh, &makefgon); BMO_Init_Op(&conv, BMOP_TO_EDITMESH); BMO_Exec_Op(bmesh, &conv); em = conv.slots[BMOP_TO_EDITMESH_EMOUT].data.p; BMO_Finish_Op(bmesh, &conv); - + return em; } \ No newline at end of file Deleted: branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c =================================================================== --- branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c 2009-01-21 08:15:48 UTC (rev 18603) +++ branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c 2009-01-21 10:11:01 UTC (rev 18604) @@ -1,26 +0,0 @@ -#include "MEM_guardedalloc.h" - -#include "BKE_utildefines.h" - -#include "bmesh.h" -#include "bmesh_private.h" -#include "BLI_arithb.h" - -#include <stdio.h> - -#define FACE_MARK 1 -void dissolvefaces_exec(BMesh *bmesh, BMOperator *op) -{ - BMOpSlot *finput; - BMFace *face; - float projectverts[400][3]; - void *projverts; - int i, count = 0; - - BMO_Flag_Buffer(bmesh, op, BMOP_DISFACES_FACEIN, FACE_MARK); - - /*TODO: need to discuss with Briggs how best to implement this, seems this would be - a great time to use the walker api, get it up to snuff. perhaps have a walker - that goes over inner vertices of a contiguously-flagged region? then you - could just use dissolve disk on them.*/ -} \ No newline at end of file Copied: branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c (from rev 18602, branches/bmesh/blender/source/blender/bmesh/operators/dissolvefacesop.c) =================================================================== --- branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c (rev 0) +++ branches/bmesh/blender/source/blender/bmesh/operators/dissolveops.c 2009-01-21 10:11:01 UTC (rev 18604) @@ -0,0 +1,50 @@ +#include "MEM_guardedalloc.h" + +#include "BKE_utildefines.h" + +#include "bmesh.h" +#include "bmesh_private.h" +#include "BLI_arithb.h" + +#include <stdio.h> + +#define FACE_MARK 1 +void dissolvefaces_exec(BMesh *bmesh, BMOperator *op) +{ + BMOpSlot *finput; + BMFace *face; + float projectverts[400][3]; + void *projverts; + int i, count = 0; + + BMO_Flag_Buffer(bmesh, op, BMOP_DISFACES_FACEIN, FACE_MARK); + + /*TODO: need to discuss with Briggs how best to implement this, seems this would be + a great time to use the walker api, get it up to snuff. perhaps have a walker + that goes over inner vertices of a contiguously-flagged region? then you + could just use dissolve disk on them.*/ +} + +void dissolveverts_exec(BMesh *bmesh, BMOperator *op) +{ + BMOpSlot *vinput; + BMVert *vert; + int i; + + vinput = BMO_GetSlot(op, BMOP_DISVERTS_VERTIN); + + /* + BMO_Flag_Buffer(bmesh, op, BMOP_DISVERTS_VERTIN, VERT_MARK); + + for (vert=BMIter_New(&iter, bmesh, BM_VERTS, NULL); vert; vert=BMIter_Step(&iter)) { @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs