diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-07-25 23:27:18 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-07-25 23:27:18 +0400 |
commit | 09a9aa5720d71fdc6118bf0bcdce53def3f027d0 (patch) | |
tree | 0e79c005e1f030dc4e03e91dc48a472006b48051 | |
parent | 4bc32d5ded4362cd5cef36456946428bf099148d (diff) |
add twist option to bridge tool (for circular loops)
-rw-r--r-- | source/blender/bmesh/intern/bmesh_opdefines.c | 1 | ||||
-rw-r--r-- | source/blender/bmesh/operators/bmo_bridge.c | 14 | ||||
-rw-r--r-- | source/blender/editors/mesh/editmesh_tools.c | 6 |
3 files changed, 17 insertions, 4 deletions
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c index 70ce3d528c9..451d4a37a00 100644 --- a/source/blender/bmesh/intern/bmesh_opdefines.c +++ b/source/blender/bmesh/intern/bmesh_opdefines.c @@ -518,6 +518,7 @@ static BMOpDefine bmo_bridge_loops_def = { {"use_cyclic", BMO_OP_SLOT_BOOL}, {"use_merge", BMO_OP_SLOT_BOOL}, {"merge_factor", BMO_OP_SLOT_FLT}, + {"twist_offset", BMO_OP_SLOT_INT}, {{'\0'}}, }, /* slots_out */ diff --git a/source/blender/bmesh/operators/bmo_bridge.c b/source/blender/bmesh/operators/bmo_bridge.c index 5b046524e95..f63e742d8ba 100644 --- a/source/blender/bmesh/operators/bmo_bridge.c +++ b/source/blender/bmesh/operators/bmo_bridge.c @@ -142,7 +142,7 @@ static bool bm_edge_test_cb(BMEdge *e, void *bm_v) static void bridge_loop_pair(BMesh *bm, struct BMEdgeLoopStore *el_store_a, struct BMEdgeLoopStore *el_store_b, - const bool use_merge, const float merge_factor) + const bool use_merge, const float merge_factor, const int twist_offset) { const float eps = 0.00001f; LinkData *el_a_first, *el_b_first; @@ -268,6 +268,15 @@ static void bridge_loop_pair(BMesh *bm, if (is_closed) { bm_bridge_best_rotation(el_store_a, el_store_b); + + /* add twist */ + if (twist_offset != 0) { + const int len_b = BM_edgeloop_length_get(el_store_b); + ListBase *lb_b = BM_edgeloop_verts_get(el_store_b); + const int offset = twist_offset % len_b; + LinkData *el_b = BLI_rfindlink(lb_b, (offset < 0) ? (offset + len_b) : offset); + BLI_rotatelist(lb_b, el_b); + } } /* Assign after flipping is finalized */ @@ -476,6 +485,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) 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); + const int twist_offset = BMO_slot_int_get(op->slots_in, "twist_offset"); int count; bool change = false; @@ -535,7 +545,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op) bridge_loop_pair(bm, (struct BMEdgeLoopStore *)el_store, (struct BMEdgeLoopStore *)el_store_next, - use_merge, merge_factor); + use_merge, merge_factor, twist_offset); if (use_pairs) { el_store = el_store->next; } diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 538ed862e4e..185ff1a74d5 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3978,6 +3978,7 @@ static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op) const bool use_cyclic = (type == 1); const bool use_merge = RNA_boolean_get(op->ptr, "use_merge"); const float merge_factor = RNA_float_get(op->ptr, "merge_factor"); + const int twist_offset = RNA_int_get(op->ptr, "twist_offset"); const bool use_faces = (em->bm->totfacesel != 0); char edge_hflag; @@ -4005,8 +4006,8 @@ static int edbm_bridge_edge_loops_exec(bContext *C, wmOperator *op) } EDBM_op_init(em, &bmop, op, - "bridge_loops edges=%he use_pairs=%b use_cyclic=%b use_merge=%b merge_factor=%f", - edge_hflag, use_pairs, use_cyclic, use_merge, merge_factor); + "bridge_loops edges=%he use_pairs=%b use_cyclic=%b use_merge=%b merge_factor=%f twist_offset=%i", + edge_hflag, use_pairs, use_cyclic, use_merge, merge_factor, twist_offset); BMO_op_exec(em->bm, &bmop); @@ -4086,6 +4087,7 @@ void MESH_OT_bridge_edge_loops(wmOperatorType *ot) RNA_def_boolean(ot->srna, "use_merge", false, "Merge", "Merge rather than creating faces"); RNA_def_float(ot->srna, "merge_factor", 0.5f, 0.0f, 1.0f, "Merge Factor", "", 0.0f, 1.0f); + RNA_def_int(ot->srna, "twist_offset", 0, -1000, 1000, "Twist", "Twist offset for closed loops", -1000, 1000); mesh_operator_edgering_props(ot, 0); } |