[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19265] branches/bmesh/blender/source/ blender: the make ngon function's overlap test needed some work, the API function

Joseph Eagar joeedh at gmail.com
Thu Mar 12 04:55:54 CET 2009


Revision: 19265
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19265
Author:   joeedh
Date:     2009-03-12 04:55:53 +0100 (Thu, 12 Mar 2009)

Log Message:
-----------
the make ngon function's overlap test needed some work, the API function
that does that needed to be split in two. this made dissolve faces sometimes
not work.

also added some api functions to recalculate normals for verts, edges and
faces.  and added a new flag, BM_NONORMCALC, to prevent this from happening
on individual fgon faces after they are tesselated.  and made dissolve faces
happen on fkey in all the selection modes, not just face select.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
    branches/bmesh/blender/source/blender/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    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/intern/editmesh_to_bmesh.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_add.c
    branches/bmesh/blender/source/blender/editors/mesh/editmesh_lib.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/customdata.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -257,6 +257,7 @@
 	}
 
 	*tf = *(MTFace *)sources[0];
+
 	for(j = 0; j < 4; ++j) {
 		tf->uv[j][0] = uv[j][0];
 		tf->uv[j][1] = uv[j][1];

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2009-03-12 03:55:53 UTC (rev 19265)
@@ -77,6 +77,7 @@
 #define BM_SHARP	(1<<4)
 #define BM_SMOOTH	(1<<5)
 #define BM_ACTIVE	(1<<6)
+#define BM_NONORMCALC	(1<<7)
 
 typedef struct BMHeader {
 	struct BMHeader *next, *prev;
@@ -196,6 +197,9 @@
 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_Face_UpdateNormal(BMesh *bm, BMFace *f);
+void BM_Edge_UpdateNormals(BMesh *bm, BMEdge *e);
+void BM_Vert_UpdateNormal(BMesh *bm, BMVert *v);
 
 /*dissolves vert surrounded by faces*/
 int BM_Dissolve_Disk(BMesh *bm, BMVert *v);

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh_queries.h	2009-03-12 03:55:53 UTC (rev 19265)
@@ -30,6 +30,7 @@
 int BM_Face_Sharededges(struct BMFace *f1, struct BMFace *f2);
 float BM_Face_Angle(struct BMesh *bm, struct BMEdge *e);
 int BM_Exist_Face_Overlaps(struct BMesh *bm, struct BMVert **varr, int len, struct BMFace **existface);
+int BM_Face_Exists(BMesh *bm, BMVert **varr, int len, BMFace **existface);
 int BM_Edge_Share_Faces(struct BMEdge *e1, struct BMEdge *e2);
 int BM_Validate_Face(BMesh *bm, BMFace *face, FILE *err);
 int BM_FacesAroundEdge(BMEdge *e);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_construct.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -245,7 +245,7 @@
 			return NULL;
 		}
 
-		overlap = BM_Exist_Face_Overlaps(bm, verts, len, &f);
+		overlap = BM_Face_Exists(bm, verts, len, &f);
 		
 		/*clear flags*/
 		for(i = 0; i < len; i++){

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -197,6 +197,7 @@
 	
 	/*calculate all face normals*/
 	for(f = BMIter_New(&faces, bm, BM_FACES, bm ); f; f = BMIter_Step(&faces)){
+		if (f->head.flag & BM_NONORMCALC) continue;
 		bmesh_update_face_normal(bm, f, projectverts);		
 	}
 	

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mods.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -227,7 +227,11 @@
 		bmesh_loop_reverse(bm, f2);
 	}
 
-	return bmesh_jfke(bm, f1, f2, jed);
+	f1 = bmesh_jfke(bm, f1, f2, jed);
+	
+	if (calcnorm && f1) BM_Face_UpdateNormal(bm, f1);
+	
+	return f1;
 }
 
 /*connects two verts together, automatically (if very naively) finding the
@@ -278,18 +282,11 @@
 	
 	BM_Copy_Attributes(bm, bm, f, nf);
 
-	/*
-	nf->flag = f->flag;
-	if (example->flag & SELECT) f->flag |= BM_SELECT;
-	nf->h = f->h;
-	nf->mat_nr = f->mat_nr;
-	if (nl && example) {
-		(*nl)->e->flag = example->flag;
-		(*nl)->e->h = example->h;
-		(*nl)->e->crease = example->crease;
-		(*nl)->e->bweight = example->bweight;
+	if (calcnorm && nf) {
+		BM_Face_UpdateNormal(bm, nf);
+		BM_Face_UpdateNormal(bm, f);
 	}
-	*/
+
 	return nf;
 }
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -287,6 +287,56 @@
  *
 */
 
+void BM_Face_UpdateNormal(BMesh *bm, BMFace *f)
+{
+	float projverts[12][3];
+	float (*proj)[3] = f->len < 12 ? projverts : MEM_mallocN(sizeof(float)*f->len*3, "projvertsn");
+	BMLoop *l = f->loopbase;
+	int i=0;
+
+	if (f->len < 3) return;
+	
+	do {
+		VECCOPY(proj[i], l->v->co);
+		i += 1;
+	} while (l != f->loopbase);
+
+	bmesh_update_face_normal(bm, f, proj);
+
+	if (projverts != proj) MEM_freeN(proj);
+}
+
+void BM_Edge_UpdateNormals(BMesh *bm, BMEdge *e)
+{
+	BMIter *iter;
+	BMFace *f;
+	
+	f = BMIter_New(&iter, bm, BM_FACES_OF_EDGE, e);
+	for (; f; f=BMIter_Step(&iter)) {
+		BM_Face_UpdateNormal(bm, f);
+	}
+
+	BM_Vert_UpdateNormal(bm, e->v1);
+	BM_Vert_UpdateNormal(bm, e->v2);
+}
+
+void BM_Vert_UpdateNormal(BMesh *bm, BMVert *v)
+{
+	BMIter iter;
+	BMFace *f;
+	float norm[3] = {0.0f, 0.0f, 0.0f};
+	int len=0;
+
+	f = BMIter_New(&iter, bm, BM_FACES_OF_VERT, v);
+	for (; f; f=BMIter_Step(&iter), len++) {
+		VecAddf(norm, f->no, norm);
+	}
+
+	if (!len) return;
+
+	VecMulf(norm, 1.0f/(int)len);
+}
+
 void bmesh_update_face_normal(BMesh *bm, BMFace *f, float (*projectverts)[3])
 {
 	BMLoop *l;
@@ -529,6 +579,8 @@
 			f = BM_Split_Face(bm, l->f, ((BMLoop*)(l->head.prev))->v, 
 			                  ((BMLoop*)(l->head.next))->v, 
 			                  &newl, NULL, 0);
+			VECCOPY(f->no, l->f->no);
+
 			if (!f) {
 				printf("yeek! triangulator failed to split face!\n");
 				break;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_queries.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -501,8 +501,7 @@
  * BMESH EXIST FACE OVERLAPS
  *
  * Given a set of vertices (varr), find out if
- * a face exists with those vertices already, or
- * if those vertices overlap an existing face.
+ * all those vertices overlap an existing face.
  *
  * Returns:
  * 0 for no overlap
@@ -511,21 +510,20 @@
  *
 */
 
-int BM_Exist_Face_Overlaps(BMesh *bm, BMVert **varr, int len, BMFace **existface)
+int BM_Exist_Face_Overlaps(BMesh *bm, BMVert **varr, int len, BMFace **overlapface)
 {
 	BMIter vertfaces;
 	BMFace *f;
 	int i, amount;
 
-	*existface = NULL;
+	if (overlapface) *overlapface = NULL;
 
 	for(i=0; i < len; i++){
 		f = BMIter_New(&vertfaces, bm, BM_FACES_OF_VERT, varr[i] );
 		while(f){
 			amount = BM_Verts_In_Face(bm, f, varr, len);
 			if(amount >= len){
-				if((len == f->len) && existface)
-					*existface = f;
+				if (overlapface) *overlapface = f;
 				return 1;				
 			}
 			f = BMIter_Step(&vertfaces);
@@ -533,3 +531,39 @@
 	}
 	return 0;
 }
+
+/*
+ * BMESH FACE EXISTS
+ *
+ * Given a set of vertices (varr), find out if
+ * there is a face with exactly those vertices
+ * (and only those vertices).
+ *
+ * Returns:
+ * 0 for no face found
+ * 1 for face found
+ * 
+ *
+*/
+
+int BM_Face_Exists(BMesh *bm, BMVert **varr, int len, BMFace **existface)
+{
+	BMIter vertfaces;
+	BMFace *f;
+	int i, amount;
+
+	if (existface) *existface = NULL;
+
+	for(i=0; i < len; i++){
+		f = BMIter_New(&vertfaces, bm, BM_FACES_OF_VERT, varr[i] );
+		while(f){
+			amount = BM_Verts_In_Face(bm, f, varr, len);
+			if(amount == len && amount == f->len){
+				if (existface) *existface = f;
+				return 1;				
+			}
+			f = BMIter_Step(&vertfaces);
+		}
+	}
+	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-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_to_editmesh.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -256,7 +256,6 @@
 
 	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);
@@ -270,6 +269,11 @@
 	for (i=0; i<eout->len; i++) {
 		edge = ((BMEdge**)eout->data.buf)[i];
 		edge->head.flag |= BM_FGON;
+		face = BMIter_New(&iter, bmesh, BM_FACES_OF_EDGE, edge);
+		
+		for (; face; face=BMIter_Step(&iter)) {
+			face->head.flag |= BM_NONORMCALC;
+		}
 	}
 
 	BMO_Finish_Op(bmesh, &triop);

Modified: branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/bmesh/intern/editmesh_to_bmesh.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -195,6 +195,7 @@
 		f->head.flag = 0;
 		f->mat_nr = efa->mat_nr;
 		if(efa->f & SELECT) BM_Select_Face(bm, f, 1);
+		if (efa->flag & ME_SMOOTH) f->head.flag |= BM_SMOOTH;
 		if(efa->h) f->head.flag |= BM_HIDDEN;
 
 		if (efa == em->act_face) f->head.flag |= BM_ACTIVE;

Modified: branches/bmesh/blender/source/blender/editors/mesh/editmesh_add.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editmesh_add.c	2009-03-12 01:55:32 UTC (rev 19264)
+++ branches/bmesh/blender/source/blender/editors/mesh/editmesh_add.c	2009-03-12 03:55:53 UTC (rev 19265)
@@ -691,7 +691,7 @@
 	  bmeshafied eventually, but until then

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list