From eadb259aeeb99b5165ec0ca0f78fc018c1bd5b92 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 24 Jun 2025 22:06:32 -0400 Subject: [PATCH] Fix: Attributes: Data potentially lost in versioning For files saved with the new format, the versioning can incorrectly replace the AttributeStorage data with whatever is inside of CustomData, even if that's nothing. So far this is only in one unlikely case for point clouds, but these functions will soon be used for Grease Pencil and curves. --- .../intern/attribute_legacy_convert.cc | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/source/blender/blenkernel/intern/attribute_legacy_convert.cc b/source/blender/blenkernel/intern/attribute_legacy_convert.cc index 2fc65a52acf..597f2756730 100644 --- a/source/blender/blenkernel/intern/attribute_legacy_convert.cc +++ b/source/blender/blenkernel/intern/attribute_legacy_convert.cc @@ -106,10 +106,9 @@ struct CustomDataAndSize { * Move generic attributes from #CustomData to #AttributeStorage. All other non-generic layers are * left in #CustomData. */ -static AttributeStorage attribute_legacy_convert_customdata_to_storage( - const Map &domains) +static void attribute_legacy_convert_customdata_to_storage( + const Map &domains, AttributeStorage &storage) { - AttributeStorage storage; struct AttributeToAdd { StringRef name; AttrDomain domain; @@ -163,8 +162,6 @@ static AttributeStorage attribute_legacy_convert_customdata_to_storage( custom_data.data.maxlayer = data.capacity; CustomData_update_typemap(&custom_data.data); } - - return storage; } std::optional attr_type_to_custom_data_type(const AttrType attr_type) @@ -264,11 +261,12 @@ void mesh_convert_storage_to_customdata(Mesh &mesh) } void mesh_convert_customdata_to_storage(Mesh &mesh) { - mesh.attribute_storage.wrap() = bke::attribute_legacy_convert_customdata_to_storage( + bke::attribute_legacy_convert_customdata_to_storage( {{AttrDomain::Point, {mesh.vert_data, mesh.verts_num}}, {AttrDomain::Edge, {mesh.edge_data, mesh.edges_num}}, {AttrDomain::Face, {mesh.face_data, mesh.faces_num}}, - {AttrDomain::Corner, {mesh.corner_data, mesh.corners_num}}}); + {AttrDomain::Corner, {mesh.corner_data, mesh.corners_num}}}, + mesh.attribute_storage.wrap()); } void curves_convert_storage_to_customdata(CurvesGeometry &curves) @@ -279,15 +277,17 @@ void curves_convert_storage_to_customdata(CurvesGeometry &curves) } void curves_convert_customdata_to_storage(CurvesGeometry &curves) { - curves.attribute_storage.wrap() = attribute_legacy_convert_customdata_to_storage( + attribute_legacy_convert_customdata_to_storage( {{AttrDomain::Point, {curves.point_data, curves.points_num()}}, - {AttrDomain::Curve, {curves.curve_data, curves.curves_num()}}}); + {AttrDomain::Curve, {curves.curve_data, curves.curves_num()}}}, + curves.attribute_storage.wrap()); } void pointcloud_convert_customdata_to_storage(PointCloud &pointcloud) { - pointcloud.attribute_storage.wrap() = attribute_legacy_convert_customdata_to_storage( - {{AttrDomain::Point, {pointcloud.pdata_legacy, pointcloud.totpoint}}}); + attribute_legacy_convert_customdata_to_storage( + {{AttrDomain::Point, {pointcloud.pdata_legacy, pointcloud.totpoint}}}, + pointcloud.attribute_storage.wrap()); } void grease_pencil_convert_storage_to_customdata(GreasePencil &grease_pencil) @@ -298,8 +298,9 @@ void grease_pencil_convert_storage_to_customdata(GreasePencil &grease_pencil) } void grease_pencil_convert_customdata_to_storage(GreasePencil &grease_pencil) { - grease_pencil.attribute_storage.wrap() = attribute_legacy_convert_customdata_to_storage( - {{AttrDomain::Layer, {grease_pencil.layers_data, int(grease_pencil.layers().size())}}}); + attribute_legacy_convert_customdata_to_storage( + {{AttrDomain::Layer, {grease_pencil.layers_data, int(grease_pencil.layers().size())}}}, + grease_pencil.attribute_storage.wrap()); } } // namespace blender::bke