[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