[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