diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-05-31 19:48:42 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-05-31 19:48:42 +0400 |
commit | db42a596aafeb7b33bee63c6bc8da205582b5257 (patch) | |
tree | 017c76bb07f87fe4079e3dc2c81011bfce47dbc4 /source/blender/bmesh/operators/bmo_bridge.c | |
parent | fe02323632bca510b9900d45ad4c45e8f16b0098 (diff) |
fix [#35578] New bridge tool; bowtie crossing when destination edges form one half of an 'X'
Diffstat (limited to 'source/blender/bmesh/operators/bmo_bridge.c')
-rw-r--r-- | source/blender/bmesh/operators/bmo_bridge.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/source/blender/bmesh/operators/bmo_bridge.c b/source/blender/bmesh/operators/bmo_bridge.c index 53bb88aee0a..9da6e812032 100644 --- a/source/blender/bmesh/operators/bmo_bridge.c +++ b/source/blender/bmesh/operators/bmo_bridge.c @@ -168,6 +168,21 @@ static void bridge_loop_pair(BMesh *bm, } sub_v3_v3v3(el_dir, BM_edgeloop_center_get(el_store_a), BM_edgeloop_center_get(el_store_b)); + + if (is_closed) { + /* if all loops are closed this will calculate twice for all loops */ + BM_edgeloop_calc_normal(bm, el_store_a); + BM_edgeloop_calc_normal(bm, el_store_b); + } + else { + /* normalizing isn't strictly needed but without we may get very large values */ + float no[3]; + normalize_v3_v3(no, el_dir); + BM_edgeloop_calc_normal_aligned(bm, el_store_a, no); + negate_v3(no); + 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)) { @@ -426,7 +441,6 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) count = BM_mesh_edgeloops_find(bm, &eloops, bm_edge_test_cb, bm); - BM_mesh_edgeloops_calc_normal(bm, &eloops); BM_mesh_edgeloops_calc_center(bm, &eloops); if (count < 2) { |