[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18618] branches/bmesh/blender/source/ blender: tesselator/triangulator improvements, it now works a lot better, though still not perfectly

Joseph Eagar joeedh at gmail.com
Thu Jan 22 08:06:52 CET 2009


Revision: 18618
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18618
Author:   joeedh
Date:     2009-01-22 08:06:25 +0100 (Thu, 22 Jan 2009)

Log Message:
-----------
tesselator/triangulator improvements, it now works a lot better, though still not perfectly

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2009-01-22 07:06:25 UTC (rev 18618)
@@ -49,6 +49,22 @@
 	printf("BM modelling error!");
 }
 
+#ifndef bmesh_api_setindex
+/*NOTE: ensure different parts of the API do not conflict
+  on using this!*/
+void bmesh_api_setindex(BMesh *bm, BMHeader *head, int i)
+{
+	head->flags[bm->stackdepth-1].pflag = i;
+}
+#endif
+
+#ifndef bmesh_api_getindex
+int bmesh_api_getindex(BMesh *bm, BMHeader *head)
+{
+	return head->flags[bm->stackdepth-1].pflag;
+}
+#endif
+
 /*
  * BMESH SET SYSFLAG
  *

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-01-22 07:06:25 UTC (rev 18618)
@@ -61,11 +61,11 @@
  * projected to the x/y plane
  *
 */
-static int convexangle(float *__v1, float *__v2, float *__v3)
+static int convexangle(float *v1t, float *v2t, float *v3t)
 {
 	float v1[3], v3[3], n[3];
-	VecSubf(v1, __v1, __v2);
-	VecSubf(v3, __v3, __v2);
+	VecSubf(v1, v1t, v2t);
+	VecSubf(v3, v3t, v2t);
 
 	Normalize(v1);
 	Normalize(v3);
@@ -224,15 +224,17 @@
 {
 
 	float up[3] = {0.0,0.0,1.0}, axis[3], angle, q[4];
+	float mat[3][3];
 	int i;
 
 	Crossf(axis, up, normal);
 	angle = VecAngle2(normal, up);
 	
 	AxisAngleToQuat(q, axis, angle);
-	
+	QuatToMat3(q, mat);
+
 	for(i = 0;  i < nverts;  i++)
-		QuatMulVecf(q, verts[i]);
+		Mat3MulVecfl(mat, verts[i]);
 }
 
 /*
@@ -316,7 +318,6 @@
 	float angle, bestangle = 180.0f;
 	int isear;
 	
-
 	l = f->loopbase;
 	do{
 		isear = 1;
@@ -324,17 +325,21 @@
 		v1 = ((BMLoop*)(l->head.prev))->v;
 		v2 = l->v;
 		v3 = ((BMLoop*)(l->head.next))->v;
-		if(convexangle(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2])){
+
+		if (BM_Edge_Exist(v1, v3)) isear = 0;
+
+		if(isear && convexangle(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2])){
 			for(l2 = ((BMLoop*)(l->head.next->next)); l2 != ((BMLoop*)(l->head.prev)); l2 = ((BMLoop*)(l2->head.next)) ){
 				if(point_in_triangle(verts[v1->head.eflag2], verts[v2->head.eflag2],verts[v3->head.eflag2], l2->v->co)){
 					isear = 0;
 					break;
 				}
 			}
-		}
+		} else isear = 0;
+
 		if(isear){
 			angle = VecAngle3(verts[v1->head.eflag2], verts[v2->head.eflag2], verts[v3->head.eflag2]);
-			if((!bestear) && angle < bestangle){
+			if(!bestear || angle < bestangle){
 				bestear = l;
 				bestangle = angle;
 			}
@@ -379,14 +384,16 @@
 		l = (BMLoop*)(l->head.next);
 	}while(l != f->loopbase);
 	
+	bmesh_update_face_normal(bm, f, projectverts);
+
 	compute_poly_plane(projectverts, i);
 	poly_rotate_plane(f->no, projectverts, i);
 
 	done = 0;
-	while(!done){
+	while(!done && f->len > 3){
 		done = 1;
 		l = find_ear(f, projectverts);
-		if(l && l->head.prev != l->head.next && f->len > 3){
+		if(l) {
 			done = 0;
 			f = bmesh_sfme(bm, f, ((BMLoop*)(l->head.prev))->v, ((BMLoop*)(l->head.next))->v, &newl);
 			BMO_SetFlag(bm, newl->e, newedgeflag);
@@ -397,7 +404,7 @@
 	if (f->len > 3){
 		l = f->loopbase;
 		while (l->f->len > 3){
-			nextloop = ((BMLoop*)(l->head.next->next->next));
+			nextloop = ((BMLoop*)(l->head.next->next));
 			bmesh_sfme(bm, l->f, l->v,nextloop->v, &newl);
 			BMO_SetFlag(bm, newl->e, newedgeflag);
 			BMO_SetFlag(bm, f, newfaceflag);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h	2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_private.h	2009-01-22 07:06:25 UTC (rev 18618)
@@ -58,6 +58,17 @@
 void bmesh_clear_sysflag(struct BMHeader *element, int flag);
 int bmesh_test_sysflag(struct BMHeader *element, int flag);
 
+/*NOTE: ensure different parts of the API do not conflict
+  on using this!*/
+/*used to access the index member of the current flag layer.
+  actual functions are only defined if the below macro versions
+  are not.*/
+void bmesh_api_setindex(BMesh *bm, BMHeader *head, int i);
+int bmesh_api_getindex(BMesh *bm, BMHeader *head);
+
+#define bmesh_api_setindex(bm, head, i) ((head)->flags[bm->stackdepth-1].pflag = i)
+#define bmesh_api_getindex(bm, head) ((head)->flags[bm->stackdepth-1].pflag)
+
 /*Polygon Utilities ? FIXME... where do these each go?*/
 /*newedgeflag sets a flag layer flag, obviously not the header flag.*/
 void BM_Triangulate_Face(BMesh *bm, BMFace *f, float (*projectverts)[3], int newedgeflag, int newfaceflag);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-01-22 07:06:25 UTC (rev 18618)
@@ -116,7 +116,6 @@
 	return 0;
 }
 
-
 /*
  * BMESH VERTS IN EDGE
  *

Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c	2009-01-22 04:22:26 UTC (rev 18617)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh_mods.c	2009-01-22 07:06:25 UTC (rev 18618)
@@ -3380,6 +3380,9 @@
 	MEM_freeN(em2);	
 	
 	BM_Free_Mesh(bm);
+
+	BIF_undo_push("BMesh Test");
+
 	WM_event_add_notifier(C, NC_OBJECT|ND_DRAW|ND_TRANSFORM|ND_GEOM_SELECT, obedit);
 	return OPERATOR_FINISHED;
 }





More information about the Bf-blender-cvs mailing list