[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58167] trunk/blender/source/blender/bmesh /operators/bmo_bridge.c: fix for bridge tool where the 2 loops overlap ( typical use for scanfill), however its nice to support with bridge too since it can do subdivisions, handles customdata and fills in quads.

Campbell Barton ideasman42 at gmail.com
Thu Jul 11 10:37:30 CEST 2013


Revision: 58167
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58167
Author:   campbellbarton
Date:     2013-07-11 08:37:30 +0000 (Thu, 11 Jul 2013)
Log Message:
-----------
fix for bridge tool where the 2 loops overlap (typical use for scanfill), however its nice to support with bridge too since it can do subdivisions, handles customdata and fills in quads.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/operators/bmo_bridge.c

Modified: trunk/blender/source/blender/bmesh/operators/bmo_bridge.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_bridge.c	2013-07-11 08:25:37 UTC (rev 58166)
+++ trunk/blender/source/blender/bmesh/operators/bmo_bridge.c	2013-07-11 08:37:30 UTC (rev 58167)
@@ -144,11 +144,13 @@
                              struct BMEdgeLoopStore *el_store_b,
                              const bool use_merge, const float merge_factor)
 {
+	const float eps = 0.00001f;
 	LinkData *el_a_first, *el_b_first;
 	const bool is_closed = BM_edgeloop_is_closed(el_store_a) && BM_edgeloop_is_closed(el_store_b);
 	int el_store_a_len, el_store_b_len;
 	bool el_store_b_free = false;
 	float el_dir[3];
+	float dot_a, dot_b;
 	const bool use_edgeout = true;
 
 	el_store_a_len = BM_edgeloop_length_get((struct BMEdgeLoopStore *)el_store_a);
@@ -202,9 +204,22 @@
 		BM_edgeloop_calc_normal_aligned(bm, el_store_b, no);
 	}
 
-	if ((dot_v3v3(BM_edgeloop_normal_get(el_store_a), el_dir) < 0.0f) !=
-		(dot_v3v3(BM_edgeloop_normal_get(el_store_b), el_dir) < 0.0f))
+	dot_a = dot_v3v3(BM_edgeloop_normal_get(el_store_a), el_dir);
+	dot_b = dot_v3v3(BM_edgeloop_normal_get(el_store_b), el_dir);
+
+	if (UNLIKELY((len_squared_v3(el_dir) < eps) ||
+	             ((fabsf(dot_a) < eps) && (fabsf(dot_b) < eps))))
 	{
+		/* in this case there is no depth between the two loops,
+		 * eg: 2x 2d circles, one scaled smaller,
+		 * in this case 'el_dir' cant be used, just ensure we have matching flipping. */
+		if (dot_v3v3(BM_edgeloop_normal_get(el_store_a),
+		             BM_edgeloop_normal_get(el_store_b)) < 0.0f)
+		{
+			BM_edgeloop_flip(bm, el_store_b);
+		}
+	}
+	else if ((dot_a < 0.0f) != (dot_a < 0.0f)) {
 		BM_edgeloop_flip(bm, el_store_b);
 	}
 




More information about the Bf-blender-cvs mailing list