diff options
author | Bastien Montagne <bastien@blender.org> | 2021-09-16 13:14:21 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2021-09-16 15:30:56 +0300 |
commit | 1fce66190a46ac47cac015b50913d0b05b3f087e (patch) | |
tree | 931c1ae8587e6f4acb74462813caa1454d68bab8 /source/blender/blenkernel/intern/lib_id.c | |
parent | 236a9f081462d249043e2bd00a015a6c5cafe377 (diff) |
Fix/refactor `BKE_id_clear_newpoin` and `BKE_main_id_newptr_and_tag_clear`.
Those were not clearing embdeed IDs flags and `newid` pointers at all...
Diffstat (limited to 'source/blender/blenkernel/intern/lib_id.c')
-rw-r--r-- | source/blender/blenkernel/intern/lib_id.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index 89e0ae9e7f0..9db2df06e42 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -338,10 +338,29 @@ void id_fake_user_clear(ID *id) void BKE_id_clear_newpoin(ID *id) { - if (id->newid) { - id->newid->tag &= ~LIB_TAG_NEW; + /* We assume that if this ID has no new ID, its embedded data has not either. */ + if (id->newid == NULL) { + return; } + + id->newid->tag &= ~LIB_TAG_NEW; id->newid = NULL; + + /* Deal with embedded data too. */ + Key *key = BKE_key_from_id(id); + if (key != NULL) { + BKE_id_clear_newpoin(&key->id); + } + bNodeTree *ntree = ntreeFromID(id); + if (ntree != NULL) { + BKE_id_clear_newpoin(&ntree->id); + } + if (GS(id->name) == ID_SCE) { + Collection *master_collection = ((Scene *)id)->master_collection; + if (master_collection != NULL) { + BKE_id_clear_newpoin(&master_collection->id); + } + } } static int lib_id_expand_local_cb(LibraryIDLinkCallbackData *cb_data) @@ -1763,8 +1782,7 @@ void BKE_main_id_newptr_and_tag_clear(Main *bmain) ID *id; FOREACH_MAIN_ID_BEGIN (bmain, id) { - id->newid = NULL; - id->tag &= ~LIB_TAG_NEW; + BKE_id_clear_newpoin(id); } FOREACH_MAIN_ID_END; } |