[Bf-blender-cvs] [2049960aa3d] refactor-mesh-uv-map-generic: Make BM_ensure_selection_and_pin_attributes() loop over all CD_PROP_FLOAT2 layers

Baardaap noreply at git.blender.org
Mon Dec 12 17:04:55 CET 2022


Commit: 2049960aa3d9de4d3c8d02d41d9949358b9f8574
Author: Baardaap
Date:   Mon Dec 12 17:00:00 2022 +0100
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rB2049960aa3d9de4d3c8d02d41d9949358b9f8574

Make BM_ensure_selection_and_pin_attributes() loop over all CD_PROP_FLOAT2 layers

Passing in the name does not work when adding layers, because the names passed
to CustomData_add_layer_named() can change the name to make it unique.

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

M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/bmesh/intern/bmesh_interp.h
M	source/blender/editors/mesh/mesh_data.cc
M	source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc
M	source/blender/python/bmesh/bmesh_py_types_customdata.c

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

diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index 7c13b2e7663..745257dd919 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -873,15 +873,19 @@ void BM_data_layer_ensure_named(BMesh *bm, CustomData *data, int type, const cha
   }
 }
 
-void BM_uv_map_ensure_selection_and_pin_attributes(BMesh *bm, const char *uv_map_name)
+void BM_uv_map_ensure_selection_and_pin_attributes(BMesh *bm)
 {
-  char name[MAX_CUSTOMDATA_LAYER_NAME];
-  BM_data_layer_ensure_named(
-      bm, &bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_vert_selection_name(uv_map_name, name));
-  BM_data_layer_ensure_named(
-      bm, &bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_edge_selection_name(uv_map_name, name));
-  BM_data_layer_ensure_named(
-      bm, &bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_pin_name(uv_map_name, name));
+  const int nr_uv_layers = CustomData_number_of_layers(&bm->ldata, CD_PROP_FLOAT2);
+  for (int l = 0; l < nr_uv_layers; l++ ) {
+    /* note: you can't re-use the returnvalue of CustomData_get_layer_name() because adding layers can invalidate that. */
+    char name[MAX_CUSTOMDATA_LAYER_NAME];
+    BM_data_layer_ensure_named(
+        bm, &bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_vert_selection_name(CustomData_get_layer_name(&bm->ldata, CD_PROP_FLOAT2, l), name));
+    BM_data_layer_ensure_named(
+        bm, &bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_edge_selection_name(CustomData_get_layer_name(&bm->ldata, CD_PROP_FLOAT2, l), name));
+    BM_data_layer_ensure_named(
+        bm, &bm->ldata, CD_PROP_BOOL, BKE_get_uv_map_pin_name(CustomData_get_layer_name(&bm->ldata, CD_PROP_FLOAT2, l), name));
+  }
 }
 
 void BM_uv_map_ensure_vert_selection_attribute(BMesh *bm, const char *uv_map_name)
diff --git a/source/blender/bmesh/intern/bmesh_interp.h b/source/blender/bmesh/intern/bmesh_interp.h
index 0b7b5197074..c7ce6d36453 100644
--- a/source/blender/bmesh/intern/bmesh_interp.h
+++ b/source/blender/bmesh/intern/bmesh_interp.h
@@ -65,7 +65,9 @@ void BM_data_layer_add_named(BMesh *bm, CustomData *data, int type, const char *
 void BM_data_layer_ensure_named(BMesh *bm, CustomData *data, int type, const char *name);
 void BM_data_layer_free(BMesh *bm, CustomData *data, int type);
 
-void BM_uv_map_ensure_selection_and_pin_attributes(BMesh *bm, const char *uv_map_name);
+/* This ensures the dependent bool layers exist for all CD_PROP_FLOAT2 layers */
+void BM_uv_map_ensure_selection_and_pin_attributes(BMesh *bm);
+
 void BM_uv_map_ensure_vert_selection_attribute(BMesh *bm, const char *uv_map_name);
 void BM_uv_map_ensure_edge_selection_attribute(BMesh *bm, const char *uv_map_name);
 void BM_uv_map_ensure_pin_attribute(BMesh *bm, const char *uv_map_name);
diff --git a/source/blender/editors/mesh/mesh_data.cc b/source/blender/editors/mesh/mesh_data.cc
index 496678ede3d..0c2d2eaf3d2 100644
--- a/source/blender/editors/mesh/mesh_data.cc
+++ b/source/blender/editors/mesh/mesh_data.cc
@@ -246,7 +246,7 @@ int ED_mesh_uv_add(
     }
 
     BM_data_layer_add_named(em->bm, &em->bm->ldata, CD_PROP_FLOAT2, name);
-    BM_uv_map_ensure_selection_and_pin_attributes(em->bm, name);
+    BM_uv_map_ensure_selection_and_pin_attributes(em->bm);
     /* copy data from active UV */
     if (layernum_dst && do_init) {
       const int layernum_src = CustomData_get_active_layer(&em->bm->ldata, CD_PROP_FLOAT2);
diff --git a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc
index 2543b21e7fb..4d59d904405 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_ico_sphere.cc
@@ -40,8 +40,7 @@ static Mesh *create_ico_sphere_mesh(const int subdivisions, const float radius)
    * Normally this would be done when adding a UV layer via python
    * or when copying from Mesh, but when we 'manually' create the UV layer
    * we need to make sure the bool layers exist as well. */
-  BM_uv_map_ensure_selection_and_pin_attributes(
-      bm, CustomData_get_layer_name(&bm->ldata, CD_PROP_FLOAT2, 0));
+  BM_uv_map_ensure_selection_and_pin_attributes(bm);
 
   BMO_op_callf(bm,
                BMO_FLAG_DEFAULTS,
diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c
index 659ec0bb104..97b13013793 100644
--- a/source/blender/python/bmesh/bmesh_py_types_customdata.c
+++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c
@@ -466,9 +466,7 @@ static PyObject *bpy_bmlayercollection_verify(BPy_BMLayerCollection *self)
     /* Because adding CustomData layers to a bmesh will invalidate any existing pointers
      * in Py objects we can't lazily add the associated bool layers. So add them all right
      * now. */
-    const char *active_uv_name = CustomData_get_active_layer_name(&self->bm->ldata,
-                                                                  CD_PROP_FLOAT2);
-    BM_uv_map_ensure_selection_and_pin_attributes(self->bm, active_uv_name);
+    BM_uv_map_ensure_selection_and_pin_attributes(self->bm);
   }
 
   BLI_assert(index >= 0);
@@ -515,9 +513,7 @@ static PyObject *bpy_bmlayercollection_new(BPy_BMLayerCollection *self, PyObject
     /* Because adding CustomData layers to a bmesh will invalidate any existing pointers
      * in Py objects we can't lazily add the associated bool layers. So add them all right
      * now. */
-    const char *active_uv_name = CustomData_get_active_layer_name(&self->bm->ldata,
-                                                                  CD_PROP_FLOAT2);
-    BM_uv_map_ensure_selection_and_pin_attributes(self->bm, active_uv_name);
+    BM_uv_map_ensure_selection_and_pin_attributes(self->bm);
   }
 
   index = CustomData_number_of_layers(data, self->type) - 1;



More information about the Bf-blender-cvs mailing list