[Bf-blender-cvs] [4767a8eb4aa] master: Cleanup: simplify uv packing api

Chris Blackbourn noreply at git.blender.org
Thu Oct 13 12:13:16 CEST 2022


Commit: 4767a8eb4aae460ecbee8e6c3eacf4aa81a24c07
Author: Chris Blackbourn
Date:   Thu Oct 13 23:06:52 2022 +1300
Branches: master
https://developer.blender.org/rB4767a8eb4aae460ecbee8e6c3eacf4aa81a24c07

Cleanup: simplify uv packing api

Affects paint.add_simple_uvs

No user visible changes.

Differential Revision: https://developer.blender.org/D16231

===================================================================

M	source/blender/editors/include/ED_uvedit.h
M	source/blender/editors/uvedit/uvedit_islands.cc
M	source/blender/editors/uvedit/uvedit_unwrap_ops.c

===================================================================

diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index e485fd2b061..c8ffbb9acb1 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -361,9 +361,24 @@ struct UVPackIsland_Params {
 bool uv_coords_isect_udim(const struct Image *image,
                           const int udim_grid[2],
                           const float coords[2]);
+
+/**
+ * Pack UV islands from multiple objects.
+ *
+ * \param scene: Scene containing the objects to be packed.
+ * \param objects: Array of Objects to pack.
+ * \param objects_len: Length of `objects` array.
+ * \param bmesh_override: BMesh array aligned with `objects`.
+ * Optional, when non-null this overrides object's BMesh.
+ * This is needed to perform UV packing on objects that aren't in edit-mode.
+ * \param udim_params: Parameters to specify UDIM target and UDIM source image.
+ * \param params: Parameters and options to pass to the packing engine.
+ *
+ */
 void ED_uvedit_pack_islands_multi(const struct Scene *scene,
                                   Object **objects,
                                   uint objects_len,
+                                  struct BMesh **bmesh_override,
                                   const struct UVMapUDIM_Params *udim_params,
                                   const struct UVPackIsland_Params *params);
 
diff --git a/source/blender/editors/uvedit/uvedit_islands.cc b/source/blender/editors/uvedit/uvedit_islands.cc
index 4009447ba7e..bdd05b06d94 100644
--- a/source/blender/editors/uvedit/uvedit_islands.cc
+++ b/source/blender/editors/uvedit/uvedit_islands.cc
@@ -609,6 +609,7 @@ static BoxPack *pack_islands_params(const blender::Vector<FaceIsland *> &island_
 void ED_uvedit_pack_islands_multi(const Scene *scene,
                                   Object **objects,
                                   const uint objects_len,
+                                  BMesh **bmesh_override,
                                   const struct UVMapUDIM_Params *udim_params,
                                   const struct UVPackIsland_Params *params)
 {
@@ -616,9 +617,17 @@ void ED_uvedit_pack_islands_multi(const Scene *scene,
 
   for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
     Object *obedit = objects[ob_index];
-    BMEditMesh *em = BKE_editmesh_from_object(obedit);
-
-    const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+    BMesh *bm = nullptr;
+    if (bmesh_override) {
+      /* Note: obedit is still required for aspect ratio and ID_RECALC_GEOMETRY. */
+      bm = bmesh_override[ob_index];
+    }
+    else {
+      BMEditMesh *em = BKE_editmesh_from_object(obedit);
+      bm = em->bm;
+    }
+    BLI_assert(bm);
+    const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
     if (cd_loop_uv_offset == -1) {
       continue;
     }
@@ -634,7 +643,7 @@ void ED_uvedit_pack_islands_multi(const Scene *scene,
 
     ListBase island_list = {nullptr};
     bm_mesh_calc_uv_islands(scene,
-                            em->bm,
+                            bm,
                             &island_list,
                             params->only_selected_faces,
                             params->only_selected_uvs,
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index cedca88de6a..2c977552e72 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -1050,25 +1050,6 @@ void UV_OT_minimize_stretch(wmOperatorType *ot)
 /** \name Pack UV Islands Operator
  * \{ */
 
-static void uvedit_pack_islands(const Scene *scene, Object *ob, BMesh *bm)
-{
-  const UnwrapOptions options = {
-      .topology_from_uvs = true,
-      .only_selected_faces = false,
-      .only_selected_uvs = true,
-      .fill_holes = false,
-      .correct_aspect = false,
-  };
-
-  bool rotate = true;
-  bool ignore_pinned = false;
-
-  ParamHandle *handle = construct_param_handle(scene, ob, bm, &options, NULL);
-  GEO_uv_parametrizer_pack(handle, scene->toolsettings->uvcalc_margin, rotate, ignore_pinned);
-  GEO_uv_parametrizer_flush(handle);
-  GEO_uv_parametrizer_delete(handle);
-}
-
 /**
  * \warning Since this uses #ParamHandle it doesn't work with non-manifold meshes (see T82637).
  * Use #ED_uvedit_pack_islands_multi for a more general solution.
@@ -1147,7 +1128,7 @@ static int pack_islands_exec(bContext *C, wmOperator *op)
       .margin = RNA_float_get(op->ptr, "margin"),
   };
   ED_uvedit_pack_islands_multi(
-      scene, objects, objects_len, use_udim_params ? &udim_params : NULL, &params);
+      scene, objects, objects_len, NULL, use_udim_params ? &udim_params : NULL, &params);
 
   MEM_freeN(objects);
   return OPERATOR_FINISHED;
@@ -2439,7 +2420,7 @@ static int smart_project_exec(bContext *C, wmOperator *op)
         .margin_method = RNA_enum_get(op->ptr, "margin_method"),
         .margin = RNA_float_get(op->ptr, "island_margin"),
     };
-    ED_uvedit_pack_islands_multi(scene, objects_changed, object_changed_len, NULL, &params);
+    ED_uvedit_pack_islands_multi(scene, objects_changed, object_changed_len, NULL, NULL, &params);
 
     /* #ED_uvedit_pack_islands_multi only supports `per_face_aspect = false`. */
     const bool per_face_aspect = false;
@@ -3180,13 +3161,24 @@ void ED_uvedit_add_simple_uvs(Main *bmain, const Scene *scene, Object *ob)
                          .calc_face_normal = true,
                          .calc_vert_normal = true,
                      }));
-  /* select all uv loops first - pack parameters needs this to make sure charts are registered */
+  /* Select all UVs for cube_project. */
   ED_uvedit_select_all(bm);
   /* A cube size of 2.0 maps [-1..1] vertex coords to [0.0..1.0] in UV coords. */
   uvedit_unwrap_cube_project(scene, bm, 2.0, false, false, NULL);
-  /* Set the margin really quickly before the packing operation. */
-  scene->toolsettings->uvcalc_margin = 0.001f;
-  uvedit_pack_islands(scene, ob, bm);
+
+  /* Pack UVs. */
+  const struct UVPackIsland_Params params = {
+      .rotate = true,
+      .only_selected_uvs = false,
+      .only_selected_faces = false,
+      .correct_aspect = false,
+      .use_seams = true,
+      .margin_method = ED_UVPACK_MARGIN_SCALED,
+      .margin = 0.001f,
+  };
+  ED_uvedit_pack_islands_multi(scene, &ob, 1, &bm, NULL, &params);
+
+  /* Write back from BMesh to Mesh. */
   BM_mesh_bm_to_me(bmain, bm, me, (&(struct BMeshToMeshParams){0}));
   BM_mesh_free(bm);



More information about the Bf-blender-cvs mailing list