Make Scene Master collection 'Private' ID data, like root nodetrees.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 2 Sep 2019 10:14:51 +0000 (12:14 +0200)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 2 Sep 2019 16:39:08 +0000 (18:39 +0200)
Same issue here as with root nodetrees, those are private ID data owned
by another ID, and not in Main DB. This requires special handling.

there are still quiet a few things to do here, like getting rid of
special code for master collection (regular ID copying should handle
that just as it already does for root nodetrees), cleanup in ID copying
code, etc.

source/blender/blenkernel/BKE_blender_version.h
source/blender/blenkernel/intern/collection.c
source/blender/blenloader/intern/versioning_280.c
source/blender/makesrna/intern/rna_access.c

index e0f890244200f04952d6f242057215efdf02ea7b..db93193bfe306753377224ab36d680bf4e5b34a1 100644 (file)
@@ -27,7 +27,7 @@
  * \note Use #STRINGIFY() rather than defining with quotes.
  */
 #define BLENDER_VERSION 281
-#define BLENDER_SUBVERSION 4
+#define BLENDER_SUBVERSION 5
 /** Several breakages with 280, e.g. collections vs layers. */
 #define BLENDER_MINVERSION 280
 #define BLENDER_MINSUBVERSION 0
index 2031576190effefec1ccabbc971dd2ec9881c225..06710b40569344c8f7e973c78cb73a93c174f6fb 100644 (file)
@@ -338,8 +338,9 @@ Collection *BKE_collection_duplicate(Main *bmain,
                                      const bool do_obdata)
 {
   /* It's not allowed to copy the master collection. */
+  BLI_assert((collection->id.flag & LIB_PRIVATE_DATA) == 0);
+  BLI_assert((collection->flag & COLLECTION_IS_MASTER) == 0);
   if (collection->flag & COLLECTION_IS_MASTER) {
-    BLI_assert("!Master collection can't be duplicated");
     return NULL;
   }
 
@@ -368,6 +369,7 @@ Collection *BKE_collection_duplicate(Main *bmain,
 Collection *BKE_collection_copy_master(Main *bmain, Collection *collection, const int flag)
 {
   BLI_assert(collection->flag & COLLECTION_IS_MASTER);
+  BLI_assert(collection->id.flag & LIB_PRIVATE_DATA);
 
   Collection *collection_dst = MEM_dupallocN(collection);
   BKE_collection_copy_data(bmain, collection_dst, collection, flag);
@@ -499,6 +501,7 @@ Collection *BKE_collection_master_add()
   /* Not an actual datablock, but owned by scene. */
   Collection *master_collection = MEM_callocN(sizeof(Collection), "Master Collection");
   STRNCPY(master_collection->id.name, "GRMaster Collection");
+  master_collection->id.flag |= LIB_PRIVATE_DATA;
   master_collection->flag |= COLLECTION_IS_MASTER;
   return master_collection;
 }
index ed3b1613b2ac879d176016ffa0be6161f04fce8d..00c0ed561f742abba5e80908d4a9234b857f30d3 100644 (file)
@@ -3704,12 +3704,23 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *bmain)
     FOREACH_MAIN_ID_END;
   }
 
-  {
-    /* Versioning code until next subversion bump goes here. */
+  if (!MAIN_VERSION_ATLEAST(bmain, 281, 5)) {
     for (Brush *br = bmain->brushes.first; br; br = br->id.next) {
       if (br->ob_mode & OB_MODE_SCULPT && br->normal_radius_factor == 0.0f) {
         br->normal_radius_factor = 0.5f;
       }
     }
+
+    LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
+      /* Older files do not hqve a msater collection, which is then added through
+       * `BKE_collection_master_add()`, so everything is fine. */
+      if (scene->master_collection != NULL) {
+        scene->master_collection->id.flag |= LIB_PRIVATE_DATA;
+      }
+    }
+  }
+
+  {
+    /* Versioning code until next subversion bump goes here. */
   }
 }
index bc015a378ccb7c8c1a040541699e12118bf62a15..531c2ef2003a8ed6ee9c487da86f440cf84bfc0e 100644 (file)
@@ -41,6 +41,7 @@
 #include "BLT_translation.h"
 
 #include "BKE_animsys.h"
+#include "BKE_collection.h"
 #include "BKE_context.h"
 #include "BKE_idcode.h"
 #include "BKE_idprop.h"
@@ -5778,6 +5779,11 @@ ID *RNA_find_real_ID_and_path(Main *bmain, ID *id, const char **r_path)
           *r_path = "node_tree";
         }
         return BKE_node_tree_find_owner_ID(bmain, (bNodeTree *)id);
+      case ID_GR:
+        if (r_path) {
+          *r_path = "collection";
+        }
+        return (ID *)BKE_collection_master_scene_search(bmain, (Collection *)id);
 
       default:
         return NULL;