Mesh: Forward compatibility with generic bevel weight in 4.0
2a56403cb0 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.
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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<AttributeMetaData> 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<AttributeMetaData> 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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user