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:
Hans Goudey
2025-07-07 22:06:59 +02:00
committed by Hans Goudey
parent f090572ca8
commit 0ce5738415
3 changed files with 24 additions and 6 deletions

View File

@@ -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,

View File

@@ -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(

View File

@@ -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);