[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44505] trunk/blender/source/blender/bmesh : fix [#30374] Can't Fill Triangular Face

Campbell Barton ideasman42 at gmail.com
Tue Feb 28 08:19:30 CET 2012


Revision: 44505
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44505
Author:   campbellbarton
Date:     2012-02-28 07:19:28 +0000 (Tue, 28 Feb 2012)
Log Message:
-----------
fix [#30374] Can't Fill Triangular Face

the problem was a triangle couldnt be made when there was a quad that used 3 of the verts.

* now check if overlapping face has same length as the one to be created.
* an unrelated fix - the output of a triangle was not being flagged by the bmesh_contextual_create operator.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/bmesh_queries.h
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
    trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
    trunk/blender/source/blender/bmesh/operators/bmo_create.c

Modified: trunk/blender/source/blender/bmesh/bmesh_queries.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_queries.h	2012-02-28 05:50:02 UTC (rev 44504)
+++ trunk/blender/source/blender/bmesh/bmesh_queries.h	2012-02-28 07:19:28 UTC (rev 44505)
@@ -95,7 +95,8 @@
 float BM_vert_edge_angle(struct BMesh *bm, struct BMVert *v);
 
 /* checks overlapping of existing faces with the verts in varr. */
-int BM_face_exists_overlap(struct BMesh *bm, struct BMVert **varr, int len, struct BMFace **existface);
+int BM_face_exists_overlap(struct BMesh *bm, struct BMVert **varr, int len, struct BMFace **r_existface,
+                           const short do_partial);
 
 /* checks if many existing faces overlap the faces defined by varr */
 int BM_face_exists_multi(BMesh *bm, struct BMVert **varr, struct BMEdge **earr, int len);

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-02-28 05:50:02 UTC (rev 44504)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-02-28 07:19:28 UTC (rev 44505)
@@ -93,10 +93,10 @@
 	if (nodouble) {
 		/* check if face exists or overlaps */
 		if (len == 4) {
-			overlap = BM_face_exists_overlap(bm, verts, len, &f);
+			overlap = BM_face_exists_overlap(bm, verts, len, &f, FALSE);
 		}
 		else {
-			overlap = BM_face_exists_overlap(bm, verts, len, &f);
+			overlap = BM_face_exists_overlap(bm, verts, len, &f, FALSE);
 		}
 	}
 

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_queries.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-02-28 05:50:02 UTC (rev 44504)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_queries.c	2012-02-28 07:19:28 UTC (rev 44505)
@@ -642,26 +642,31 @@
  *
  *
  */
-
-int BM_face_exists_overlap(BMesh *bm, BMVert **varr, int len, BMFace **overlapface)
+int BM_face_exists_overlap(BMesh *bm, BMVert **varr, int len, BMFace **r_overlapface,
+                           const short do_partial)
 {
 	BMIter vertfaces;
 	BMFace *f;
 	int i, amount;
 
-	if (overlapface) *overlapface = NULL;
-
 	for (i = 0; i < len; i++) {
 		f = BM_iter_new(&vertfaces, bm, BM_FACES_OF_VERT, varr[i]);
 		while (f) {
 			amount = BM_verts_in_face(bm, f, varr, len);
-			if (amount >= len) {
-				if (overlapface) *overlapface = f;
+			if ((amount >= len) && (do_partial == TRUE || len == f->len)) {
+				if (r_overlapface) {
+					*r_overlapface = f;
+				}
 				return TRUE;
 			}
 			f = BM_iter_step(&vertfaces);
 		}
 	}
+
+	if (r_overlapface) {
+		*r_overlapface = NULL;
+	}
+
 	return FALSE;
 }
 

Modified: trunk/blender/source/blender/bmesh/operators/bmo_create.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_create.c	2012-02-28 05:50:02 UTC (rev 44504)
+++ trunk/blender/source/blender/bmesh/operators/bmo_create.c	2012-02-28 07:19:28 UTC (rev 44505)
@@ -1386,7 +1386,11 @@
 	}
 	else if (amount == 3) {
 		/* create triangl */
-		BM_face_create_quad_tri(bm, verts[0], verts[1], verts[2], NULL, NULL, TRUE);
+		f = BM_face_create_quad_tri(bm, verts[0], verts[1], verts[2], NULL, NULL, TRUE);
+
+		if (f) {
+			BMO_elem_flag_enable(bm, f, ELE_OUT);
+		}
 	}
 	else if (amount == 4) {
 		f = NULL;




More information about the Bf-blender-cvs mailing list