Commit: 36c34b96b3529466669b1f8a2b9fced899fede14
Author: Dalai Felinto
Date:   Tue Jan 3 16:02:27 2017 +0100
Branches: render-layers
https://developer.blender.org/rB36c34b96b3529466669b1f8a2b9fced899fede14

>From review: handle post processing of objects after they are removed

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

M       source/blender/blenkernel/BKE_collection.h
M       source/blender/blenkernel/intern/collection.c
M       source/blender/blenkernel/intern/library_remap.c

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

diff --git a/source/blender/blenkernel/BKE_collection.h 
b/source/blender/blenkernel/BKE_collection.h
index 0d5bd2a..267e621 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -47,6 +47,7 @@ struct SceneCollection *BKE_collection_master(struct Scene 
*scene);
 void BKE_collection_master_free(struct Scene *scene);
 void BKE_collection_object_add(struct Scene *scene, struct SceneCollection 
*sc, struct Object *object);
 void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection 
*sc, struct Object *object);
+void BKE_collections_object_remove(struct Scene *scene, struct Object *object);
 
 typedef void (*BKE_scene_objects_Cb)(struct Object *ob, void *data);
 typedef void (*BKE_scene_collections_Cb)(struct SceneCollection *ob, void 
*data);
diff --git a/source/blender/blenkernel/intern/collection.c 
b/source/blender/blenkernel/intern/collection.c
index 93e3bc1..d1a23da 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -198,6 +198,11 @@ void BKE_collection_object_remove(struct Scene *scene, 
struct SceneCollection *s
 {
 
        LinkData *link = BLI_findptr(&sc->objects, ob, offsetof(LinkData, 
data));
+
+       if (link == NULL) {
+               return;
+       }
+
        BLI_remlink(&sc->objects, link);
        MEM_freeN(link);
 
@@ -207,6 +212,19 @@ void BKE_collection_object_remove(struct Scene *scene, 
struct SceneCollection *s
        BKE_layer_sync_object_unlink(scene, sc, ob);
 }
 
+/**
+ * Remove object from all collections of scene
+ */
+void BKE_collections_object_remove(struct Scene *scene, struct Object *ob)
+{
+       SceneCollection *sc;
+       FOREACH_SCENE_COLLECTION(scene, sc)
+       {
+               BKE_collection_object_remove(scene, sc, ob);
+       }
+       FOREACH_SCENE_COLLECTION_END
+}
+
 /* ---------------------------------------------------------------------- */
 /* Iteractors */
 /* scene collection iteractor */
diff --git a/source/blender/blenkernel/intern/library_remap.c 
b/source/blender/blenkernel/intern/library_remap.c
index a257621..a68d29c 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -71,6 +71,7 @@
 #include "BKE_brush.h"
 #include "BKE_camera.h"
 #include "BKE_cachefile.h"
+#include "BKE_collection.h"
 #include "BKE_curve.h"
 #include "BKE_depsgraph.h"
 #include "BKE_fcurve.h"
@@ -333,6 +334,15 @@ static void 
libblock_remap_data_postprocess_object_fromgroup_update(Main *bmain,
        }
 }
 
+static void libblock_remap_data_postprocess_object_fromcollection_update(Main 
*bmain, Object *old_ob, Object *new_ob)
+{
+       if (new_ob == NULL) {
+               for (Scene *scene = bmain->scene.first; scene; scene = 
scene->id.next) {
+                       BKE_collections_object_remove(scene, old_ob);
+               }
+       }
+}
+
 static void libblock_remap_data_postprocess_group_scene_unlink(Main 
*UNUSED(bmain), Scene *sce, ID *old_id)
 {
        /* Note that here we assume no object has no base (i.e. all objects are 
assumed instanced
@@ -542,6 +552,7 @@ void BKE_libblock_remap_locked(
        switch (GS(old_id->name)) {
                case ID_OB:
                        
libblock_remap_data_postprocess_object_fromgroup_update(bmain, (Object 
*)old_id, (Object *)new_id);
+                       
libblock_remap_data_postprocess_object_fromcollection_update(bmain, (Object 
*)old_id, (Object *)new_id);
                        break;
                case ID_GR:
                        if (!new_id) {  /* Only affects us in case group was 
unlinked. */

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

Reply via email to