Fix #141262: Undo speed regression (4.5)
The memfile undo data-block change detection didn't work for meshes because we ended up writing a new pointer every time. In practice the array the pointer references is always empty anyway, so we can just add a check and write null instead. Unfortunately this fix only applies to 4.5, since the attribute DNA data (which is actually used at runtime in 5.0) is created temporarily specifically for writing, so it gets a new address every time. We'll probably need to solve #127706 in 5.0 to fix this. Pull Request: https://projects.blender.org/blender/blender/pulls/141457
This commit is contained in:
@@ -1928,8 +1928,14 @@ void CurvesGeometry::blend_write_prepare(CurvesGeometry::BlendWriteData &write_d
|
||||
this->curves_num(),
|
||||
write_data.curve_layers,
|
||||
write_data.attribute_data);
|
||||
this->attribute_storage.dna_attributes = write_data.attribute_data.attributes.data();
|
||||
this->attribute_storage.dna_attributes_num = write_data.attribute_data.attributes.size();
|
||||
if (write_data.attribute_data.attributes.is_empty()) {
|
||||
this->attribute_storage.dna_attributes = nullptr;
|
||||
this->attribute_storage.dna_attributes_num = 0;
|
||||
}
|
||||
else {
|
||||
this->attribute_storage.dna_attributes = write_data.attribute_data.attributes.data();
|
||||
this->attribute_storage.dna_attributes_num = write_data.attribute_data.attributes.size();
|
||||
}
|
||||
}
|
||||
|
||||
void CurvesGeometry::blend_write(BlendWriter &writer,
|
||||
|
||||
@@ -386,8 +386,14 @@ static void mesh_blend_write(BlendWriter *writer, ID *id, const void *id_address
|
||||
mesh->face_data, AttrDomain::Face, mesh->faces_num, face_layers, attribute_data);
|
||||
CustomData_blend_write_prepare(
|
||||
mesh->corner_data, AttrDomain::Corner, mesh->corners_num, loop_layers, attribute_data);
|
||||
mesh->attribute_storage.dna_attributes = attribute_data.attributes.data();
|
||||
mesh->attribute_storage.dna_attributes_num = attribute_data.attributes.size();
|
||||
if (attribute_data.attributes.is_empty()) {
|
||||
mesh->attribute_storage.dna_attributes = nullptr;
|
||||
mesh->attribute_storage.dna_attributes_num = 0;
|
||||
}
|
||||
else {
|
||||
mesh->attribute_storage.dna_attributes = attribute_data.attributes.data();
|
||||
mesh->attribute_storage.dna_attributes_num = attribute_data.attributes.size();
|
||||
}
|
||||
if (!is_undo) {
|
||||
/* Write forward compatible format. To be removed in 5.0. */
|
||||
rename_seam_layer_to_old_name(
|
||||
|
||||
@@ -128,8 +128,14 @@ static void pointcloud_blend_write(BlendWriter *writer, ID *id, const void *id_a
|
||||
pointcloud->attribute_storage.wrap(), {{AttrDomain::Point, &point_layers}}, attribute_data);
|
||||
CustomData_blend_write_prepare(
|
||||
pointcloud->pdata, AttrDomain::Point, pointcloud->totpoint, point_layers, attribute_data);
|
||||
pointcloud->attribute_storage.dna_attributes = attribute_data.attributes.data();
|
||||
pointcloud->attribute_storage.dna_attributes_num = attribute_data.attributes.size();
|
||||
if (attribute_data.attributes.is_empty()) {
|
||||
pointcloud->attribute_storage.dna_attributes = nullptr;
|
||||
pointcloud->attribute_storage.dna_attributes_num = 0;
|
||||
}
|
||||
else {
|
||||
pointcloud->attribute_storage.dna_attributes = attribute_data.attributes.data();
|
||||
pointcloud->attribute_storage.dna_attributes_num = attribute_data.attributes.size();
|
||||
}
|
||||
|
||||
/* Write LibData */
|
||||
BLO_write_id_struct(writer, PointCloud, id_address, &pointcloud->id);
|
||||
|
||||
Reference in New Issue
Block a user