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 */

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to