[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