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); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs