diff options
Diffstat (limited to 'source/blender/blenkernel/intern/lib_id.c')
-rw-r--r-- | source/blender/blenkernel/intern/lib_id.c | 54 |
1 files changed, 26 insertions, 28 deletions
diff --git a/source/blender/blenkernel/intern/lib_id.c b/source/blender/blenkernel/intern/lib_id.c index 7c09ae51344..eb440de1a6f 100644 --- a/source/blender/blenkernel/intern/lib_id.c +++ b/source/blender/blenkernel/intern/lib_id.c @@ -611,41 +611,39 @@ bool BKE_id_copy(Main *bmain, const ID *id, ID **newid) * Invokes the appropriate copy method for the block and returns the result in * newid, unless test. Returns true if the block can be copied. */ -ID *BKE_id_copy_for_duplicate(Main *bmain, - ID *id, - const bool is_owner_id_liboverride, - const eDupli_ID_Flags duplicate_flags) +ID *BKE_id_copy_for_duplicate(Main *bmain, ID *id, const eDupli_ID_Flags duplicate_flags) { if (id == NULL) { - return NULL; + return id; } if (id->newid == NULL) { - if (!is_owner_id_liboverride || !ID_IS_LINKED(id)) { - ID *id_new; - BKE_id_copy(bmain, id, &id_new); - /* Copying add one user by default, need to get rid of that one. */ - id_us_min(id_new); - ID_NEW_SET(id, id_new); - - /* Shape keys are always copied with their owner ID, by default. */ - ID *key_new = (ID *)BKE_key_from_id(id_new); - ID *key = (ID *)BKE_key_from_id(id); - if (key != NULL) { - ID_NEW_SET(key, key_new); - } + const bool do_linked_id = (duplicate_flags & USER_DUP_LINKED_ID) != 0; + if (!(do_linked_id || !ID_IS_LINKED(id))) { + return id; + } - /* Note: embedded data (root nodetrees and master collections) should never be referenced by - * anything else, so we do not need to set their newid pointer and flag. */ + ID *id_new; + BKE_id_copy(bmain, id, &id_new); + /* Copying add one user by default, need to get rid of that one. */ + id_us_min(id_new); + ID_NEW_SET(id, id_new); - if (duplicate_flags & USER_DUP_ACT) { - BKE_animdata_copy_id_action(bmain, id_new, true); - if (key_new != NULL) { - BKE_animdata_copy_id_action(bmain, key_new, true); - } - /* Note that actions of embedded data (root nodetrees and master collections) are handled - * by `BKE_animdata_copy_id_action` as well. */ - } + /* Shape keys are always copied with their owner ID, by default. */ + ID *key_new = (ID *)BKE_key_from_id(id_new); + ID *key = (ID *)BKE_key_from_id(id); + if (key != NULL) { + ID_NEW_SET(key, key_new); + } + + /* Note: embedded data (root nodetrees and master collections) should never be referenced by + * anything else, so we do not need to set their newid pointer and flag. */ + + BKE_animdata_duplicate_id_action(bmain, id_new, duplicate_flags); + if (key_new != NULL) { + BKE_animdata_duplicate_id_action(bmain, id_new, duplicate_flags); } + /* Note that actions of embedded data (root nodetrees and master collections) are handled + * by `BKE_animdata_duplicate_id_action` as well. */ } return id->newid; } |