[Bf-blender-cvs] [36c34b9] render-layers: From review: handle post processing of objects after they are removed

Dalai Felinto noreply at git.blender.org
Wed Jan 4 09:41:14 CET 2017


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




More information about the Bf-blender-cvs mailing list