[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