From d92edca86227b34c0899a523ce940c07b889ef9b Mon Sep 17 00:00:00 2001 From: Baardaap Date: Wed, 1 Feb 2023 12:13:20 +0100 Subject: [PATCH] Fix: CustomData layers become unsorted in versioning n versioning, when converting CD_SCULPT_FACE_SETS to CD_PROP_INT32 the layers were not kept properly ordered by type. This was discovered while investigating T104053 Differential Revision: D17165 --- .../blenkernel/intern/mesh_legacy_convert.cc | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index 5913751aac9..46de138fde7 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -1228,12 +1228,18 @@ void BKE_mesh_legacy_face_set_from_generic(Mesh *mesh, blender::MutableSpan poly_layers) { using namespace blender; + void *faceset_data = nullptr; for (CustomDataLayer &layer : poly_layers) { if (StringRef(layer.name) == ".sculpt_face_set") { - layer.type = CD_SCULPT_FACE_SETS; + faceset_data = layer.data; + layer.data = nullptr; + CustomData_free_layer_named(&mesh->pdata, ".sculpt_face_set", mesh->totpoly); + break; } } - CustomData_update_typemap(&mesh->pdata); + if (faceset_data != nullptr) { + CustomData_add_layer(&mesh->pdata, CD_SCULPT_FACE_SETS, CD_ASSIGN, faceset_data, mesh->totpoly); + } } void BKE_mesh_legacy_face_set_to_generic(Mesh *mesh) @@ -1242,13 +1248,18 @@ void BKE_mesh_legacy_face_set_to_generic(Mesh *mesh) if (mesh->attributes().contains(".sculpt_face_set")) { return; } - for (CustomDataLayer &layer : MutableSpan(mesh->pdata.layers, mesh->pdata.totlayer)) { - if (layer.type == CD_SCULPT_FACE_SETS) { - BLI_strncpy(layer.name, ".sculpt_face_set", sizeof(layer.name)); - layer.type = CD_PROP_INT32; + void *faceset_data = nullptr; + for (const int i : IndexRange(mesh->totpoly)) { + if (mesh->pdata.layers[i].type == CD_SCULPT_FACE_SETS) { + faceset_data = mesh->pdata.layers[i].data; + mesh->pdata.layers[i].data = nullptr; + CustomData_free_layer(&mesh->pdata, CD_SCULPT_FACE_SETS, mesh->totpoly, i); + break; } } - CustomData_update_typemap(&mesh->pdata); + if (faceset_data != nullptr) { + CustomData_add_layer_named(&mesh->pdata, CD_PROP_INT32, CD_ASSIGN, faceset_data, mesh->totpoly, ".sculpt_face_set"); + } } /** \} */