[Bf-committers] [Bf-blender-cvs] [276ef3b] master: Editmesh: Toggle between all edge-loop boundaries when selecting
Daniel Salazar - patazstudio.com
zanqdo at gmail.com
Sat Mar 8 19:59:50 CET 2014
Thank you Cam!
On Mar 6, 2014 9:39 PM, "Campbell Barton" <noreply at git.blender.org> wrote:
> Commit: 276ef3b3b5192aad5c3e5e02c69246818f89033b
> Author: Campbell Barton
> Date: Fri Mar 7 10:10:23 2014 +1100
> https://developer.blender.org/rB276ef3b3b5192aad5c3e5e02c69246818f89033b
>
> Editmesh: Toggle between all edge-loop boundaries when selecting
>
> Now Alt+RMB,RMB will select all connected boundaries.
>
> There are times when you just want to select an entire boundary loop
> ignoring face topology, previously there was no way to do this.
>
> ===================================================================
>
> M source/blender/editors/mesh/editmesh_select.c
>
> ===================================================================
>
> diff --git a/source/blender/editors/mesh/editmesh_select.c
> b/source/blender/editors/mesh/editmesh_select.c
> index 0c7810a..41546e7 100644
> --- a/source/blender/editors/mesh/editmesh_select.c
> +++ b/source/blender/editors/mesh/editmesh_select.c
> @@ -1007,6 +1007,34 @@ void MESH_OT_select_mode(wmOperatorType *ot)
>
> /* **************** LOOP SELECTS *************** */
>
> +static void walker_select_count(BMEditMesh *em, int walkercode, void
> *start, const bool select, const bool select_mix,
> + int *r_totsel, int *r_totunsel)
> +{
> + BMesh *bm = em->bm;
> + BMElem *ele;
> + BMWalker walker;
> + int tot[2] = {0, 0};
> +
> + BMW_init(&walker, bm, walkercode,
> + BMW_MASK_NOP, BMW_MASK_NOP, BMW_MASK_NOP,
> + BMW_FLAG_TEST_HIDDEN,
> + BMW_NIL_LAY);
> +
> + for (ele = BMW_begin(&walker, start); ele; ele =
> BMW_step(&walker)) {
> + tot[(BM_elem_flag_test_bool(ele, BM_ELEM_SELECT) !=
> select)] += 1;
> +
> + if (!select_mix && tot[0] && tot[1]) {
> + tot[0] = tot[1] = -1;
> + break;
> + }
> + }
> +
> + *r_totsel = tot[0];
> + *r_totunsel = tot[1];
> +
> + BMW_end(&walker);
> +}
> +
> static void walker_select(BMEditMesh *em, int walkercode, void *start,
> const bool select)
> {
> BMesh *bm = em->bm;
> @@ -1101,12 +1129,68 @@ void MESH_OT_loop_multi_select(wmOperatorType *ot)
>
> /* ***************** loop select (non modal) ************** */
>
> +static void mouse_mesh_loop_face(BMEditMesh *em, BMEdge *eed, bool
> select, bool select_clear)
> +{
> + if (select_clear) {
> + EDBM_flag_disable_all(em, BM_ELEM_SELECT);
> + }
> +
> + walker_select(em, BMW_FACELOOP, eed, select);
> +}
> +
> +static void mouse_mesh_loop_edge_ring(BMEditMesh *em, BMEdge *eed, bool
> select, bool select_clear)
> +{
> + if (select_clear) {
> + EDBM_flag_disable_all(em, BM_ELEM_SELECT);
> + }
> +
> + walker_select(em, BMW_EDGERING, eed, select);
> +}
> +
> +static void mouse_mesh_loop_edge(BMEditMesh *em, BMEdge *eed, bool
> select, bool select_clear, bool select_cycle)
> +{
> + bool edge_boundary = false;
> +
> + /* cycle between BMW_LOOP / BMW_EDGEBOUNDARY */
> + if (select_cycle && BM_edge_is_boundary(eed)) {
> + int tot[2];
> +
> + /* if the loops selected toggle the boundaries */
> + walker_select_count(em, BMW_LOOP, eed, select, false,
> + &tot[0], &tot[1]);
> + if (tot[select] == 0) {
> + edge_boundary = true;
> +
> + /* if the boundaries selected, toggle back to the
> loop */
> + walker_select_count(em, BMW_EDGEBOUNDARY, eed,
> select, false,
> + &tot[0], &tot[1]);
> + if (tot[select] == 0) {
> + edge_boundary = false;
> + }
> + }
> + }
> +
> + if (select_clear) {
> + EDBM_flag_disable_all(em, BM_ELEM_SELECT);
> + }
> +
> + if (edge_boundary) {
> + walker_select(em, BMW_EDGEBOUNDARY, eed, select);
> + }
> + else {
> + walker_select(em, BMW_LOOP, eed, select);
> + }
> +}
> +
> +
> static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend,
> bool deselect, bool toggle, bool ring)
> {
> ViewContext vc;
> BMEditMesh *em;
> BMEdge *eed;
> bool select = true;
> + bool select_clear = false;
> + bool select_cycle = true;
> float dist = 50.0f;
> float mvalf[2];
>
> @@ -1124,7 +1208,7 @@ static bool mouse_mesh_loop(bContext *C, const int
> mval[2], bool extend, bool de
> }
>
> if (extend == false && deselect == false && toggle == false) {
> - EDBM_flag_disable_all(em, BM_ELEM_SELECT);
> + select_clear = true;
> }
>
> if (extend) {
> @@ -1133,28 +1217,24 @@ static bool mouse_mesh_loop(bContext *C, const int
> mval[2], bool extend, bool de
> else if (deselect) {
> select = false;
> }
> - else if (BM_elem_flag_test(eed, BM_ELEM_SELECT) == 0) {
> + else if (select_clear || (BM_elem_flag_test(eed, BM_ELEM_SELECT)
> == 0)) {
> select = true;
> }
> else if (toggle) {
> select = false;
> + select_cycle = false;
> }
>
> if (em->selectmode & SCE_SELECT_FACE) {
> - walker_select(em, BMW_FACELOOP, eed, select);
> - }
> - else if (em->selectmode & SCE_SELECT_EDGE) {
> - if (ring)
> - walker_select(em, BMW_EDGERING, eed, select);
> - else
> - walker_select(em, BMW_LOOP, eed, select);
> + mouse_mesh_loop_face(em, eed, select, select_clear);
> }
> - else if (em->selectmode & SCE_SELECT_VERTEX) {
> - if (ring)
> - walker_select(em, BMW_EDGERING, eed, select);
> -
> - else
> - walker_select(em, BMW_LOOP, eed, select);
> + else {
> + if (ring) {
> + mouse_mesh_loop_edge_ring(em, eed, select,
> select_clear);
> + }
> + else {
> + mouse_mesh_loop_edge(em, eed, select,
> select_clear, select_cycle);
> + }
> }
>
> EDBM_selectmode_flush(em);
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list