[Bf-blender-cvs] [5c22ade] render-layers: Syncing: update layercollection tree when an object is unlinked

Dalai Felinto noreply at git.blender.org
Wed Dec 21 19:15:06 CET 2016


Commit: 5c22ade95a16ac802c81c968674e3a6f7135939b
Author: Dalai Felinto
Date:   Wed Dec 21 18:05:22 2016 +0100
Branches: render-layers
https://developer.blender.org/rB5c22ade95a16ac802c81c968674e3a6f7135939b

Syncing: update layercollection tree when an object is unlinked

Note: filtering is not implemented/fully considered yet

===================================================================

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/layer.c
M	source/blender/makesrna/intern/rna_scene.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index eb7523d..ecf883c 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -76,6 +76,7 @@ void BKE_collection_unlink(struct SceneLayer *sl, struct LayerCollection *lc);
 
 void BKE_layer_sync_new_scene_collection(struct Scene *scene, const struct SceneCollection *sc_parent, struct SceneCollection *sc);
 void BKE_layer_sync_object_link(struct Scene *scene, struct SceneCollection *sc, struct Object *ob);
+void BKE_layer_sync_object_unlink(struct Scene *scene, struct SceneCollection *sc, struct Object *ob);
 
 /* override */
 
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 81d9d2c..93e3bc1 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -194,7 +194,7 @@ void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc,
 /**
  * Remove object from collection
  */
-void BKE_collection_object_remove(struct Scene *UNUSED(scene), struct SceneCollection *sc, struct Object *ob)
+void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection *sc, struct Object *ob)
 {
 
 	LinkData *link = BLI_findptr(&sc->objects, ob, offsetof(LinkData, data));
@@ -202,10 +202,9 @@ void BKE_collection_object_remove(struct Scene *UNUSED(scene), struct SceneColle
 	MEM_freeN(link);
 
 	id_us_min((ID *)ob);
-	TODO_LAYER_SYNC;
 
-	/* remove the equivalent object base to all layers that have this collection
-	 * also remove all reference to ob in the filter_objects */
+	TODO_LAYER_SYNC_FILTER; /* need to remove all instances of ob in scene collections -> filter_objects */
+	BKE_layer_sync_object_unlink(scene, sc, ob);
 }
 
 /* ---------------------------------------------------------------------- */
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index b0b5741..42a1e20 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -326,6 +326,18 @@ static void layer_collection_object_add(SceneLayer *sl, LayerCollection *lc, Obj
 	BLI_addtail(&lc->object_bases, BLI_genericNodeN(ob_base));
 }
 
+static void layer_collection_object_remove(SceneLayer *sl, LayerCollection *lc, Object *ob)
+{
+	ObjectBase *ob_base;
+	ob_base = BKE_scene_layer_base_find(sl, ob);
+
+	LinkData *link = BLI_findptr(&lc->object_bases, ob_base, offsetof(LinkData, data));
+	BLI_remlink(&lc->object_bases, link);
+	MEM_freeN(link);
+
+	scene_layer_object_base_unref(sl, ob_base);
+}
+
 static void layer_collection_objects_populate(SceneLayer *sl, LayerCollection *lc, ListBase *objects)
 {
 	for (LinkData *link = objects->first; link; link = link->next) {
@@ -404,6 +416,22 @@ void BKE_layer_sync_object_link(Scene *scene, SceneCollection *sc, Object *ob)
 	}
 }
 
+/**
+ * Remove the equivalent object base to all layers that have this collection
+ * also remove all reference to ob in the filter_objects
+ */
+void BKE_layer_sync_object_unlink(Scene *scene, SceneCollection *sc, Object *ob)
+{
+	for (SceneLayer *sl = scene->render_layers.first; sl; sl = sl->next) {
+		for (LayerCollection *lc = sl->layer_collections.first; lc; lc = lc->next) {
+			LayerCollection *found = find_layer_collection_by_scene_collection(lc, sc);
+			if (found) {
+				layer_collection_object_remove(sl, found, ob);
+			}
+		}
+	}
+}
+
 /* ---------------------------------------------------------------------- */
 /* Override */
 
diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c
index 0a2201d..22f1c21 100644
--- a/source/blender/makesrna/intern/rna_scene.c
+++ b/source/blender/makesrna/intern/rna_scene.c
@@ -2139,7 +2139,7 @@ static void rna_SceneCollection_filter_set(PointerRNA *ptr, const char *value)
 	SceneCollection *sc = (SceneCollection *)ptr->data;
 	BLI_strncpy_utf8(sc->filter, value, sizeof(sc->filter));
 
-	TODO_LAYER_SYNC;
+	TODO_LAYER_SYNC_FILTER;
 	(void)scene;
 }




More information about the Bf-blender-cvs mailing list