[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36286] branches/bmesh/blender/source/ blender: =bmesh= brought back fill faces, alt-f

Joseph Eagar joeedh at gmail.com
Sat Apr 23 02:05:14 CEST 2011


Revision: 36286
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36286
Author:   joeedh
Date:     2011-04-23 00:05:13 +0000 (Sat, 23 Apr 2011)
Log Message:
-----------
=bmesh= brought back fill faces, alt-f

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenlib/intern/scanfill.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/operators/triangulateop.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c

Modified: branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c	2011-04-22 23:37:58 UTC (rev 36285)
+++ branches/bmesh/blender/source/blender/blenlib/intern/scanfill.c	2011-04-23 00:05:13 UTC (rev 36286)
@@ -869,7 +869,7 @@
 			if( compare_v3v3(v2, eve->co, COMPLIMIT)==0) {
 				float inner = angle_v3v3v3(v1, v2, eve->co);
 				
-				if (fabs(inner-M_PI) < 0.05 || fabs(inner) < 0.05) {
+				if (fabs(inner-M_PI) < FLT_EPSILON*200 || fabs(inner) < FLT_EPSILON*200) {
 					eve = eve->next;	
 					continue;
 				}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2011-04-22 23:37:58 UTC (rev 36285)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2011-04-23 00:05:13 UTC (rev 36286)
@@ -946,7 +946,7 @@
   Makes triangle a bit nicer
  */
 BMOpDefine def_beautify_fill = {
-	"beautify_fill",
+"beautify_fill",
 	{{BMOP_OPSLOT_ELEMENT_BUF, "faces"}, /* input faces */
 	 {BMOP_OPSLOT_ELEMENT_BUF, "constrain_edges"}, /* edges that can't be flipped */
 	 {BMOP_OPSLOT_ELEMENT_BUF, "geomout"}, /* new flipped faces and edges */
@@ -955,6 +955,20 @@
 	BMOP_UNTAN_MULTIRES
 };
 
+/*
+  Triangle Fill 
+
+  Fill edges with triangles
+ */
+BMOpDefine def_triangle_fill = {
+	"triangle_fill",
+	{{BMOP_OPSLOT_ELEMENT_BUF, "edges"}, /* input edges */
+	 {BMOP_OPSLOT_ELEMENT_BUF, "geomout"}, /* new faces and edges */
+	 {0} /*null-terminating sentinel*/},
+	bmesh_triangle_fill_exec,
+	BMOP_UNTAN_MULTIRES
+};
+
 BMOpDefine *opdefines[] = {
 	&def_splitop,
 	&def_dupeop,
@@ -1016,6 +1030,7 @@
 	&def_join_triangles,
 	&def_bevel,
 	&def_beautify_fill,
+	&def_triangle_fill,
 };
 
 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	2011-04-22 23:37:58 UTC (rev 36285)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2011-04-23 00:05:13 UTC (rev 36286)
@@ -70,5 +70,6 @@
 void bmesh_jointriangles_exec(BMesh *bm, BMOperator *op);
 void bmesh_bevel_exec(BMesh *bm, BMOperator *op);
 void bmesh_beautify_fill_exec(BMesh *bm, BMOperator *op);
+void bmesh_triangle_fill_exec(BMesh *bm, BMOperator *op);
 
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c	2011-04-22 23:37:58 UTC (rev 36285)
+++ branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c	2011-04-23 00:05:13 UTC (rev 36286)
@@ -1,3 +1,7 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include "MEM_guardedalloc.h"
 
 #include "BKE_utildefines.h"
@@ -2,10 +6,10 @@
 
-#include "bmesh.h"
-#include "bmesh_private.h"
+#include "BLI_scanfill.h"
 #include "BLI_math.h"
 #include "BLI_array.h"
+#include "BLI_editVert.h"
+#include "BLI_smallhash.h"
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
+#include "bmesh.h"
+#include "bmesh_private.h"
 
@@ -128,3 +132,65 @@
 	
 	BMO_Flag_To_Slot(bm, op, "geomout", ELE_NEW, BM_EDGE|BM_FACE);
 }
+
+void bmesh_triangle_fill_exec(BMesh *bm, BMOperator *op)
+{
+	BMOIter siter;
+	BMEdge *e;
+	BMOperator bmop;
+	EditEdge *eed;
+	EditVert *eve, *v1, *v2;
+	EditFace *efa;
+	SmallHash hash;
+
+	BLI_smallhash_init(&hash);
+	
+	BLI_begin_edgefill();
+	
+	BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+		BMO_SetFlag(bm, e, EDGE_MARK);
+		
+		if (!BLI_smallhash_haskey(&hash, (uintptr_t)e->v1)) {
+			eve = BLI_addfillvert(e->v1->co);
+			eve->tmp.p = e->v1;
+			BLI_smallhash_insert(&hash, (uintptr_t)e->v1, eve);
+		}
+		
+		if (!BLI_smallhash_haskey(&hash, (uintptr_t)e->v2)) {
+			eve = BLI_addfillvert(e->v2->co);
+			eve->tmp.p = e->v2;
+			BLI_smallhash_insert(&hash, (uintptr_t)e->v2, eve);
+		}
+		
+		v1 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v1);
+		v2 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v2);
+		eed = BLI_addfilledge(v1, v2);
+		eed->tmp.p = e;
+	}
+	
+	BLI_edgefill(0);
+	
+	for (efa=fillfacebase.first; efa; efa=efa->next) {
+		BMFace *f = BM_Make_QuadTri(bm, efa->v1->tmp.p, efa->v2->tmp.p, efa->v3->tmp.p, NULL, NULL, 1);
+		BMLoop *l;
+		BMIter liter;
+		
+		BMO_SetFlag(bm, f, ELE_NEW);
+		BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+			if (!BMO_TestFlag(bm, l->e, EDGE_MARK)) {
+				BMO_SetFlag(bm, l->e, ELE_NEW);
+			}
+		}
+	}
+	
+	BLI_end_edgefill();
+	BLI_smallhash_release(&hash);
+	
+	/*clean up fill*/
+	BMO_InitOpf(bm, &bmop, "beautify_fill faces=%ff constrain_edges=%fe", ELE_NEW, EDGE_MARK);
+	BMO_Exec_Op(bm, &bmop);
+	BMO_Flag_Buffer(bm, &bmop, "geomout", ELE_NEW, BM_FACE|BM_EDGE);
+	BMO_Finish_Op(bm, &bmop);
+	
+	BMO_Flag_To_Slot(bm, op, "geomout", ELE_NEW, BM_EDGE|BM_FACE);
+}

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-04-22 23:37:58 UTC (rev 36285)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c	2011-04-23 00:05:13 UTC (rev 36286)
@@ -3855,17 +3855,24 @@
 
 static int fill_mesh_exec(bContext *C, wmOperator *op)
 {
-#if 0
 	Object *obedit= CTX_data_edit_object(C);
-	EditMesh *em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
-
-	fill_mesh(em);
-
-	BKE_mesh_end_editmesh(obedit->data, em);
-
+	BMEditMesh *em= ((Mesh *)obedit->data)->edit_btmesh;
+	BMOperator bmop;
+	
+	if (!EDBM_InitOpf(em, &bmop, op, "triangle_fill edges=%he", BM_SELECT))
+		return OPERATOR_CANCELLED;
+	
+	BMO_Exec_Op(em->bm, &bmop);
+	
+	/*select new geometry*/
+	BMO_HeaderFlag_Buffer(em->bm, &bmop, "geomout", BM_SELECT, BM_FACE|BM_EDGE);
+	
+	if (!EDBM_FinishOp(em, &bmop, op, 1))
+		return OPERATOR_CANCELLED;
+	
 	DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
 	WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
-#endif
+	
 	return OPERATOR_FINISHED;
 
 }
@@ -3894,6 +3901,7 @@
 
 	DAG_id_tag_update(obedit->data, OB_RECALC_DATA);
 	WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+	
 	return OPERATOR_FINISHED;
 }
 




More information about the Bf-blender-cvs mailing list