diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-05-02 15:37:32 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-05-02 15:37:32 +0300 |
commit | 23fe6e7eab3a728f1d1c6df2cef97ad02c222d37 (patch) | |
tree | 82a1f36a57d231a83683d42cec39b883cd40378d /source/blender/editors/uvedit | |
parent | eaf6345d4b40d08abba9998a0e432a51e0b76787 (diff) | |
parent | e76a65e35902c128295cdf817664ab6f8d5737d5 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/editors/uvedit')
-rw-r--r-- | source/blender/editors/uvedit/uvedit_ops.c | 121 |
1 files changed, 55 insertions, 66 deletions
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index 6fa75b0a2b3..97075eba61e 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1113,7 +1113,7 @@ static int uv_select_edgeloop( static void uv_select_linked_multi( Scene *scene, Image *ima, Object **objects, const uint objects_len, const float limit[2], - UvNearestHit *hit_final, bool extend, bool select_faces) + UvNearestHit *hit_final, bool extend, bool deselect, bool toggle, bool select_faces) { /* loop over objects, or just use hit_final->ob */ for (uint ob_index = 0; ob_index < objects_len; ob_index++) { @@ -1222,89 +1222,65 @@ static void uv_select_linked_multi( } } - if (!extend) { - BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, a) { - if (select_faces) { - if (flag[a]) - BM_face_select_set(em->bm, efa, true); - else - BM_face_select_set(em->bm, efa, false); - } - else { - BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - - if (flag[a]) - luv->flag |= MLOOPUV_VERTSEL; - else - luv->flag &= ~MLOOPUV_VERTSEL; - } - } - } - } - else { + /* Toggling - if any of the linked vertices is selected (and visible), we deselect. */ + if ((toggle == true) && (extend == false) && (deselect == false)) { BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, a) { + bool found_selected = false; if (!flag[a]) { continue; } if (select_faces) { - if (BM_elem_flag_test(efa, BM_ELEM_SELECT) && !BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) - break; + if (BM_elem_flag_test(efa, BM_ELEM_SELECT) && !BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { + found_selected = true; + } } else { BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); if (luv->flag & MLOOPUV_VERTSEL) { - break; + found_selected = true; } } - if (l) { + if (found_selected) { + deselect = true; break; } } } + } - if (efa) { - BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, a) { - if (!flag[a]) { - continue; - } - - if (select_faces) { - BM_face_select_set(em->bm, efa, false); - } - else { - BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - - luv->flag &= ~MLOOPUV_VERTSEL; - } - } +#define SET_SELECTION(value) \ + if (select_faces) { \ + BM_face_select_set(em->bm, efa, value); \ + } \ + else { \ + BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { \ + luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); \ + luv->flag = (value) ? (luv->flag | MLOOPUV_VERTSEL) : (luv->flag & ~MLOOPUV_VERTSEL); \ + } \ + } (void)0 + + BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, a) { + if (!flag[a]) { + if (!extend && !deselect && !toggle) { + SET_SELECTION(false); } + continue; } - else { - BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, a) { - if (!flag[a]) { - continue; - } - - if (select_faces) { - BM_face_select_set(em->bm, efa, true); - } - else { - BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { - luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - luv->flag |= MLOOPUV_VERTSEL; - } - } - } + if (!deselect) { + SET_SELECTION(true); + } + else { + SET_SELECTION(false); } } +#undef SET_SELECTION + MEM_freeN(stack); MEM_freeN(flag); BM_uv_vert_map_free(vmap); @@ -2256,7 +2232,8 @@ static int uv_mouse_select_multi( /* TODO(MULTI_EDIT): We only need to de-select non-active */ uv_select_all_perform_multi(scene, ima, objects, objects_len, SEL_DESELECT); } - uv_select_linked_multi(scene, ima, objects, objects_len, limit, &hit, extend, false); + /* Current behavior of 'extend' is actually toggling, so pass extend flag as 'toggle' here */ + uv_select_linked_multi(scene, ima, objects, objects_len, limit, &hit, false, false, extend, false); } else if (extend) { if (selectmode == UV_SELECT_VERTEX) { @@ -2490,7 +2467,7 @@ static int uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent ViewLayer *view_layer = CTX_data_view_layer(C); Image *ima = CTX_data_edit_image(C); float limit[2]; - int extend; + int extend, deselect; bool select_faces = (ts->uv_flag & UV_SYNC_SELECTION) && (ts->selectmode & SCE_SELECT_FACE); UvNearestHit hit = UV_NEAREST_HIT_INIT; @@ -2501,6 +2478,7 @@ static int uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent } extend = RNA_boolean_get(op->ptr, "extend"); + deselect = RNA_boolean_get(op->ptr, "deselect"); uvedit_pixel_to_float(sima, limit, 0.05f); uint objects_len = 0; @@ -2531,7 +2509,9 @@ static int uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent uv_select_all_perform_multi(scene, ima, objects, objects_len, SEL_DESELECT); } - uv_select_linked_multi(scene, ima, objects, objects_len, limit, pick ? &hit : NULL, extend, select_faces); + uv_select_linked_multi( + scene, ima, objects, objects_len, limit, pick ? &hit : NULL, + extend, deselect, false, select_faces); /* weak!, but works */ Object **objects_free = objects; @@ -2571,6 +2551,7 @@ static void UV_OT_select_linked(wmOperatorType *ot) /* properties */ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection rather than clearing the existing selection"); + RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect linked UV vertices rather than selecting them"); } static int uv_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmEvent *event) @@ -2599,7 +2580,7 @@ static void UV_OT_select_linked_pick(wmOperatorType *ot) /* properties */ RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend selection rather than clearing the existing selection"); - + RNA_def_boolean(ot->srna, "deselect", 0, "Deselect", "Deselect linked UV vertices rather than selecting them"); RNA_def_float_vector(ot->srna, "location", 2, NULL, -FLT_MAX, FLT_MAX, "Location", "Mouse location in normalized coordinates, 0.0 to 1.0 is within the image bounds", -100.0f, 100.0f); } @@ -4398,10 +4379,18 @@ void ED_keymap_uvedit(wmKeyConfig *keyconf) RNA_boolean_set(kmi->ptr, "deselect", true); /* selection manipulation */ - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0)->ptr, "extend", false); - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0)->ptr, "extend", false); - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0)->ptr, "extend", true); - RNA_boolean_set(WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0)->ptr, "extend", true); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "extend", true); + RNA_boolean_set(kmi->ptr, "deselect", false); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, 0, 0); + RNA_boolean_set(kmi->ptr, "extend", true); + RNA_boolean_set(kmi->ptr, "deselect", false); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked", LKEY, KM_PRESS, KM_CTRL | KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", false); + RNA_boolean_set(kmi->ptr, "deselect", true); + kmi = WM_keymap_add_item(keymap, "UV_OT_select_linked_pick", LKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", false); + RNA_boolean_set(kmi->ptr, "deselect", true); /* select more/less */ WM_keymap_add_item(keymap, "UV_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); |