[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