[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