From f75af7cbf53da7570555dedb2653bf64f0de9280 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Tue, 30 May 2023 15:10:13 -0400 Subject: [PATCH] Mesh: Forward compatibility with generic bevel weight in 4.0 2a56403cb0dbcbc1dfb1 changed the way bevel weights are stored in 4.0. Add versioning for reading the new files that replaces the new generic attributes with the old non-generic custom data layers. The code is paranoid with lots fo checks I expect will typically not be necessary. --- .../blenkernel/BKE_mesh_legacy_convert.h | 1 + .../blenkernel/intern/mesh_legacy_convert.cc | 36 +++++++++++++++++++ .../blenloader/intern/versioning_400.cc | 1 + 3 files changed, 38 insertions(+) diff --git a/source/blender/blenkernel/BKE_mesh_legacy_convert.h b/source/blender/blenkernel/BKE_mesh_legacy_convert.h index 44895652d8a..61c9937f3a0 100644 --- a/source/blender/blenkernel/BKE_mesh_legacy_convert.h +++ b/source/blender/blenkernel/BKE_mesh_legacy_convert.h @@ -53,6 +53,7 @@ void BKE_mesh_legacy_edge_crease_to_layers(struct Mesh *mesh); * Copy bevel weights from separate layers into vertices and edges. */ void BKE_mesh_legacy_bevel_weight_from_layers(struct Mesh *mesh); +void BKE_mesh_bevel_weight_layers_from_future(struct Mesh *mesh); /** * Copy bevel weights from vertices and edges to separate layers. */ diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index 2da4be71ddc..4f12ebd4d09 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -1384,6 +1384,42 @@ void BKE_mesh_legacy_bevel_weight_from_layers(Mesh *mesh) } } +void BKE_mesh_bevel_weight_layers_from_future(Mesh *mesh) +{ + using namespace blender; + using namespace blender::bke; + if (const std::optional meta_data = mesh->attributes().lookup_meta_data( + "bevel_weight_vert")) + { + if (meta_data->domain == ATTR_DOMAIN_POINT && meta_data->data_type == CD_PROP_FLOAT) { + if (const void *data = CustomData_get_layer_named( + &mesh->vdata, CD_PROP_FLOAT, "bevel_weight_vert")) + { + if (void *new_data = CustomData_add_layer( + &mesh->vdata, CD_BWEIGHT, CD_CONSTRUCT, mesh->totvert)) { + memcpy(new_data, data, sizeof(float) * mesh->totvert); + CustomData_free_layer_named(&mesh->vdata, "bevel_weight_vert", mesh->totvert); + } + } + } + } + if (const std::optional meta_data = mesh->attributes().lookup_meta_data( + "bevel_weight_edge")) + { + if (meta_data->domain == ATTR_DOMAIN_EDGE && meta_data->data_type == CD_PROP_FLOAT) { + if (const void *data = CustomData_get_layer_named( + &mesh->edata, CD_PROP_FLOAT, "bevel_weight_edge")) + { + if (void *new_data = CustomData_add_layer( + &mesh->edata, CD_BWEIGHT, CD_CONSTRUCT, mesh->totedge)) { + memcpy(new_data, data, sizeof(float) * mesh->totedge); + CustomData_free_layer_named(&mesh->edata, "bevel_weight_edge", mesh->totedge); + } + } + } + } +} + void BKE_mesh_legacy_bevel_weight_to_layers(Mesh *mesh) { using namespace blender; diff --git a/source/blender/blenloader/intern/versioning_400.cc b/source/blender/blenloader/intern/versioning_400.cc index 1fc1e0146ff..b0ffea6c411 100644 --- a/source/blender/blenloader/intern/versioning_400.cc +++ b/source/blender/blenloader/intern/versioning_400.cc @@ -42,6 +42,7 @@ static void version_mesh_legacy_to_struct_of_array_format(Mesh &mesh) BKE_mesh_legacy_convert_loops_to_corners(&mesh); BKE_mesh_legacy_convert_polys_to_offsets(&mesh); BKE_mesh_legacy_convert_edges_to_generic(&mesh); + BKE_mesh_bevel_weight_layers_from_future(&mesh); } static void version_motion_tracking_legacy_camera_object(MovieClip &movieclip)