[Bf-blender-cvs] [6672b5373f1] master: Fix T103971: uv packing wasn't ignoring uv islands on hidden faces
Chris Blackbourn
noreply at git.blender.org
Fri Jan 20 04:33:11 CET 2023
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++) {
More information about the Bf-blender-cvs
mailing list