[Bf-blender-cvs] [b5194520e3b] master: Fix T79148: UV Edge ring select doesn't select edges
Campbell Barton
noreply at git.blender.org
Wed Jul 22 06:37:34 CEST 2020
Commit: b5194520e3bdc7f3cdb418b6cbd7bb31db9c8775
Author: Campbell Barton
Date: Wed Jul 22 14:33:26 2020 +1000
Branches: master
https://developer.blender.org/rBb5194520e3bdc7f3cdb418b6cbd7bb31db9c8775
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.
===================================================================
M source/blender/editors/uvedit/uvedit_select.c
===================================================================
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;
+ }
}
}
More information about the Bf-blender-cvs
mailing list