[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44772] trunk/blender/source/blender/bmesh : bmesh fix: faces were being created flipped the wrong way compared to surrounding geometry .

Campbell Barton ideasman42 at gmail.com
Fri Mar 9 21:30:06 CET 2012


Revision: 44772
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44772
Author:   campbellbarton
Date:     2012-03-09 20:29:53 +0000 (Fri, 09 Mar 2012)
Log Message:
-----------
bmesh fix: faces were being created flipped the wrong way compared to surrounding geometry.
also the last edge was mot taken into account when calculating the correct winding.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
    trunk/blender/source/blender/bmesh/operators/bmo_create.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2012-03-09 19:17:19 UTC (rev 44771)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_polygon.c	2012-03-09 20:29:53 UTC (rev 44772)
@@ -583,7 +583,7 @@
 	
 	/* do an interval test on the x and y axe */
 	/* first do x axi */
-#define T FLT_EPSILON * 15
+#define T (FLT_EPSILON * 15)
 	if ( ABS(v1[1] - v2[1]) < T &&
 	     ABS(v3[1] - v4[1]) < T &&
 	     ABS(v1[1] - v3[1]) < T)

Modified: trunk/blender/source/blender/bmesh/operators/bmo_create.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_create.c	2012-03-09 19:17:19 UTC (rev 44771)
+++ trunk/blender/source/blender/bmesh/operators/bmo_create.c	2012-03-09 20:29:53 UTC (rev 44772)
@@ -76,13 +76,12 @@
 
 /****  rotation system code * */
 
-#define RS_GET_EDGE_LINK(e, v, e_data)  (                                     \
-	(v) == ((BMEdge *)(e))->v1 ?                                              \
-			&(((EdgeData *)(e_data))->v1_disk_link) :                         \
-			&(((EdgeData *)(e_data))->v2_disk_link)                           \
-	)
+BM_INLINE BMDiskLink *rs_edge_link_get(BMEdge *e, BMVert *v, EdgeData *e_data)
+{
+	return 	v == ((BMEdge *)e)->v1 ? &(((EdgeData *)e_data)->v1_disk_link) :
+	                                 &(((EdgeData *)e_data)->v2_disk_link) ;
+}
 
-
 static int rotsys_append_edge(BMEdge *e, BMVert *v,
                               EdgeData *edata, VertData *vdata)
 {
@@ -90,7 +89,7 @@
 	VertData *vd = &vdata[BM_elem_index_get(v)];
 	
 	if (!vd->e) {
-		Link *e1 = (Link *)RS_GET_EDGE_LINK(e, v, ed);
+		Link *e1 = (Link *)rs_edge_link_get(e, v, ed);
 
 		vd->e = e;
 		e1->next = e1->prev = (Link *)e;
@@ -99,9 +98,9 @@
 		BMDiskLink *dl1, *dl2, *dl3;
 		EdgeData *ved = &edata[BM_elem_index_get(vd->e)];
 
-		dl1 = RS_GET_EDGE_LINK(e, v, ed);
-		dl2 = RS_GET_EDGE_LINK(vd->e, v, ved);
-		dl3 = dl2->prev ? RS_GET_EDGE_LINK(dl2->prev, v, &edata[BM_elem_index_get(dl2->prev)]) : NULL;
+		dl1 = rs_edge_link_get(e, v, ed);
+		dl2 = rs_edge_link_get(vd->e, v, ved);
+		dl3 = dl2->prev ? rs_edge_link_get(dl2->prev, v, &edata[BM_elem_index_get(dl2->prev)]) : NULL;
 
 		dl1->next = vd->e;
 		dl1->prev = dl2->prev;
@@ -122,14 +121,14 @@
 	VertData *vd = vdata + BM_elem_index_get(v);
 	BMDiskLink *e1, *e2;
 
-	e1 = RS_GET_EDGE_LINK(e, v, ed);
+	e1 = rs_edge_link_get(e, v, ed);
 	if (e1->prev) {
-		e2 = RS_GET_EDGE_LINK(e1->prev, v, ed);
+		e2 = rs_edge_link_get(e1->prev, v, ed);
 		e2->next = e1->next;
 	}
 
 	if (e1->next) {
-		e2 = RS_GET_EDGE_LINK(e1->next, v, ed);
+		e2 = rs_edge_link_get(e1->next, v, ed);
 		e2->prev = e1->prev;
 	}
 
@@ -859,6 +858,16 @@
 	return i;
 }
 
+BM_INLINE void vote_on_winding(BMEdge *edge, EPathNode *node, unsigned int winding[2])
+{
+	BMVert *test_v1, *test_v2;
+	/* we want to use the reverse winding to the existing order */
+	BM_edge_ordered_verts(edge, &test_v2, &test_v1);
+
+	/* edges vote on which winding wins out */
+	winding[(test_v1 == node->v)]++;
+}
+
 void bmo_edgenet_fill_exec(BMesh *bm, BMOperator *op)
 {
 	BMIter iter;
@@ -971,12 +980,7 @@
 			
 			/* check on the winding */
 			if (e->l) {
-				BMVert *test_v1, *test_v2;
-				/* we want to use the reverse winding to the existing order */
-				BM_edge_ordered_verts(edge, &test_v2, &test_v1);
-
-				/* edges vote on which winding wins out */
-				winding[(test_v1 == node->v)]++;
+				vote_on_winding(e, node, winding);
 			}
 
 			edata[BM_elem_index_get(e)].ftag++;
@@ -986,6 +990,10 @@
 			BLI_array_append(verts, node->v);
 		}
 		
+		if (edge->l) {
+			vote_on_winding(edge, path->nodes.last, winding);
+		}
+
 		BLI_array_growone(edges);
 		edges[i++] = edge;
 		edata[BM_elem_index_get(edge)].ftag++;
@@ -1010,7 +1018,7 @@
 
 			/* if these are even it doesnt really matter what to do,
 			 * with consistent geometry one will be zero, the choice is clear */
-			if (winding[0] > winding[1]) {
+			if (winding[0] < winding[1]) {
 				v1 = verts[0];
 				v2 = verts[1];
 			}
@@ -1240,7 +1248,10 @@
 	BLI_array_free(edges2);
 }
 
-/* this is essentially new fke */
+/* This is what runs when pressing the F key
+ * doing the best thing here isnt always easy create vs dissolve, its nice to support
+ * but it it _really_ gives issues we might have to not call dissolve. - campbell
+ */
 void bmo_contextual_create_exec(BMesh *bm, BMOperator *op)
 {
 	BMOperator op2;




More information about the Bf-blender-cvs mailing list