[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18604] branches/bmesh/blender/source/ blender: conversion code now uses triangulator for fgonafication of ngons.
Joseph Eagar
joeedh at gmail.com
Wed Jan 21 11:11:16 CET 2009
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. @@
More information about the Bf-blender-cvs
mailing list