Fix T62613: In duplicated collections objects loses patrenting.
authorBastien Montagne <montagne29@wanadoo.fr>
Wed, 6 Mar 2019 10:38:06 +0000 (11:38 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Wed, 6 Mar 2019 14:19:29 +0000 (15:19 +0100)
We need to remap duplicated IDs' ID pointers to new ones if they exist.

source/blender/blenkernel/intern/collection.c
source/blender/blenkernel/intern/library_remap.c

index ceac0215a5f094f64fc1b05d137419791683dbd5..d351f112c8a2e6d5a482090a7f92ae4589de034e 100644 (file)
@@ -33,6 +33,7 @@
 #include "BKE_idprop.h"
 #include "BKE_layer.h"
 #include "BKE_library.h"
+#include "BKE_library_remap.h"
 #include "BKE_main.h"
 #include "BKE_object.h"
 #include "BKE_rigidbody.h"
@@ -308,14 +309,19 @@ Collection *BKE_collection_duplicate(
        }
 
        if (do_hierarchy) {
+               BKE_main_id_tag_all(bmain, LIB_TAG_NEW, false);
                BKE_main_id_clear_newpoins(bmain);
        }
 
        Collection *collection_new = collection_duplicate_recursive(
                                         bmain, parent, collection, do_hierarchy, do_deep_copy);
 
+       /* This code will follows into all ID links using an ID tagged with LIB_TAG_NEW.*/
+       BKE_libblock_relink_to_newid(&collection_new->id);
+
        if (do_hierarchy) {
                /* Cleanup. */
+               BKE_main_id_tag_all(bmain, LIB_TAG_NEW, false);
                BKE_main_id_clear_newpoins(bmain);
        }
 
index 03630297dc34b15d2e405c58ec062ad04911ef05..077ce059edf9ff528e6b902b30010fdf9ef881b4 100644 (file)
@@ -679,7 +679,7 @@ static int id_relink_to_newid_looper(void *UNUSED(user_data), ID *UNUSED(self_id
 
 /** Similar to libblock_relink_ex, but is remapping IDs to their newid value if non-NULL, in given \a id.
  *
- * Very specific usage, not sure we'll keep it on the long run, currently only used in Object duplication code...
+ * Very specific usage, not sure we'll keep it on the long run, currently only used in Object/Collection duplication code...
  */
 void BKE_libblock_relink_to_newid(ID *id)
 {