diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-07-11 12:37:30 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-07-11 12:37:30 +0400 |
commit | 13e33522dcd838f01fc3c8f493eb6aab5c67868a (patch) | |
tree | 7e58a3a7f6d584c36b6daf4dad8a56deba361808 /source/blender/bmesh/operators/bmo_bridge.c | |
parent | 991459d0ce23fcab703be2c9a2d0e78e41b581dd (diff) |
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.
Diffstat (limited to 'source/blender/bmesh/operators/bmo_bridge.c')
-rw-r--r-- | source/blender/bmesh/operators/bmo_bridge.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/source/blender/bmesh/operators/bmo_bridge.c b/source/blender/bmesh/operators/bmo_bridge.c index 6b124a3030a..61421b0bec2 100644 --- a/source/blender/bmesh/operators/bmo_bridge.c +++ b/source/blender/bmesh/operators/bmo_bridge.c @@ -144,11 +144,13 @@ static void bridge_loop_pair(BMesh *bm, 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 @@ static void bridge_loop_pair(BMesh *bm, 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_b < 0.0f)) { BM_edgeloop_flip(bm, el_store_b); } |