From 571bab615ce7bb643bf1b591d92e2c7ceeda1b79 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 13 Mar 2025 14:40:56 +1100 Subject: [PATCH] UV: skip adding UV data layers when sync-select is used When sync select is enabled, the data layers aren't accessed so there is no need to add them. Also skip adding a "pin" layer when clearing pinned UV's. --- source/blender/bmesh/intern/bmesh_interp.cc | 14 ++ source/blender/bmesh/intern/bmesh_interp.hh | 7 + source/blender/editors/uvedit/uvedit_ops.cc | 44 +++- .../blender/editors/uvedit/uvedit_select.cc | 217 +++++++++++++----- 4 files changed, 213 insertions(+), 69 deletions(-) diff --git a/source/blender/bmesh/intern/bmesh_interp.cc b/source/blender/bmesh/intern/bmesh_interp.cc index 2a6389896b9..39f0232824d 100644 --- a/source/blender/bmesh/intern/bmesh_interp.cc +++ b/source/blender/bmesh/intern/bmesh_interp.cc @@ -924,6 +924,20 @@ void BM_uv_map_ensure_pin_attr(BMesh *bm, const StringRef uv_map_name) bm, &bm->ldata, CD_PROP_BOOL, BKE_uv_map_pin_name_get(uv_map_name, name)); } +bool BM_uv_map_has_vert_select_attr(const BMesh *bm, const StringRef uv_map_name) +{ + char name[MAX_CUSTOMDATA_LAYER_NAME]; + return (CustomData_get_named_layer_index( + &bm->ldata, CD_PROP_BOOL, BKE_uv_map_vert_select_name_get(uv_map_name, name)) != -1); +} + +bool BM_uv_map_has_pin_attr(const BMesh *bm, const StringRef uv_map_name) +{ + char name[MAX_CUSTOMDATA_LAYER_NAME]; + return (CustomData_get_named_layer_index( + &bm->ldata, CD_PROP_BOOL, BKE_uv_map_pin_name_get(uv_map_name, name)) != -1); +} + void BM_data_layer_free(BMesh *bm, CustomData *data, int type) { CustomData olddata = *data; diff --git a/source/blender/bmesh/intern/bmesh_interp.hh b/source/blender/bmesh/intern/bmesh_interp.hh index 1e70dffff4d..f0c41bd84c6 100644 --- a/source/blender/bmesh/intern/bmesh_interp.hh +++ b/source/blender/bmesh/intern/bmesh_interp.hh @@ -65,6 +65,10 @@ void BM_data_interp_face_vert_edge( void BM_data_layer_add(BMesh *bm, CustomData *data, int type); void BM_data_layer_add_named(BMesh *bm, CustomData *data, int type, blender::StringRef name); void BM_data_layer_ensure_named(BMesh *bm, CustomData *data, int type, blender::StringRef name); +bool BM_data_layer_has_named(const BMesh *bm, + const CustomData *data, + int type, + blender::StringRef name); void BM_data_layer_free(BMesh *bm, CustomData *data, int type); /** Ensure the dependent boolean layers exist for all face corner #CD_PROP_FLOAT2 layers. */ @@ -74,6 +78,9 @@ void BM_uv_map_ensure_vert_select_attr(BMesh *bm, blender::StringRef uv_map_name void BM_uv_map_ensure_edge_select_attr(BMesh *bm, blender::StringRef uv_map_name); void BM_uv_map_ensure_pin_attr(BMesh *bm, blender::StringRef uv_map_name); +bool BM_uv_map_has_vert_select_attr(const BMesh *bm, blender::StringRef uv_map_name); +bool BM_uv_map_has_pin_attr(const BMesh *bm, blender::StringRef uv_map_name); + /** * Remove a named custom data layer, if it existed. Return true if the layer was removed. */ diff --git a/source/blender/editors/uvedit/uvedit_ops.cc b/source/blender/editors/uvedit/uvedit_ops.cc index 7492efe43ba..e686379034d 100644 --- a/source/blender/editors/uvedit/uvedit_ops.cc +++ b/source/blender/editors/uvedit/uvedit_ops.cc @@ -1299,14 +1299,26 @@ static int uv_pin_exec(bContext *C, wmOperator *op) BMEditMesh *em = BKE_editmesh_from_object(obedit); bool changed = false; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_pin_attr(em->bm, active_uv_name); - const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); - if (synced_selection && (em->bm->totvertsel == 0)) { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); + if (synced_selection) { + if (em->bm->totvertsel == 0) { + continue; + } + } + else { + if (!BM_uv_map_has_vert_select_attr(em->bm, active_uv_name)) { + continue; + } + } + + if (clear && !BM_uv_map_has_pin_attr(em->bm, active_uv_name)) { continue; } + BM_uv_map_ensure_pin_attr(em->bm, active_uv_name); + const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); + BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { if (!uvedit_face_visible_test(scene, efa)) { continue; @@ -1407,9 +1419,15 @@ static int uv_hide_exec(bContext *C, wmOperator *op) BMLoop *l; BMIter iter, liter; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if (ts->uv_flag & UV_SYNC_SELECTION) { @@ -1574,9 +1592,15 @@ static int uv_reveal_exec(bContext *C, wmOperator *op) BMLoop *l; BMIter iter, liter; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); /* NOTE: Selecting faces is delayed so that it doesn't select verts/edges and confuse certain diff --git a/source/blender/editors/uvedit/uvedit_select.cc b/source/blender/editors/uvedit/uvedit_select.cc index f378326e506..f66bcb9f84b 100644 --- a/source/blender/editors/uvedit/uvedit_select.cc +++ b/source/blender/editors/uvedit/uvedit_select.cc @@ -1277,14 +1277,14 @@ static void bm_clear_uv_vert_selection(const Scene *scene, BMesh *bm, const BMUV void ED_uvedit_selectmode_flush(const Scene *scene, BMEditMesh *em) { const ToolSettings *ts = scene->toolsettings; + BLI_assert((ts->uv_flag & UV_SYNC_SELECTION) == 0); + UNUSED_VARS_NDEBUG(ts); + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); - BLI_assert((ts->uv_flag & UV_SYNC_SELECTION) == 0); - UNUSED_VARS_NDEBUG(ts); - /* Vertex Mode only. */ if (ts->uv_selectmode & UV_SELECT_VERTEX) { BMFace *efa; @@ -1314,14 +1314,14 @@ void uvedit_select_flush(const Scene *scene, BMEditMesh *em) /* Careful when using this in face select mode. * For face selections with sticky mode enabled, this can create invalid selection states. */ const ToolSettings *ts = scene->toolsettings; + BLI_assert((ts->uv_flag & UV_SYNC_SELECTION) == 0); + UNUSED_VARS_NDEBUG(ts); + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); - BLI_assert((ts->uv_flag & UV_SYNC_SELECTION) == 0); - UNUSED_VARS_NDEBUG(ts); - BMFace *efa; BMLoop *l; BMIter iter, liter; @@ -1342,14 +1342,14 @@ void uvedit_select_flush(const Scene *scene, BMEditMesh *em) void uvedit_deselect_flush(const Scene *scene, BMEditMesh *em) { const ToolSettings *ts = scene->toolsettings; + BLI_assert((ts->uv_flag & UV_SYNC_SELECTION) == 0); + UNUSED_VARS_NDEBUG(ts); + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); - BLI_assert((ts->uv_flag & UV_SYNC_SELECTION) == 0); - UNUSED_VARS_NDEBUG(ts); - BMFace *efa; BMLoop *l; BMIter iter, liter; @@ -1540,6 +1540,9 @@ static int uv_select_edgeloop(Scene *scene, Object *obedit, UvNearestHit *hit, c BMEditMesh *em = BKE_editmesh_from_object(obedit); bool select; + /* NOTE: this is a special case, even when sync select is enabled, + * the flags are used then flushed to the vertices. + * So these need to be ensured even though the layers aren't used afterwards. */ const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); @@ -1623,12 +1626,18 @@ static int uv_select_edgeloop(Scene *scene, Object *obedit, UvNearestHit *hit, c static int uv_select_faceloop(Scene *scene, Object *obedit, UvNearestHit *hit, const bool extend) { + const ToolSettings *ts = scene->toolsettings; BMEditMesh *em = BKE_editmesh_from_object(obedit); bool select; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if (!extend) { @@ -1698,9 +1707,15 @@ static int uv_select_edgering(Scene *scene, Object *obedit, UvNearestHit *hit, c (ts->uv_selectmode & UV_SELECT_VERTEX); bool select; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } + const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if (!extend) { @@ -1811,10 +1826,18 @@ static void uv_select_linked_multi(Scene *scene, char *flag; BMEditMesh *em = BKE_editmesh_from_object(obedit); - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BLI_assert(active_uv_name != nullptr); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + + if (uv_sync_select) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BLI_assert(active_uv_name != nullptr); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } + const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); BM_mesh_elem_table_ensure(em->bm, BM_FACE); /* we can use this too */ @@ -2056,9 +2079,15 @@ static int uv_select_more_less(bContext *C, const bool select) bool changed = false; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if (ts->uv_flag & UV_SYNC_SELECTION) { @@ -2260,6 +2289,10 @@ bool uvedit_select_is_any_selected_multi(const Scene *scene, const Spantoolsettings; + BLI_assert((ts->uv_flag & UV_SYNC_SELECTION) == 0); + UNUSED_VARS_NDEBUG(ts); + BMFace *efa; BMLoop *l; BMIter iter, liter; @@ -2521,10 +2554,17 @@ static bool uv_mouse_select_multi(bContext *C, if (found) { Object *obedit = hit.ob; BMEditMesh *em = BKE_editmesh_from_object(obedit); - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); + if (selectmode == UV_SELECT_FACE) { is_selected = uvedit_face_select_test(scene, hit.efa, offsets); } @@ -2560,9 +2600,16 @@ static bool uv_mouse_select_multi(bContext *C, if (found) { Object *obedit = hit.ob; BMEditMesh *em = BKE_editmesh_from_object(obedit); - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if (selectmode == UV_SELECT_ISLAND) { @@ -3288,9 +3335,16 @@ static void uv_select_flush_from_tag_face(const Scene *scene, Object *obedit, co BMFace *efa; BMLoop *l; BMIter iter, liter; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } + const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if ((ts->uv_flag & UV_SYNC_SELECTION) == 0 && @@ -3358,9 +3412,14 @@ static void uv_select_flush_from_tag_loop(const Scene *scene, Object *obedit, co BMLoop *l; BMIter iter, liter; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if ((ts->uv_flag & UV_SYNC_SELECTION) == 0 && ts->uv_sticky == SI_STICKY_VERTEX) { @@ -3432,9 +3491,14 @@ static void uv_select_flush_from_loop_edge_flag(const Scene *scene, BMEditMesh * BMLoop *l; BMIter iter, liter; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if ((ts->uv_flag & UV_SYNC_SELECTION) == 0 && @@ -3502,7 +3566,6 @@ static int uv_box_select_exec(bContext *C, wmOperator *op) BMIter iter, liter; float *luv; rctf rectf; - bool pinned; const bool use_face_center = ((ts->uv_flag & UV_SYNC_SELECTION) ? (ts->selectmode == SCE_SELECT_FACE) : (ts->uv_selectmode == UV_SELECT_FACE)); @@ -3520,7 +3583,7 @@ static int uv_box_select_exec(bContext *C, wmOperator *op) const bool select = (sel_op != SEL_OP_SUB); const bool use_pre_deselect = SEL_OP_USE_PRE_DESELECT(sel_op); - pinned = RNA_boolean_get(op->ptr, "pinned"); + const bool pinned = RNA_boolean_get(op->ptr, "pinned"); bool changed_multi = false; @@ -3537,10 +3600,20 @@ static int uv_box_select_exec(bContext *C, wmOperator *op) bool changed = false; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_pin_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + + /* NOTE: sync selection can't do pinned. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (pinned) { + BM_uv_map_ensure_pin_attr(em->bm, active_uv_name); + } + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); /* do actual selection */ @@ -3787,9 +3860,15 @@ static int uv_circle_select_exec(bContext *C, wmOperator *op) bool changed = false; - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); /* do selection */ @@ -3983,9 +4062,15 @@ static bool do_lasso_select_mesh_uv(bContext *C, const Span mcoords, const BMEditMesh *em = BKE_editmesh_from_object(obedit); - const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, + CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); if (use_face_center) { /* Face Center Select. */ @@ -4165,11 +4250,19 @@ static int uv_select_pinned_exec(bContext *C, wmOperator *op) for (Object *obedit : objects) { BMEditMesh *em = BKE_editmesh_from_object(obedit); - bool changed = false; const char *active_uv_name = CustomData_get_active_layer_name(&em->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); - BM_uv_map_ensure_pin_attr(em->bm, active_uv_name); + if (!BM_uv_map_has_pin_attr(em->bm, active_uv_name)) { + continue; + } + + bool changed = false; + if (ts->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + BM_uv_map_ensure_vert_select_attr(em->bm, active_uv_name); + BM_uv_map_ensure_edge_select_attr(em->bm, active_uv_name); + } const BMUVOffsets offsets = BM_uv_map_get_offsets(em->bm); BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) { @@ -4438,12 +4531,18 @@ static int uv_select_overlap(bContext *C, const bool extend) BMEditMesh *em_b = BKE_editmesh_from_object(obedit_b); BMFace *face_a = em_a->bm->ftable[o_a->face_index]; BMFace *face_b = em_b->bm->ftable[o_b->face_index]; - const char *uv_a_name = CustomData_get_active_layer_name(&em_a->bm->ldata, CD_PROP_FLOAT2); - const char *uv_b_name = CustomData_get_active_layer_name(&em_b->bm->ldata, CD_PROP_FLOAT2); - BM_uv_map_ensure_vert_select_attr(em_a->bm, uv_a_name); - BM_uv_map_ensure_vert_select_attr(em_b->bm, uv_b_name); - BM_uv_map_ensure_edge_select_attr(em_a->bm, uv_a_name); - BM_uv_map_ensure_edge_select_attr(em_b->bm, uv_b_name); + + if (scene->toolsettings->uv_flag & UV_SYNC_SELECTION) { + /* Pass. */ + } + else { + const char *uv_a_name = CustomData_get_active_layer_name(&em_a->bm->ldata, CD_PROP_FLOAT2); + const char *uv_b_name = CustomData_get_active_layer_name(&em_b->bm->ldata, CD_PROP_FLOAT2); + BM_uv_map_ensure_vert_select_attr(em_a->bm, uv_a_name); + BM_uv_map_ensure_vert_select_attr(em_b->bm, uv_b_name); + BM_uv_map_ensure_edge_select_attr(em_a->bm, uv_a_name); + BM_uv_map_ensure_edge_select_attr(em_b->bm, uv_b_name); + } const BMUVOffsets offsets_a = BM_uv_map_get_offsets(em_a->bm); const BMUVOffsets offsets_b = BM_uv_map_get_offsets(em_b->bm);