diff options
Diffstat (limited to 'source/blender/editors/uvedit')
-rw-r--r-- | source/blender/editors/uvedit/uvedit_ops.c | 16 | ||||
-rw-r--r-- | source/blender/editors/uvedit/uvedit_select.c | 125 |
2 files changed, 35 insertions, 106 deletions
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c index faf8e5013dd..e2368ae6ba8 100644 --- a/source/blender/editors/uvedit/uvedit_ops.c +++ b/source/blender/editors/uvedit/uvedit_ops.c @@ -1843,7 +1843,6 @@ static int uv_seams_from_islands_exec(bContext *C, wmOperator *op) { Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); - const float limit[2] = {STD_UV_CONNECT_LIMIT, STD_UV_CONNECT_LIMIT}; const bool mark_seams = RNA_boolean_get(op->ptr, "mark_seams"); const bool mark_sharp = RNA_boolean_get(op->ptr, "mark_sharp"); bool changed_multi = false; @@ -1884,23 +1883,10 @@ static int uv_seams_from_islands_exec(bContext *C, wmOperator *op) continue; } - const MLoopUV *luv_curr = BM_ELEM_CD_GET_VOID_P(l_iter, cd_loop_uv_offset); - const MLoopUV *luv_next = BM_ELEM_CD_GET_VOID_P(l_iter->next, cd_loop_uv_offset); - bool mark = false; BMLoop *l_other = l_iter->radial_next; do { - const MLoopUV *luv_other_curr = BM_ELEM_CD_GET_VOID_P(l_other, cd_loop_uv_offset); - const MLoopUV *luv_other_next = BM_ELEM_CD_GET_VOID_P(l_other->next, cd_loop_uv_offset); - if (l_iter->v != l_other->v) { - SWAP(const MLoopUV *, luv_other_curr, luv_other_next); - } - - if (!compare_ff(luv_curr->uv[0], luv_other_curr->uv[0], limit[0]) || - !compare_ff(luv_curr->uv[1], luv_other_curr->uv[1], limit[1]) || - - !compare_ff(luv_next->uv[0], luv_other_next->uv[0], limit[0]) || - !compare_ff(luv_next->uv[1], luv_other_next->uv[1], limit[1])) { + if (!BM_loop_uv_share_edge_check(l_iter, l_other, cd_loop_uv_offset)) { mark = true; break; } diff --git a/source/blender/editors/uvedit/uvedit_select.c b/source/blender/editors/uvedit/uvedit_select.c index 77529ca0275..d227fefbdd1 100644 --- a/source/blender/editors/uvedit/uvedit_select.c +++ b/source/blender/editors/uvedit/uvedit_select.c @@ -144,22 +144,16 @@ BMLoop *ED_uvedit_active_edge_loop_get(BMesh *bm) /** \name Visibility and Selection Utilities * \{ */ -static void uv_select_limit_default(SpaceImage *sima, float r_limit[2]) -{ - uvedit_pixel_to_float(sima, 0.05f, r_limit); -} - /** * Apply a penalty to elements that are already selected * so elements that aren't already selected are prioritized. + * + * \note This is calculated in screen-space otherwise zooming in on a uv-vert and + * shift-selecting can consider an adjacent point close enough to add to + * the selection rather than de-selecting the closest. */ static float uv_select_penalty_default(SpaceImage *sima) { - /* Notice 'limit' is the same no matter the zoom level, since this is like - * remove doubles and could annoying if it joined points when zoomed out. - * 'penalty' is in screen pixel space otherwise zooming in on a uv-vert and - * shift-selecting can consider an adjacent point close enough to add to - * the selection rather than de-selecting the closest. */ float penalty[2]; uvedit_pixel_to_float(sima, 5.0f / (sima ? sima->zoom : 1.0f), penalty); return len_v2(penalty); @@ -224,14 +218,13 @@ void uvedit_face_select_set_with_sticky(const SpaceImage *sima, BMFace *efa, const bool select, const bool do_history, - const float limit[2], const int cd_loop_uv_offset) { BMLoop *l_iter, *l_first; l_iter = l_first = BM_FACE_FIRST_LOOP(efa); do { uvedit_uv_select_set_with_sticky( - sima, scene, em, l_iter, select, do_history, limit, cd_loop_uv_offset); + sima, scene, em, l_iter, select, do_history, cd_loop_uv_offset); } while ((l_iter = l_iter->next) != l_first); } @@ -329,13 +322,11 @@ void uvedit_edge_select_set_with_sticky(const struct SpaceImage *sima, BMLoop *l, const bool select, const bool do_history, - const float limit[2], const uint cd_loop_uv_offset) { + uvedit_uv_select_set_with_sticky(sima, scene, em, l, select, do_history, cd_loop_uv_offset); uvedit_uv_select_set_with_sticky( - sima, scene, em, l, select, do_history, limit, cd_loop_uv_offset); - uvedit_uv_select_set_with_sticky( - sima, scene, em, l->next, select, do_history, limit, cd_loop_uv_offset); + sima, scene, em, l->next, select, do_history, cd_loop_uv_offset); } void uvedit_edge_select_set(const Scene *scene, @@ -444,7 +435,6 @@ void uvedit_uv_select_set_with_sticky(const struct SpaceImage *sima, BMLoop *l, const bool select, const bool do_history, - const float limit[2], const uint cd_loop_uv_offset) { const ToolSettings *ts = scene->toolsettings; @@ -477,8 +467,7 @@ void uvedit_uv_select_set_with_sticky(const struct SpaceImage *sima, else { const MLoopUV *luv_other = BM_ELEM_CD_GET_VOID_P(l_radial_iter, cd_loop_uv_offset); - if (fabsf(luv_other->uv[0] - luv->uv[0]) < limit[0] && - fabsf(luv_other->uv[1] - luv->uv[1]) < limit[1]) { + if (equals_v2v2(luv_other->uv, luv->uv)) { do_select = true; } } @@ -560,7 +549,6 @@ void uvedit_uv_select_disable(const Scene *scene, static BMLoop *uvedit_loop_find_other_radial_loop_with_visible_face(Scene *scene, BMLoop *l_src, - const float limit[2], const int cd_loop_uv_offset) { BMLoop *l_other = NULL; @@ -568,7 +556,7 @@ static BMLoop *uvedit_loop_find_other_radial_loop_with_visible_face(Scene *scene if (l_iter != l_src) { do { if (uvedit_face_visible_test(scene, l_iter->f) && - BM_loop_uv_share_edge_check_with_limit(l_src, l_iter, limit, cd_loop_uv_offset)) { + BM_loop_uv_share_edge_check(l_src, l_iter, cd_loop_uv_offset)) { /* Check UV's are contiguous. */ if (l_other == NULL) { l_other = l_iter; @@ -957,8 +945,7 @@ static bool uv_select_edgeloop_edge_tag_faces(BMEditMesh *em, return true; } -static int uv_select_edgeloop( - Scene *scene, Object *obedit, UvNearestHit *hit, const float limit[2], const bool extend) +static int uv_select_edgeloop(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend) { BMEditMesh *em = BKE_editmesh_from_object(obedit); BMFace *efa; @@ -974,7 +961,7 @@ static int uv_select_edgeloop( /* setup */ BM_mesh_elem_table_ensure(em->bm, BM_FACE); - vmap = BM_uv_vert_map_create(em->bm, limit, false, false); + vmap = BM_uv_vert_map_create(em->bm, false, false); BM_mesh_elem_index_ensure(em->bm, BM_VERT | BM_FACE); @@ -1064,12 +1051,8 @@ static int uv_select_edgeloop( /** \name Edge Ring Select * \{ */ -static int uv_select_edgering(const SpaceImage *sima, - Scene *scene, - Object *obedit, - UvNearestHit *hit, - const float limit[2], - const bool extend) +static int uv_select_edgering( + const SpaceImage *sima, Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend) { BMEditMesh *em = BKE_editmesh_from_object(obedit); bool select; @@ -1091,8 +1074,7 @@ static int uv_select_edgering(const SpaceImage *sima, BMLoop *l_pair[2] = { hit->l, - uvedit_loop_find_other_radial_loop_with_visible_face( - scene, hit->l, limit, cd_loop_uv_offset), + uvedit_loop_find_other_radial_loop_with_visible_face(scene, hit->l, cd_loop_uv_offset), }; for (int side = 0; side < 2; side++) { @@ -1104,11 +1086,11 @@ static int uv_select_edgering(const SpaceImage *sima, } uvedit_face_select_set_with_sticky( - sima, scene, em, l_step->f, select, false, limit, cd_loop_uv_offset); + sima, scene, em, l_step->f, select, false, cd_loop_uv_offset); 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, limit, cd_loop_uv_offset); + scene, l_step->next->next, cd_loop_uv_offset); } } @@ -1124,7 +1106,6 @@ static int uv_select_edgering(const SpaceImage *sima, static void uv_select_linked_multi(Scene *scene, Object **objects, const uint objects_len, - const float limit[2], UvNearestHit *hit_final, bool extend, bool deselect, @@ -1159,7 +1140,7 @@ static void uv_select_linked_multi(Scene *scene, * * Better solve this by having a delimit option for select-linked operator, * keeping island-select working as is. */ - vmap = BM_uv_vert_map_create(em->bm, limit, !select_faces, false); + vmap = BM_uv_vert_map_create(em->bm, !select_faces, false); if (vmap == NULL) { continue; @@ -1659,13 +1640,8 @@ void UV_OT_select_all(wmOperatorType *ot) /** \name Mouse Select Operator * \{ */ -static bool uv_sticky_select(const float limit[2], - const int hitv[], - int v, - float *hituv[], - const float uv[2], - int sticky, - int hitlen) +static bool uv_sticky_select( + const int hitv[], int v, float *hituv[], const float uv[2], int sticky, int hitlen) { /* This function test if some vertex needs to selected * in addition to the existing ones due to sticky select */ @@ -1676,7 +1652,7 @@ static bool uv_sticky_select(const float limit[2], for (int i = 0; i < hitlen; i++) { if (hitv[i] == v) { if (sticky == SI_STICKY_LOC) { - if (fabsf(hituv[i][0] - uv[0]) < limit[0] && fabsf(hituv[i][1] - uv[1]) < limit[1]) { + if (equals_v2v2(hituv[i], uv)) { return true; } } @@ -1711,10 +1687,9 @@ static int uv_mouse_select_multi(bContext *C, /* 0 == don't flush, 1 == sel, -1 == desel; only use when selection sync is enabled */ int flush = 0; int hitlen = 0; - float limit[2], **hituv = NULL; + float **hituv = NULL; const float penalty_dist = uv_select_penalty_default(sima); - uv_select_limit_default(sima, limit); /* retrieve operation mode */ if (ts->uv_flag & UV_SYNC_SELECTION) { @@ -1838,7 +1813,7 @@ static int uv_mouse_select_multi(bContext *C, } /* Current behavior of 'extend' * is actually toggling, so pass extend flag as 'toggle' here */ - uv_select_linked_multi(scene, objects, objects_len, limit, &hit, false, false, extend, false); + uv_select_linked_multi(scene, objects, objects_len, &hit, false, false, extend, false); } else if (extend) { if (selectmode == UV_SELECT_VERTEX) { @@ -1879,8 +1854,7 @@ static int uv_mouse_select_multi(bContext *C, BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) { luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - if (uv_sticky_select( - limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen)) { + if (uv_sticky_select(hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen)) { uvedit_uv_select_set(scene, em, l, select, false, cd_loop_uv_offset); } } @@ -1921,8 +1895,7 @@ static int uv_mouse_select_multi(bContext *C, } luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset); - if (uv_sticky_select( - limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen)) { + if (uv_sticky_select(hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen)) { uvedit_uv_select_enable(scene, em, l, false, cd_loop_uv_offset); } @@ -2047,7 +2020,6 @@ static int uv_mouse_select_loop_generic_multi(bContext *C, bool found_item = false; /* 0 == don't flush, 1 == sel, -1 == desel; only use when selection sync is enabled */ int flush = 0; - float limit[2]; /* Find edge. */ found_item = uv_find_nearest_edge_multi(scene, objects, objects_len, co, &hit); @@ -2058,8 +2030,6 @@ static int uv_mouse_select_loop_generic_multi(bContext *C, Object *obedit = hit.ob; BMEditMesh *em = BKE_editmesh_from_object(obedit); - uv_select_limit_default(sima, limit); - /* Do selection. */ if (!extend) { /* TODO(MULTI_EDIT): We only need to de-select non-active */ @@ -2067,10 +2037,10 @@ static int uv_mouse_select_loop_generic_multi(bContext *C, } if (loop_type == UV_LOOP_SELECT) { - flush = uv_select_edgeloop(scene, obedit, &hit, limit, extend); + flush = uv_select_edgeloop(scene, obedit, &hit, extend); } else if (loop_type == UV_RING_SELECT) { - flush = uv_select_edgering(sima, scene, obedit, &hit, limit, extend); + flush = uv_select_edgering(sima, scene, obedit, &hit, extend); } else { BLI_assert(0); @@ -2227,11 +2197,9 @@ void UV_OT_select_edge_ring(wmOperatorType *ot) static int uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent *event, bool pick) { - SpaceImage *sima = CTX_wm_space_image(C); Scene *scene = CTX_data_scene(C); const ToolSettings *ts = scene->toolsettings; ViewLayer *view_layer = CTX_data_view_layer(C); - float limit[2]; bool extend = true; bool deselect = false; bool select_faces = (ts->uv_flag & UV_SYNC_SELECTION) && (ts->selectmode & SCE_SELECT_FACE); @@ -2249,7 +2217,6 @@ 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"); } - uv_select_limit_default(sima, limit); uint objects_len = 0; Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs( @@ -2280,15 +2247,8 @@ static int uv_select_linked_internal(bContext *C, wmOperator *op, const wmEvent uv_select_all_perform_multi(scene, objects, objects_len, SEL_DESELECT); } - uv_select_linked_multi(scene, - objects, - objects_len, - limit, - pick ? &hit : NULL, - extend, - deselect, - false, - select_faces); + uv_select_linked_multi( + scene, objects, objects_len, pick ? &hit : NULL, extend, deselect, false, select_faces); /* weak!, but works */ Object **objects_free = objects; @@ -2633,13 +2593,10 @@ static void uv_select_flush_from_tag_face(SpaceImage *sima, } else if ((ts->uv_flag & UV_SYNC_SELECTION) == 0 && sima->sticky == SI_STICKY_LOC) { struct UvVertMap *vmap; - float limit[2]; uint efa_index; - uv_select_limit_default(sima, limit); - BM_mesh_elem_table_ensure(em->bm, BM_FACE); - vmap = BM_uv_vert_map_create(em->bm, limit, false, false); + vmap = BM_uv_vert_map_create(em->bm, false, false); if (vmap == NULL) { return; } @@ -2720,13 +2677,10 @@ static void uv_select_flush_from_tag_loop(SpaceImage *sima, } else if ((ts->uv_flag & UV_SYNC_SELECTION) == 0 && sima->sticky == SI_STICKY_LOC) { struct UvVertMap *vmap; - float limit[2]; uint efa_index; - uv_select_limit_default(sima, limit); - BM_mesh_elem_table_ensure(em->bm, BM_FACE); - vmap = BM_uv_vert_map_create(em->bm, limit, false, false); + vmap = BM_uv_vert_map_create(em->bm, false, false); if (vmap == NULL) { return; } @@ -2774,7 +2728,6 @@ static int uv_box_select_exec(bContext *C, wmOperator *op) MLoopUV *luv; rctf rectf; bool pinned; - float limit[2]; const bool use_face_center = ((ts->uv_flag & UV_SYNC_SELECTION) ? (ts->selectmode == SCE_SELECT_FACE) : (ts->uv_selectmode == UV_SELECT_FACE)); @@ -2792,8 +2745,6 @@ static int uv_box_select_exec(bContext *C, wmOperator *op) pinned = RNA_boolean_get(op->ptr, "pinned"); - uv_select_limit_default(sima, limit); - bool changed_multi = false; uint objects_len = 0; @@ -2905,8 +2856,7 @@ static int uv_box_select_exec(bContext *C, wmOperator *op) .ob = obedit, .efa = efa, }; - uv_select_linked_multi( - scene, objects, objects_len, limit, &hit, true, !select, false, false); + uv_select_linked_multi(scene, objects, objects_len, &hit, true, !select, false, false); } } @@ -3001,7 +2951,7 @@ static int uv_circle_select_exec(bContext *C, wmOperator *op) MLoopUV *luv; int x, y, radius, width, height; float zoomx, zoomy; - float limit[2], offset[2], ellipse[2]; + float offset[2], ellipse[2]; const bool use_face_center = ((ts->uv_flag & UV_SYNC_SELECTION) ? (ts->selectmode == SCE_SELECT_FACE) : @@ -3025,8 +2975,6 @@ static int uv_circle_select_exec(bContext *C, wmOperator *op) UI_view2d_region_to_view(®ion->v2d, x, y, &offset[0], &offset[1]); - uv_select_limit_default(sima, limit); - bool changed_multi = false; uint objects_len = 0; @@ -3128,8 +3076,7 @@ static int uv_circle_select_exec(bContext *C, wmOperator *op) .ob = obedit, .efa = efa, }; - uv_select_linked_multi( - scene, objects, objects_len, limit, &hit, true, !select, false, false); + uv_select_linked_multi(scene, objects, objects_len, &hit, true, !select, false, false); } } @@ -3220,12 +3167,9 @@ static bool do_lasso_select_mesh_uv(bContext *C, BMFace *efa; BMLoop *l; - float limit[2]; bool changed_multi = false; rcti rect; - uv_select_limit_default(sima, limit); - BLI_lasso_boundbox(&rect, mcoords, mcoords_len); uint objects_len = 0; @@ -3327,8 +3271,7 @@ static bool do_lasso_select_mesh_uv(bContext *C, .ob = obedit, .efa = efa, }; - uv_select_linked_multi( - scene, objects, objects_len, limit, &hit, true, !select, false, false); + uv_select_linked_multi(scene, objects, objects_len, &hit, true, !select, false, false); } } |