Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2020-07-22 07:33:26 +0300
committerCampbell Barton <ideasman42@gmail.com>2020-07-22 07:33:26 +0300
commitb5194520e3bdc7f3cdb418b6cbd7bb31db9c8775 (patch)
treeac4131f8d97025c506938060d9df5a1705ae17e0 /source
parent83cb4f5f8f2a7db3ba89331c7e8b044c2ddf2cb9 (diff)
Fix T79148: UV Edge ring select doesn't select edges
While UV doesn't yet support edge selection, it can when sync select is enabled.
Diffstat (limited to 'source')
-rw-r--r--source/blender/editors/uvedit/uvedit_select.c43
1 files changed, 34 insertions, 9 deletions
diff --git a/source/blender/editors/uvedit/uvedit_select.c b/source/blender/editors/uvedit/uvedit_select.c
index 92e110b0998..eee1939d33c 100644
--- a/source/blender/editors/uvedit/uvedit_select.c
+++ b/source/blender/editors/uvedit/uvedit_select.c
@@ -1066,7 +1066,11 @@ static int uv_select_edgeloop(Scene *scene, Object *obedit, UvNearestHit *hit, c
static int uv_select_edgering(
const SpaceImage *sima, Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend)
{
+ const ToolSettings *ts = scene->toolsettings;
BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ const bool use_face_select = (ts->uv_flag & UV_SYNC_SELECTION) ?
+ (ts->selectmode & SCE_SELECT_FACE) :
+ (ts->uv_selectmode & UV_SELECT_FACE);
bool select;
const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
@@ -1075,7 +1079,7 @@ static int uv_select_edgering(
uv_select_all_perform(scene, obedit, SEL_DESELECT);
}
- BM_mesh_elem_hflag_disable_all(em->bm, BM_FACE, BM_ELEM_TAG, false);
+ BM_mesh_elem_hflag_disable_all(em->bm, BM_EDGE, BM_ELEM_TAG, false);
if (extend) {
select = !(uvedit_uv_select_test(scene, hit->l, cd_loop_uv_offset));
@@ -1091,18 +1095,39 @@ static int uv_select_edgering(
for (int side = 0; side < 2; side++) {
BMLoop *l_step = l_pair[side];
- while (l_step && l_step->f->len == 4) {
- if (BM_elem_flag_test(l_step->f, BM_ELEM_TAG) ||
- !uvedit_face_visible_test(scene, l_step->f)) {
+ /* Disable since we start from the same edge. */
+ BM_elem_flag_disable(hit->l->e, BM_ELEM_TAG);
+ while (l_step) {
+ if (!uvedit_face_visible_test(scene, l_step->f)) {
break;
}
- uvedit_face_select_set_with_sticky(
- sima, scene, em, l_step->f, select, false, cd_loop_uv_offset);
+ if (use_face_select) {
+ uvedit_face_select_set_with_sticky(
+ sima, scene, em, l_step->f, select, false, cd_loop_uv_offset);
+ }
+ else {
+ uvedit_edge_select_set_with_sticky(
+ sima, scene, em, l_step, select, false, cd_loop_uv_offset);
+ }
+
+ BM_elem_flag_enable(l_step->e, BM_ELEM_TAG);
+ if (l_step->f->len == 4) {
+ BMLoop *l_step_opposite = l_step->next->next;
+ l_step = uvedit_loop_find_other_radial_loop_with_visible_face(
+ scene, l_step_opposite, cd_loop_uv_offset);
+ if (l_step == NULL) {
+ /* Ensure we touch the opposite edge if we cant walk over it. */
+ l_step = l_step_opposite;
+ }
+ }
+ else {
+ l_step = NULL;
+ }
- BM_elem_flag_enable(l_step->f, BM_ELEM_TAG);
- l_step = uvedit_loop_find_other_radial_loop_with_visible_face(
- scene, l_step->next->next, cd_loop_uv_offset);
+ if (l_step && BM_elem_flag_test(l_step->e, BM_ELEM_TAG)) {
+ break;
+ }
}
}