[Bf-blender-cvs] [a6cf5cf] render-layers: Syncing: an object added to a scenecollection
Dalai Felinto
noreply at git.blender.org
Wed Dec 21 19:15:02 CET 2016
Commit: a6cf5cfe9cccd6c801017eedf40adab21b9cab1a
Author: Dalai Felinto
Date: Wed Dec 21 13:02:05 2016 +0100
Branches: render-layers
https://developer.blender.org/rBa6cf5cfe9cccd6c801017eedf40adab21b9cab1a
Syncing: an object added to a scenecollection
Also changed the ObjectBase->refcount logic a bit, to simplify
further implementations of syncing.
===================================================================
M source/blender/blenkernel/BKE_layer.h
M source/blender/blenkernel/intern/collection.c
M source/blender/blenkernel/intern/layer.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index b450b38..eb7523d 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -75,6 +75,7 @@ void BKE_collection_unlink(struct SceneLayer *sl, struct LayerCollection *lc);
/* syncing */
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);
/* override */
diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c
index 25763dd..81d9d2c 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -179,12 +179,16 @@ void BKE_collection_master_free(Scene *scene){
/**
* Add object to collection
*/
-void BKE_collection_object_add(struct Scene *UNUSED(scene), struct SceneCollection *sc, struct Object *ob)
+void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc, struct Object *ob)
{
+ if (BLI_findptr(&sc->objects, ob, offsetof(LinkData, data))) {
+ /* don't add the same object twice */
+ return;
+ }
+
BLI_addtail(&sc->objects, BLI_genericNodeN(ob));
id_us_plus((ID *)ob);
- TODO_LAYER_SYNC;
- /* add the equivalent object base to all layers that have this collection */
+ BKE_layer_sync_object_link(scene, sc, ob);
}
/**
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 73e834b..b0b5741 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -156,13 +156,24 @@ static void scene_layer_object_base_unref(SceneLayer* sl, ObjectBase *base)
}
}
+/**
+ * Return the base if existent, or create it if necessary
+ * Always bump the refcount
+ */
static ObjectBase *object_base_add(SceneLayer *sl, Object *ob)
{
- ObjectBase *base = MEM_callocN(sizeof(ObjectBase), "Object Base");
- /* don't bump user count */
- base->object = ob;
- BLI_addtail(&sl->object_bases, base);
- return base;
+ ObjectBase *ob_base;
+ ob_base = BKE_scene_layer_base_find(sl, ob);
+
+ if (ob_base == NULL) {
+ ob_base = MEM_callocN(sizeof(ObjectBase), "Object Base");
+
+ /* do not bump user count, leave it for SceneCollections */
+ ob_base->object = ob;
+ BLI_addtail(&sl->object_bases, ob_base);
+ }
+ ob_base->refcount++;
+ return ob_base;
}
/* LayerCollection */
@@ -301,30 +312,31 @@ void BKE_collection_unlink(SceneLayer *sl, LayerCollection *lc)
sl->active_collection = 0;
}
-static void object_base_populate(SceneLayer *sl, LayerCollection *lc, ListBase *objects)
+static void layer_collection_object_add(SceneLayer *sl, LayerCollection *lc, Object *ob)
{
- for (LinkData *link = objects->first; link; link = link->next) {
- ObjectBase *base = BLI_findptr(&sl->object_bases, link->data, offsetof(ObjectBase, object));
+ ObjectBase *ob_base = object_base_add(sl, ob);
- if (base == NULL) {
- base = object_base_add(sl, link->data);
- }
- else {
- /* only add an object once */
- if (BLI_findptr(&lc->object_bases, base, offsetof(LinkData, data))) {
- continue;
- }
- }
+ /* only add an object once - prevent SceneCollection->objects and
+ * SceneCollection->filter_objects to add the same object */
+
+ if (BLI_findptr(&lc->object_bases, ob_base, offsetof(LinkData, data))) {
+ return;
+ }
+
+ BLI_addtail(&lc->object_bases, BLI_genericNodeN(ob_base));
+}
- base->refcount++;
- BLI_addtail(&lc->object_bases, BLI_genericNodeN(base));
+static void layer_collection_objects_populate(SceneLayer *sl, LayerCollection *lc, ListBase *objects)
+{
+ for (LinkData *link = objects->first; link; link = link->next) {
+ layer_collection_object_add(sl, lc, link->data);
}
}
static void layer_collection_populate(SceneLayer *sl, LayerCollection *lc, SceneCollection *sc)
{
- object_base_populate(sl, lc, &sc->objects);
- object_base_populate(sl, lc, &sc->filter_objects);
+ layer_collection_objects_populate(sl, lc, &sc->objects);
+ layer_collection_objects_populate(sl, lc, &sc->filter_objects);
for (SceneCollection *nsc = sc->scene_collections.first; nsc; nsc = nsc->next) {
layer_collection_add(sl, &lc->layer_collections, nsc);
@@ -377,6 +389,21 @@ void BKE_layer_sync_new_scene_collection(Scene *scene, const SceneCollection *sc
}
}
+/**
+ * Add a corresponding ObjectBase to all the equivalent LayerCollection
+ */
+void BKE_layer_sync_object_link(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_add(sl, found, ob);
+ }
+ }
+ }
+}
+
/* ---------------------------------------------------------------------- */
/* Override */
More information about the Bf-blender-cvs
mailing list