Commit: 6672b5373f172e32351ee4d233c8a434ff95417a Author: Chris Blackbourn Date: Fri Jan 20 13:18:38 2023 +1300 Branches: master https://developer.blender.org/rB6672b5373f172e32351ee4d233c8a434ff95417a
Fix T103971: uv packing wasn't ignoring uv islands on hidden faces Fixes the packing operators that use ED_uvedit_pack_islands_multi Also fixes UV Select Similar with hidden UV islands. Packing operators using GEO_uv_parametrizer should remain unchanged. Add a check to BM_elem_flag_test(efa, BM_ELEM_HIDDEN). Note that BM_mesh_calc_face_groups doesn't easily support XOR of flags, requiring logic to be moved to a preprocess step on BM_ELEM_TAG. Regression in rBe3075f3cf7ce. Differential Revision: https://developer.blender.org/D17055 =================================================================== M source/blender/editors/uvedit/uvedit_islands.cc =================================================================== diff --git a/source/blender/editors/uvedit/uvedit_islands.cc b/source/blender/editors/uvedit/uvedit_islands.cc index ad4527affb8..2d1db757fb5 100644 --- a/source/blender/editors/uvedit/uvedit_islands.cc +++ b/source/blender/editors/uvedit/uvedit_islands.cc @@ -335,6 +335,35 @@ static bool bm_loop_uv_shared_edge_check(const BMLoop *l_a, const BMLoop *l_b, v return BM_loop_uv_share_edge_check((BMLoop *)l_a, (BMLoop *)l_b, data->offsets.uv); } +/** + * returns true if `BMFace *efa` is able to be affected by a packing operation, given various + * parameters. + * + * Checks if it's (not) hidden, and optionally selected, and/or UV selected. + * + * Will eventually be superseded by `BM_uv_element_map_create()`. + * + * Loosely based on`uvedit_is_face_affected`, but "bug-compatible" with previous code. + */ +static bool uvedit_is_face_affected_for_calc_uv_islands(const Scene *scene, + BMFace *efa, + const bool only_selected_faces, + const bool only_selected_uvs, + const BMUVOffsets &uv_offsets) +{ + if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { + return false; + } + if (only_selected_faces) { + if (only_selected_uvs) { + return BM_elem_flag_test(efa, BM_ELEM_SELECT) && + uvedit_face_select_test(scene, efa, uv_offsets); + } + return BM_elem_flag_test(efa, BM_ELEM_SELECT); + } + return true; +} + /** * Calculate islands and add them to \a island_list returning the number of items added. */ @@ -356,25 +385,13 @@ int bm_mesh_calc_uv_islands(const Scene *scene, int(*group_index)[2]; - /* Calculate the tag to use. */ - uchar hflag_face_test = 0; - if (only_selected_faces) { - if (only_selected_uvs) { - BMFace *f; - BMIter iter; - BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { - bool value = false; - if (BM_elem_flag_test(f, BM_ELEM_SELECT) && - uvedit_face_select_test(scene, f, uv_offsets)) { - value = true; - } - BM_elem_flag_set(f, BM_ELEM_TAG, value); - } - hflag_face_test = BM_ELEM_TAG; - } - else { - hflag_face_test = BM_ELEM_SELECT; - } + /* Set the tag for `BM_mesh_calc_face_groups`. */ + BMFace *f; + BMIter iter; + BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { + const bool face_affected = uvedit_is_face_affected_for_calc_uv_islands( + scene, f, only_selected_faces, only_selected_uvs, uv_offsets); + BM_elem_flag_set(f, BM_ELEM_TAG, face_affected); } struct SharedUVLoopData user_data = {{0}}; @@ -387,7 +404,7 @@ int bm_mesh_calc_uv_islands(const Scene *scene, nullptr, bm_loop_uv_shared_edge_check, &user_data, - hflag_face_test, + BM_ELEM_TAG, BM_EDGE); for (int i = 0; i < group_len; i++) { _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs