Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Montagne <bastien@blender.org>2020-06-11 18:24:56 +0300
committerBastien Montagne <bastien@blender.org>2020-06-11 18:33:06 +0300
commita61ba6c73dc5dd8e499fae7e911a74fe9c6bb877 (patch)
treeee33083dc31d8165d6543f67c2530027c6495631 /source/blender/blenkernel
parent3d18bd5c5160b7ee8543558053cad9126804dbd6 (diff)
Fix possibility to add objects in override collections.
Override collections do not support that, add proper checks in BKE code adding objects to collections. Also try to find a suitable collection in parents in that case. Note that this is enforced on 'public' API level, internal code can still bypass those checks if needed. Exposing this possibility to public API should not be needed.
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/intern/collection.c37
1 files changed, 36 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 290b181f172..a9d3c7c1b65 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -716,6 +716,31 @@ static void collection_tag_update_parent_recursive(Main *bmain,
}
}
+static Collection *collection_parent_editable_find_recursive(Collection *collection)
+{
+ if (!ID_IS_LINKED(collection) && !ID_IS_OVERRIDE_LIBRARY(collection)) {
+ return collection;
+ }
+
+ if (collection->flag & COLLECTION_IS_MASTER) {
+ return NULL;
+ }
+
+ LISTBASE_FOREACH (CollectionParent *, collection_parent, &collection->parents) {
+ if (!ID_IS_LINKED(collection_parent->collection) &&
+ !ID_IS_OVERRIDE_LIBRARY(collection_parent->collection)) {
+ return collection_parent->collection;
+ }
+ Collection *editable_collection = collection_parent_editable_find_recursive(
+ collection_parent->collection);
+ if (editable_collection != NULL) {
+ return editable_collection;
+ }
+ }
+
+ return NULL;
+}
+
static bool collection_object_add(
Main *bmain, Collection *collection, Object *ob, int flag, const bool add_us)
{
@@ -786,6 +811,15 @@ bool BKE_collection_object_add(Main *bmain, Collection *collection, Object *ob)
return false;
}
+ collection = collection_parent_editable_find_recursive(collection);
+
+ /* Only case where this pointer can be NULL is when scene itself is linked, this case should
+ * never be reached. */
+ BLI_assert(collection != NULL);
+ if (collection == NULL) {
+ return false;
+ }
+
if (!collection_object_add(bmain, collection, ob, 0, true)) {
return false;
}
@@ -808,7 +842,8 @@ void BKE_collection_object_add_from(Main *bmain, Scene *scene, Object *ob_src, O
bool is_instantiated = false;
FOREACH_SCENE_COLLECTION_BEGIN (scene, collection) {
- if (!ID_IS_LINKED(collection) && BKE_collection_has_object(collection, ob_src)) {
+ if (!ID_IS_LINKED(collection) && !ID_IS_OVERRIDE_LIBRARY(collection) &&
+ BKE_collection_has_object(collection, ob_src)) {
collection_object_add(bmain, collection, ob_dst, 0, true);
is_instantiated = true;
}