[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