[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [36285] branches/bmesh/blender: =bmesh= fixed edge split modifier, and a bug in knifetool reported by letterrip.

Joseph Eagar joeedh at gmail.com
Sat Apr 23 01:37:58 CEST 2011


Revision: 36285
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=36285
Author:   joeedh
Date:     2011-04-22 23:37:58 +0000 (Fri, 22 Apr 2011)
Log Message:
-----------
=bmesh= fixed edge split modifier, and a bug in knifetool reported by letterrip.  also brought back beautify-fill.

Modified Paths:
--------------
    branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h
    branches/bmesh/blender/source/blender/blenlib/intern/math_geom.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/createops.c
    branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
    branches/bmesh/blender/source/blender/editors/mesh/bmesh_tools.c
    branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_edgesplit.c

Modified: branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py
===================================================================
--- branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/release/scripts/startup/bl_ui/properties_data_modifier.py	2011-04-22 23:37:58 UTC (rev 36285)
@@ -45,7 +45,11 @@
     # the mt.type enum is (ab)used for a lookup on function names
     # ...to avoid lengthy if statements
     # so each type must have a function here.
-
+	
+    def NGONINTERP(self, layout, ob, md):
+        split = layout.split()
+        split.prop(md, "resolution")
+        
     def ARMATURE(self, layout, ob, md):
         split = layout.split()
 

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-04-22 23:37:58 UTC (rev 36285)
@@ -2748,7 +2748,10 @@
 void CDDM_set_mvert(DerivedMesh *dm, MVert *mvert)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
-
+	
+	if (!CustomData_has_layer(&dm->vertData, CD_MVERT))
+		CustomData_add_layer(&dm->vertData, CD_MVERT, CD_ASSIGN, mvert, dm->numVertData);
+				
 	cddm->mvert = mvert;
 }
 
@@ -2756,6 +2759,9 @@
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
 
+	if (!CustomData_has_layer(&dm->edgeData, CD_MEDGE))
+		CustomData_add_layer(&dm->edgeData, CD_MEDGE, CD_ASSIGN, medge, dm->numEdgeData);
+
 	cddm->medge = medge;
 }
 
@@ -2763,5 +2769,8 @@
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh*)dm;
 
+	if (!CustomData_has_layer(&dm->faceData, CD_MFACE))
+		CustomData_add_layer(&dm->faceData, CD_MFACE, CD_ASSIGN, mface, dm->numFaceData);
+
 	cddm->mface = mface;
 }

Modified: branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h	2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/blenlib/BLI_math_geom.h	2011-04-22 23:37:58 UTC (rev 36285)
@@ -70,6 +70,8 @@
 
 /* TODO int return value consistency */
 
+ int is_quad_convex_v3(float *v1, float *v2, float *v3, float *v4);
+ 
 /* line-line */
 #define ISECT_LINE_LINE_COLINEAR	-1
 #define ISECT_LINE_LINE_NONE		 0

Modified: branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c
===================================================================
--- branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c	2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/blenlib/intern/math_geom.c	2011-04-22 23:37:58 UTC (rev 36285)
@@ -2678,3 +2678,39 @@
 
 	return contrib;
 }
+
+/* evaluate if entire quad is a proper convex quad */
+ int is_quad_convex_v3(float *v1, float *v2, float *v3, float *v4)
+ {
+	float nor[3], nor1[3], nor2[3], vec[4][2];
+	
+	/* define projection, do both trias apart, quad is undefined! */
+	normal_tri_v3( nor1,v1, v2, v3);
+	normal_tri_v3( nor2,v1, v3, v4);
+	nor[0]= ABS(nor1[0]) + ABS(nor2[0]);
+	nor[1]= ABS(nor1[1]) + ABS(nor2[1]);
+	nor[2]= ABS(nor1[2]) + ABS(nor2[2]);
+
+	if(nor[2] >= nor[0] && nor[2] >= nor[1]) {
+		vec[0][0]= v1[0]; vec[0][1]= v1[1];
+		vec[1][0]= v2[0]; vec[1][1]= v2[1];
+		vec[2][0]= v3[0]; vec[2][1]= v3[1];
+		vec[3][0]= v4[0]; vec[3][1]= v4[1];
+	}
+	else if(nor[1] >= nor[0] && nor[1]>= nor[2]) {
+		vec[0][0]= v1[0]; vec[0][1]= v1[2];
+		vec[1][0]= v2[0]; vec[1][1]= v2[2];
+		vec[2][0]= v3[0]; vec[2][1]= v3[2];
+		vec[3][0]= v4[0]; vec[3][1]= v4[2];
+	}
+	else {
+		vec[0][0]= v1[1]; vec[0][1]= v1[2];
+		vec[1][0]= v2[1]; vec[1][1]= v2[2];
+		vec[2][0]= v3[1]; vec[2][1]= v3[2];
+		vec[3][0]= v4[1]; vec[3][1]= v4[2];
+	}
+	
+	/* linetests, the 2 diagonals have to instersect to be convex */
+	if( isect_line_line_v2(vec[0], vec[2], vec[1], vec[3]) > 0 ) return 1;
+	return 0;
+}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_opdefines.c	2011-04-22 23:37:58 UTC (rev 36285)
@@ -940,6 +940,21 @@
 	BMOP_UNTAN_MULTIRES
 };
 
+/*
+  Beautify Fill
+
+  Makes triangle a bit nicer
+ */
+BMOpDefine def_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 */
+	 {0} /*null-terminating sentinel*/},
+	bmesh_beautify_fill_exec,
+	BMOP_UNTAN_MULTIRES
+};
+
 BMOpDefine *opdefines[] = {
 	&def_splitop,
 	&def_dupeop,
@@ -1000,6 +1015,7 @@
 	&def_create_cube,
 	&def_join_triangles,
 	&def_bevel,
+	&def_beautify_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 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_operators_private.h	2011-04-22 23:37:58 UTC (rev 36285)
@@ -69,5 +69,6 @@
 void bmesh_create_cube_exec(BMesh *bm, BMOperator *op);
 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);
 
 #endif

Modified: branches/bmesh/blender/source/blender/bmesh/operators/createops.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/createops.c	2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/operators/createops.c	2011-04-22 23:37:58 UTC (rev 36285)
@@ -964,42 +964,6 @@
 	MEM_freeN(vdata);
 }
 
-/* evaluate if entire quad is a proper convex quad */
-static int convex(float *v1, float *v2, float *v3, float *v4)
-{
-	float nor[3], nor1[3], nor2[3], vec[4][2];
-	
-	/* define projection, do both trias apart, quad is undefined! */
-	normal_tri_v3( nor1,v1, v2, v3);
-	normal_tri_v3( nor2,v1, v3, v4);
-	nor[0]= ABS(nor1[0]) + ABS(nor2[0]);
-	nor[1]= ABS(nor1[1]) + ABS(nor2[1]);
-	nor[2]= ABS(nor1[2]) + ABS(nor2[2]);
-
-	if(nor[2] >= nor[0] && nor[2] >= nor[1]) {
-		vec[0][0]= v1[0]; vec[0][1]= v1[1];
-		vec[1][0]= v2[0]; vec[1][1]= v2[1];
-		vec[2][0]= v3[0]; vec[2][1]= v3[1];
-		vec[3][0]= v4[0]; vec[3][1]= v4[1];
-	}
-	else if(nor[1] >= nor[0] && nor[1]>= nor[2]) {
-		vec[0][0]= v1[0]; vec[0][1]= v1[2];
-		vec[1][0]= v2[0]; vec[1][1]= v2[2];
-		vec[2][0]= v3[0]; vec[2][1]= v3[2];
-		vec[3][0]= v4[0]; vec[3][1]= v4[2];
-	}
-	else {
-		vec[0][0]= v1[1]; vec[0][1]= v1[2];
-		vec[1][0]= v2[1]; vec[1][1]= v2[2];
-		vec[2][0]= v3[1]; vec[2][1]= v3[2];
-		vec[3][0]= v4[1]; vec[3][1]= v4[2];
-	}
-	
-	/* linetests, the 2 diagonals have to instersect to be convex */
-	if( isect_line_line_v2(vec[0], vec[2], vec[1], vec[3]) > 0 ) return 1;
-	return 0;
-}
-
 BMEdge *edge_next(BMesh *bm, BMEdge *e)
 {
 	BMIter iter;
@@ -1257,22 +1221,22 @@
 		f = NULL;
 
 		/* the order of vertices can be anything, 6 cases to check */
-		if( convex(verts[0]->co, verts[1]->co, verts[2]->co, verts[3]->co) ) {
+		if( is_quad_convex_v3(verts[0]->co, verts[1]->co, verts[2]->co, verts[3]->co) ) {
 			f= BM_Make_QuadTri(bm, verts[0], verts[1], verts[2], verts[3], NULL, 1);
 		}
-		else if( convex(verts[0]->co, verts[2]->co, verts[3]->co, verts[1]->co) ) {
+		else if( is_quad_convex_v3(verts[0]->co, verts[2]->co, verts[3]->co, verts[1]->co) ) {
 			f= BM_Make_QuadTri(bm, verts[0], verts[2], verts[3], verts[1], NULL, 1);
 		}
-		else if( convex(verts[0]->co, verts[2]->co, verts[1]->co, verts[3]->co) ) {
+		else if( is_quad_convex_v3(verts[0]->co, verts[2]->co, verts[1]->co, verts[3]->co) ) {
 			f= BM_Make_QuadTri(bm, verts[0], verts[2], verts[1], verts[3], NULL, 1);
 		}
-		else if( convex(verts[0]->co, verts[1]->co, verts[3]->co, verts[2]->co) ) {
+		else if( is_quad_convex_v3(verts[0]->co, verts[1]->co, verts[3]->co, verts[2]->co) ) {
 			f= BM_Make_QuadTri(bm, verts[0], verts[1], verts[3], verts[2], NULL, 1);
 		}
-		else if( convex(verts[0]->co, verts[3]->co, verts[2]->co, verts[1]->co) ) {
+		else if( is_quad_convex_v3(verts[0]->co, verts[3]->co, verts[2]->co, verts[1]->co) ) {
 			f= BM_Make_QuadTri(bm, verts[0], verts[3], verts[2], verts[1], NULL, 1);
 		}
-		else if( convex(verts[0]->co, verts[3]->co, verts[1]->co, verts[2]->co) ) {
+		else if( is_quad_convex_v3(verts[0]->co, verts[3]->co, verts[1]->co, verts[2]->co) ) {
 			f= BM_Make_QuadTri(bm, verts[0], verts[3], verts[1], verts[2], NULL, 1);
 		}
 		else {

Modified: branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c	2011-04-22 16:47:17 UTC (rev 36284)
+++ branches/bmesh/blender/source/blender/bmesh/operators/triangulateop.c	2011-04-22 23:37:58 UTC (rev 36285)
@@ -14,6 +14,10 @@
 #define EDGE_NEW	1
 #define FACE_NEW	1
 
+#define ELE_NEW		1
+#define FACE_MARK	2
+#define EDGE_MARK	4
+
 void triangulate_exec(BMesh *bm, BMOperator *op)
 {
 	BMOIter siter;
@@ -54,3 +58,73 @@
 	BLI_array_free(projectverts);
 	BLI_array_free(newfaces);
 }
+
+void bmesh_beautify_fill_exec(BMesh *bm, BMOperator *op)
+{
+	BMOIter siter;
+	BMIter iter;
+	BMFace *f;
+	BMEdge *e;
+	int stop=0;
+	
+	BMO_Flag_Buffer(bm, op, "constrain_edges", EDGE_MARK, BM_EDGE);
+	
+	BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
+		if (f->len == 3)
+			BMO_SetFlag(bm, f, FACE_MARK);
+	}
+
+	while (!stop) {
+		stop = 1;
+		
+		BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+			BMVert *v1, *v2, *v3, *v4, *d1, *d2;
+			float len1, len2, len3, len4, len5, len6, opp1, opp2, fac1, fac2;
+			int ok;
+			
+			if (BM_Edge_FaceCount(e) != 2 || BMO_TestFlag(bm, e, EDGE_MARK))
+				continue;
+			if (!BMO_TestFlag(bm, e->l->f, FACE_MARK) || !BMO_TestFlag(bm, e->l->radial_next->f, FACE_MARK))
+				continue;
+			
+			v1 = e->l->prev->v;
+			v2 = e->l->v;
+			v3 = e->l->radial_next->prev->v;
+			v4 = e->l->next->v;
+			

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list