[Bf-blender-cvs] [e648e388874] master: Undo: Clear more ID runtime data on filewrite.

Bastien Montagne noreply at git.blender.org
Thu Aug 19 15:09:41 CEST 2021


Commit: e648e388874a317f7846efe9ba7242a5b11a5650
Author: Bastien Montagne
Date:   Thu Aug 19 15:08:13 2021 +0200
Branches: master
https://developer.blender.org/rBe648e388874a317f7846efe9ba7242a5b11a5650

Undo: Clear more ID runtime data on filewrite.

This should help reducing false 'changed' status detection when reading
back a memfile undo step.

Related to T90593 & D12242.

===================================================================

M	source/blender/blenloader/intern/writefile.c

===================================================================

diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 337279ae84b..99246603e9a 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1023,12 +1023,23 @@ static bool write_file_handle(Main *mainvar,
 
         memcpy(id_buffer, id, idtype_struct_size);
 
+        /* Clear runtime data to reduce false detection of changed data in undo/redo context. */
         ((ID *)id_buffer)->tag = 0;
+        ((ID *)id_buffer)->us = 0;
+        ((ID *)id_buffer)->icon_id = 0;
         /* Those listbase data change every time we add/remove an ID, and also often when
          * renaming one (due to re-sorting). This avoids generating a lot of false 'is changed'
          * detections between undo steps. */
         ((ID *)id_buffer)->prev = NULL;
         ((ID *)id_buffer)->next = NULL;
+        /* Those runtime pointers should never be set during writing stage, but just in case clear
+         * them too. */
+        ((ID *)id_buffer)->orig_id = NULL;
+        ((ID *)id_buffer)->newid = NULL;
+        /* Even though in theory we could be able to preserve this python instance across undo even
+         * when we need to re-read the ID into its original address, this is currently cleared in
+         * #direct_link_id_common in `readfile.c` anyway, */
+        ((ID *)id_buffer)->py_instance = NULL;
 
         const IDTypeInfo *id_type = BKE_idtype_get_info_from_id(id);
         if (id_type->blend_write != NULL) {



More information about the Bf-blender-cvs mailing list