[Bf-blender-cvs] [71ac20ef187] refactor-mesh-uv-map-generic: Create associated UV bool layers on BMesh creation.

Martijn Versteegh noreply at git.blender.org
Thu Nov 24 13:31:53 CET 2022


Commit: 71ac20ef187ae80ec76a2a6c16f8a35bc4b8f227
Author: Martijn Versteegh
Date:   Thu Nov 24 13:02:46 2022 +0100
Branches: refactor-mesh-uv-map-generic
https://developer.blender.org/rB71ac20ef187ae80ec76a2a6c16f8a35bc4b8f227

Create associated UV bool layers on BMesh creation.

Because on-demand allocation of the associated bool layers can lead to
problems for the BMesh python api (adding layers in a BMesh reallocates
the CustomData blocks, thus making existing pointers in python objects
invalid) always create the layers when converting to a BMesh.

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

M	source/blender/bmesh/intern/bmesh_mesh_convert.cc

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

diff --git a/source/blender/bmesh/intern/bmesh_mesh_convert.cc b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
index d4be23a44a8..e7f5e0b8faa 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_convert.cc
+++ b/source/blender/bmesh/intern/bmesh_mesh_convert.cc
@@ -148,7 +148,38 @@ void BM_mesh_bm_from_me(BMesh *bm, const Mesh *me, const struct BMeshFromMeshPar
                                                                               mask.pmask);
   CustomData mesh_ldata = CustomData_shallow_copy_remove_non_bmesh_attributes(&me->ldata,
                                                                               mask.lmask);
+
+  blender::Vector<std::string> temporary_layers_to_delete;
+
+  for (size_t l = 0; l < CustomData_number_of_layers(&mesh_ldata, CD_PROP_FLOAT2); l++)
+  {
+    char name[MAX_CUSTOMDATA_LAYER_NAME];
+    get_uv_map_vert_selection_name(CustomData_get_layer_name(&mesh_ldata, CD_PROP_FLOAT2, l), name);
+    if (CustomData_get_named_layer_index(&mesh_ldata, CD_PROP_BOOL, name) < 0)
+    {
+        CustomData_add_layer_named(&mesh_ldata, CD_PROP_BOOL, CD_SET_DEFAULT, nullptr, me->totloop, name);
+        temporary_layers_to_delete.append(std::string(name));
+    }
+    get_uv_map_edge_selection_name(CustomData_get_layer_name(&mesh_ldata, CD_PROP_FLOAT2, l), name);
+    if (CustomData_get_named_layer_index(&mesh_ldata, CD_PROP_BOOL, name) < 0)
+    {
+        CustomData_add_layer_named(&mesh_ldata, CD_PROP_BOOL, CD_SET_DEFAULT, nullptr, me->totloop, name);
+        temporary_layers_to_delete.append(std::string(name));
+    }
+    get_uv_map_pin_name(CustomData_get_layer_name(&mesh_ldata, CD_PROP_FLOAT2, l), name);
+    if (CustomData_get_named_layer_index(&mesh_ldata, CD_PROP_BOOL, name) < 0)
+    {
+        CustomData_add_layer_named(&mesh_ldata, CD_PROP_BOOL, CD_SET_DEFAULT, nullptr, me->totloop, name);
+        temporary_layers_to_delete.append(std::string(name));
+    }
+  }
+
   BLI_SCOPED_DEFER([&]() {
+    for (auto n : temporary_layers_to_delete)
+    {
+        CustomData_free_layer_named(&mesh_ldata, n.c_str(), me->totloop);
+    }
+
     MEM_SAFE_FREE(mesh_vdata.layers);
     MEM_SAFE_FREE(mesh_edata.layers);
     MEM_SAFE_FREE(mesh_pdata.layers);



More information about the Bf-blender-cvs mailing list