diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-05-12 14:00:15 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-05-12 14:00:15 +0400 |
commit | f87464392c5cc270381d1c8d358abd525df53e9a (patch) | |
tree | bd72c8ccf2bdbd36a93f2cb8216b0c53c1bd2a70 /source/blender/bmesh | |
parent | 877e0e1184230c320cf61d10873cbf1c0ed31072 (diff) |
bridge option to bridge loop pairs,
change the operator option to an enum: Connect Loops - open/closed/pairs
because it was getting confusing having all as bools.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_edgeloop.c | 17 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_edgeloop.h | 2 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 1 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_bridge.c | 12 |
4 files changed, 28 insertions, 4 deletions
diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.c b/source/blender/bmesh/intern/bmesh_edgeloop.c index 2f68effc97a..d85db111a23 100644 --- a/source/blender/bmesh/intern/bmesh_edgeloop.c +++ b/source/blender/bmesh/intern/bmesh_edgeloop.c @@ -190,7 +190,7 @@ void BM_mesh_edgeloops_calc_normal(BMesh *bm, ListBase *eloops) } } -void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops) +void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops, const bool use_normals) { ListBase eloops_ordered = {NULL}; BMEdgeLoopStore *el_store; @@ -223,9 +223,22 @@ void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops) while (eloops->first) { BMEdgeLoopStore *el_store_best = NULL; const float *co = ((BMEdgeLoopStore *)eloops_ordered.last)->co; + const float *no = ((BMEdgeLoopStore *)eloops_ordered.last)->no; float len_best = FLT_MAX; for (el_store = eloops->first; el_store; el_store = el_store->next) { - const float len = len_squared_v3v3(co, el_store->co); + float len; + if (use_normals) { + /* scale the length by how close the loops are to pointing at eachother */ + float dir[3]; + sub_v3_v3v3(dir, co, el_store->co); + len = normalize_v3(dir); + len = len * ((1.0f - fabsf(dot_v3v3(dir, no))) + + (1.0f - fabsf(dot_v3v3(dir, el_store->no)))); + } + else { + len = len_squared_v3v3(co, el_store->co); + } + if (len < len_best) { len_best = len; el_store_best = el_store; diff --git a/source/blender/bmesh/intern/bmesh_edgeloop.h b/source/blender/bmesh/intern/bmesh_edgeloop.h index b569f0cf4ce..c8cd6943af9 100644 --- a/source/blender/bmesh/intern/bmesh_edgeloop.h +++ b/source/blender/bmesh/intern/bmesh_edgeloop.h @@ -38,7 +38,7 @@ int BM_mesh_edgeloops_find(BMesh *bm, struct ListBase *r_lb, void BM_mesh_edgeloops_free(struct ListBase *eloops); void BM_mesh_edgeloops_calc_center(BMesh *bm, struct ListBase *eloops); void BM_mesh_edgeloops_calc_normal(BMesh *bm, struct ListBase *eloops); -void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops); +void BM_mesh_edgeloops_calc_order(BMesh *UNUSED(bm), ListBase *eloops, const bool use_normals); /* single edgeloop */ diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index f145d6939d9..53e01b94712 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -515,6 +515,7 @@ static BMOpDefine bmo_bridge_loops_def = { "bridge_loops", /* slots_in */ {{"edges", BMO_OP_SLOT_ELEMENT_BUF, {BM_EDGE}}, /* input edges */ + {"use_pairs", BMO_OP_SLOT_BOOL}, {"use_cyclic", BMO_OP_SLOT_BOOL}, {"use_merge", BMO_OP_SLOT_BOOL}, {"merge_factor", BMO_OP_SLOT_FLT}, diff --git a/source/blender/bmesh/operators/bmo_bridge.c b/source/blender/bmesh/operators/bmo_bridge.c index bf7c9f86df7..5182ac56f88 100644 --- a/source/blender/bmesh/operators/bmo_bridge.c +++ b/source/blender/bmesh/operators/bmo_bridge.c @@ -370,6 +370,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) LinkData *el_store; /* merge-bridge support */ + const bool use_pairs = BMO_slot_bool_get(op->slots_in, "use_pairs"); const bool use_merge = BMO_slot_bool_get(op->slots_in, "use_merge"); const float merge_factor = BMO_slot_float_get(op->slots_in, "merge_factor"); const bool use_cyclic = BMO_slot_bool_get(op->slots_in, "use_cyclic") && (use_merge == false); @@ -389,6 +390,12 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) goto cleanup; } + if (use_pairs && (count % 2)) { + BMO_error_raise(bm, op, BMERR_INVALID_SELECTION, + "Select an even number of loops to bridge pairs"); + goto cleanup; + } + if (use_merge) { bool match = true; const int eloop_len = BM_edgeloop_length_get(eloops.first); @@ -406,7 +413,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) } if (count > 2) { - BM_mesh_edgeloops_calc_order(bm, &eloops); + BM_mesh_edgeloops_calc_order(bm, &eloops, use_pairs); } for (el_store = eloops.first; el_store; el_store = el_store->next) { @@ -425,6 +432,9 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) (struct BMEdgeLoopStore *)el_store, (struct BMEdgeLoopStore *)el_store_next, use_merge, merge_factor); + if (use_pairs) { + el_store = el_store->next; + } change = true; } |