[Bf-blender-cvs] [f304e2e] render-layers: BKE_collection_remove: (also first of five of the syncing functions)
Dalai Felinto
noreply at git.blender.org
Sat Dec 3 02:44:18 CET 2016
Commit: f304e2e273ee7ba60f68c0404a79f189552435d8
Author: Dalai Felinto
Date: Fri Dec 2 23:36:39 2016 +0100
Branches: render-layers
https://developer.blender.org/rBf304e2e273ee7ba60f68c0404a79f189552435d8
BKE_collection_remove: (also first of five of the syncing functions)
===================================================================
M source/blender/blenkernel/BKE_layer.h
M source/blender/blenkernel/intern/collection.c
M source/blender/blenkernel/intern/layer.c
M source/blender/blenloader/intern/versioning_280.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index b0f1601..b4060c4 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -49,6 +49,8 @@ void BKE_scene_layer_engine_set(struct SceneLayer *sl, const char *engine);
struct LayerCollection *BKE_collection_link(struct SceneLayer *sl, struct SceneCollection *sc);
+void BKE_layer_collection_free(struct SceneLayer *sl, struct LayerCollection *lc);
+
void BKE_collection_unlink(struct SceneLayer *sl, struct LayerCollection *lc);
void BKE_collection_override_datablock_add(struct LayerCollection *lc, const char *data_path, struct ID *id);
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index f145a4f..1acb9e3 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -92,6 +92,36 @@ static bool collection_remlink(SceneCollection *sc_parent, SceneCollection *sc_g
}
/*
+ * Recursively remove any instance of this SceneCollection
+ */
+static void layer_collection_remove(SceneLayer *sl, ListBase *lb, const SceneCollection *sc)
+{
+ LayerCollection *lc = lb->first;
+ while(lc) {
+ if (lc->collection == sc) {
+ BKE_layer_collection_free(sl, lc);
+ BLI_remlink(lb, lc);
+
+ LayerCollection *lc_next = lc->next;
+ MEM_freeN(lc);
+ lc = lc_next;
+
+ /* only the "top-level" layer collections may have the
+ * same SceneCollection in a sibling tree.
+ */
+ if (lb != &sl->collections) {
+ return;
+ }
+ }
+
+ else {
+ layer_collection_remove(sl, &lc->collections, sc);
+ lc = lc->next;
+ }
+ }
+}
+
+/*
* Remove a collection from the scene, and syncronize all render layers
*/
bool BKE_collection_remove(Scene *scene, SceneCollection *sc)
@@ -111,11 +141,12 @@ bool BKE_collection_remove(Scene *scene, SceneCollection *sc)
/* clear the collection items */
collection_free(sc);
- /* TODO: check all layers that use this collection and clear them */
- TODO_LAYER_SYNC;
+ /* check all layers that use this collection and clear them */
+ for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
+ layer_collection_remove(sl, &sl->collections, sc);
+ }
MEM_freeN(sc);
-
return true;
}
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 19967c7..a27eac4 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -127,10 +127,10 @@ static void scene_layer_object_base_unref(SceneLayer* sl, ObjectBase *base)
if (sl->basact == base) {
sl->basact = NULL;
}
- }
- BLI_remlink(&sl->object_bases, base);
- MEM_freeN(base);
+ BLI_remlink(&sl->object_bases, base);
+ MEM_freeN(base);
+ }
}
static ObjectBase *object_base_add(SceneLayer *sl, Object *ob)
@@ -153,7 +153,10 @@ LayerCollection *BKE_collection_link(SceneLayer *sl, SceneCollection *sc)
return lc;
}
-static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
+/*
+ * Free LayerCollection from SceneLayer
+ */
+void BKE_layer_collection_free(SceneLayer *sl, LayerCollection *lc)
{
for (LayerCollection *nlc = lc->collections.first; nlc; nlc = nlc->next) {
for (LinkData *link = nlc->object_bases.first; link; link = link->next) {
@@ -161,7 +164,7 @@ static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
}
BLI_freelistN(&nlc->object_bases);
- layer_collection_free(sl, nlc);
+ BKE_layer_collection_free(sl, nlc);
}
}
@@ -171,7 +174,7 @@ static void layer_collection_free(SceneLayer *sl, LayerCollection *lc)
*/
void BKE_collection_unlink(SceneLayer *sl, LayerCollection *lc)
{
- layer_collection_free(sl, lc);
+ BKE_layer_collection_free(sl, lc);
BLI_remlink(&sl->collections, lc);
MEM_freeN(lc);
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index d97cd99..2f3d2d0 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -125,7 +125,7 @@ void blo_do_versions_280_after_linking(FileData *fd, Library *UNUSED(lib), Main
/* Cleanup */
for (int i = 0; i < 20; i++) {
if ((lay_used & (1 << i)) == 0) {
- //BKE_collection_remove(scene, collections[i]);
+ BKE_collection_remove(scene, collections[i]);
}
}
}
More information about the Bf-blender-cvs
mailing list