[Bf-blender-cvs] [988024063f] render-layers: Use ObjectBase only to delete objects

Dalai Felinto noreply at git.blender.org
Fri Jan 13 11:21:38 CET 2017


Commit: 988024063f7145f5e4d77d0914ddcba0856c6423
Author: Dalai Felinto
Date:   Fri Jan 13 11:21:20 2017 +0100
Branches: render-layers
https://developer.blender.org/rB988024063f7145f5e4d77d0914ddcba0856c6423

Use ObjectBase only to delete objects

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

M	source/blender/blenkernel/BKE_collection.h
M	source/blender/blenkernel/intern/collection.c
M	source/blender/blenkernel/intern/library_remap.c
M	source/blender/editors/armature/armature_relations.c
M	source/blender/editors/curve/editcurve.c
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/mesh/meshtools.c
M	source/blender/editors/object/object_add.c
M	source/blender/editors/space_outliner/outliner_tools.c
M	source/blender/makesrna/intern/rna_scene.c

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

diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h
index 5f09ad9cde..ef7acd3be5 100644
--- a/source/blender/blenkernel/BKE_collection.h
+++ b/source/blender/blenkernel/BKE_collection.h
@@ -39,6 +39,7 @@ struct Iterator;
 struct SceneCollection;
 struct Object;
 struct ObjectBase;
+struct Main;
 struct Scene;
 
 struct SceneCollection *BKE_collection_add(struct Scene *scene, struct SceneCollection *sc_parent, const char *name);
@@ -46,8 +47,8 @@ bool BKE_collection_remove(struct Scene *scene, struct SceneCollection *sc);
 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);
+void BKE_collection_object_remove(struct Main *bmain, struct Scene *scene, struct SceneCollection *sc, struct Object *object, const bool free_us);
+void BKE_collections_object_remove(struct Main *bmain, struct Scene *scene, struct Object *object, const bool free_us);
 
 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 d88d3fe5b0..1b81905c26 100644
--- a/source/blender/blenkernel/intern/collection.c
+++ b/source/blender/blenkernel/intern/collection.c
@@ -33,6 +33,7 @@
 #include "BKE_collection.h"
 #include "BKE_layer.h"
 #include "BKE_library.h"
+#include "BKE_main.h"
 #include "BKE_scene.h"
 
 #include "DNA_ID.h"
@@ -195,7 +196,7 @@ void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc,
 /**
  * Remove object from collection
  */
-void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection *sc, struct Object *ob)
+void BKE_collection_object_remove(Main *bmain, Scene *scene, SceneCollection *sc, Object *ob, const bool free_us)
 {
 
 	LinkData *link = BLI_findptr(&sc->objects, ob, offsetof(LinkData, data));
@@ -207,23 +208,28 @@ void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection *s
 	BLI_remlink(&sc->objects, link);
 	MEM_freeN(link);
 
-	id_us_min((ID *)ob);
-
 	TODO_LAYER_SYNC_FILTER; /* need to remove all instances of ob in scene collections -> filter_objects */
 	BKE_layer_sync_object_unlink(scene, sc, ob);
+
+	if (free_us) {
+		BKE_libblock_free_us(bmain, ob);
+	}
+	else {
+		id_us_min(&ob->id);
+	}
 }
 
 /**
  * Remove object from all collections of scene
  */
-void BKE_collections_object_remove(Scene *scene, Object *ob)
+void BKE_collections_object_remove(Main *bmain, Scene *scene, Object *ob, const bool free_us)
 {
 	BKE_scene_remove_rigidbody_object(scene, ob);
 
 	SceneCollection *sc;
 	FOREACH_SCENE_COLLECTION(scene, sc)
 	{
-		BKE_collection_object_remove(scene, sc, ob);
+		BKE_collection_object_remove(bmain, scene, sc, ob, free_us);
 	}
 	FOREACH_SCENE_COLLECTION_END
 }
diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c
index 44cf3d0420..4f87beb2bb 100644
--- a/source/blender/blenkernel/intern/library_remap.c
+++ b/source/blender/blenkernel/intern/library_remap.c
@@ -255,7 +255,7 @@ static void libblock_remap_data_preprocess_scene_base_unlink(
 	}
 }
 
-/* Some reamapping unfortunately require extra and/or specific handling, tackle those here. */
+/* Some remapping unfortunately require extra and/or specific handling, tackle those here. */
 static void libblock_remap_data_preprocess_scene_object_unlink(
         IDRemap *r_id_remap_data, Scene *sce, Object *ob, const bool skip_indirect, const bool is_indirect)
 {
@@ -264,7 +264,7 @@ static void libblock_remap_data_preprocess_scene_object_unlink(
 		r_id_remap_data->skipped_refcounted++;
 	}
 	else {
-		BKE_collections_object_remove(sce, ob);
+		BKE_collections_object_remove(r_id_remap_data->bmain, sce, ob, false);
 		if (!is_indirect) {
 			r_id_remap_data->status |= ID_REMAP_IS_LINKED_DIRECT;
 		}
diff --git a/source/blender/editors/armature/armature_relations.c b/source/blender/editors/armature/armature_relations.c
index b8127f6812..5afb5200c7 100644
--- a/source/blender/editors/armature/armature_relations.c
+++ b/source/blender/editors/armature/armature_relations.c
@@ -401,7 +401,7 @@ int join_armature_exec(bContext *C, wmOperator *op)
 			}
 			
 			/* Free the old object data */
-			ED_base_object_free_and_unlink(bmain, scene, base);
+			ED_base_object_free_and_unlink(bmain, scene, base->object);
 		}
 	}
 	CTX_DATA_END;
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 7f8199300d..dcb8023664 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -6033,7 +6033,7 @@ int join_curve_exec(bContext *C, wmOperator *op)
 					}
 				}
 			
-				ED_base_object_free_and_unlink(bmain, scene, base);
+				ED_base_object_free_and_unlink(bmain, scene, base->object);
 			}
 		}
 	}
diff --git a/source/blender/editors/include/ED_object.h b/source/blender/editors/include/ED_object.h
index e04e834165..1be6b5da7c 100644
--- a/source/blender/editors/include/ED_object.h
+++ b/source/blender/editors/include/ED_object.h
@@ -107,7 +107,7 @@ void ED_base_object_activate(struct bContext *C, struct Base *base);
 void ED_object_base_select(struct ObjectBase *base, short mode);
 void ED_object_base_activate(struct bContext *C, struct ObjectBase *base);
 
-void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Base *base);
+void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Object *ob);
 
 /* single object duplicate, if (dupflag == 0), fully linked, else it uses the flags given */
 struct Base *ED_object_add_duplicate(struct Main *bmain, struct Scene *scene, struct Base *base, int dupflag);
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index b26989113d..a56e4fe4df 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -481,7 +481,7 @@ int join_mesh_exec(bContext *C, wmOperator *op)
 			
 			/* free base, now that data is merged */
 			if (base->object != ob)
-				ED_base_object_free_and_unlink(bmain, scene, base);
+				ED_base_object_free_and_unlink(bmain, scene, base->object);
 		}
 	}
 	CTX_DATA_END;
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 8c06d75955..3848d8e62a 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -1111,22 +1111,19 @@ static void object_delete_check_glsl_update(Object *ob)
 
 /* remove base from a specific scene */
 /* note: now unlinks constraints as well */
-void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Base *base)
+void ED_base_object_free_and_unlink(Main *bmain, Scene *scene, Object *ob)
 {
-	if (BKE_library_ID_is_indirectly_used(bmain, base->object) &&
-	    ID_REAL_USERS(base->object) <= 1 && ID_EXTRA_USERS(base->object) == 0)
+	if (BKE_library_ID_is_indirectly_used(bmain, ob) &&
+	    ID_REAL_USERS(ob) <= 1 && ID_EXTRA_USERS(ob) == 0)
 	{
 		/* We cannot delete indirectly used object... */
 		printf("WARNING, undeletable object '%s', should have been catched before reaching this function!",
-		       base->object->id.name + 2);
+		       ob->id.name + 2);
 		return;
 	}
 
-	BKE_scene_base_unlink(scene, base);
-	BKE_collections_object_remove(scene, base->object);
-	object_delete_check_glsl_update(base->object);
-	BKE_libblock_free_us(bmain, base->object);
-	MEM_freeN(base);
+	object_delete_check_glsl_update(ob);
+	BKE_collections_object_remove(bmain, scene, ob, true);
 	DAG_id_type_tag(bmain, ID_OB);
 }
 
@@ -1142,56 +1139,46 @@ static int object_delete_exec(bContext *C, wmOperator *op)
 	if (CTX_data_edit_object(C)) 
 		return OPERATOR_CANCELLED;
 
-	CTX_DATA_BEGIN (C, Base *, base, selected_bases)
+	CTX_DATA_BEGIN (C, Object *, ob, selected_objects)
 	{
-		const bool is_indirectly_used = BKE_library_ID_is_indirectly_used(bmain, base->object);
-		if (base->object->id.tag & LIB_TAG_INDIRECT) {
+		const bool is_indirectly_used = BKE_library_ID_is_indirectly_used(bmain, ob);
+		if (ob->id.tag & LIB_TAG_INDIRECT) {
 			/* Can this case ever happen? */
-			BKE_reportf(op->reports, RPT_WARNING, "Cannot delete indirectly linked object '%s'", base->object->id.name + 2);
+			BKE_reportf(op->reports, RPT_WARNING, "Cannot delete indirectly linked object '%s'", ob->id.name + 2);
 			continue;
 		}
-		else if (is_indirectly_used && ID_REAL_USERS(base->object) <= 1 && ID_EXTRA_USERS(base->object) == 0) {
+		else if (is_indirectly_used && ID_REAL_USERS(ob) <= 1 && ID_EXTRA_USERS(ob) == 0) {
 			BKE_reportf(op->reports, RPT_WARNING,
 			        "Cannot delete object '%s' from scene '%s', indirectly used objects need at least one user",
-			        base->object->id.name + 2, scene->id.name + 2);
+			        ob->id.name + 2, scene->id.name + 2);
 			continue;
 		}
 		/* remove from Grease Pencil parent */
 		for (bGPdata *gpd = bmain->gpencil.first; gpd; gpd = gpd->id.next) {
 			for (bGPDlayer *gpl = gpd->layers.first; gpl; gpl = gpl->next) {
 				if (gpl->parent != NULL) {
-					Object *ob = gpl->parent;
-					Object *curob = base->object;
-					if (ob == curob) {
+					if (gpl->parent == ob) {
 						gpl->parent = NULL;
 					}
 				}
 			}
 		}
 
-		/* deselect object -- it could be used in other scenes */
-		base->object->flag &= ~SELECT;
-
 		/* remove from current scene only */
-		ED_base_object_free_and_unlink(bmain, scene, base);
+		ED_base_object_free_and_unlink(bmain, scene, ob);
 		changed = true;
 
 		if (use_global) {
 			Scene *scene_iter;
-			Base *base_other;
-
 			for (scene_iter = bmain->scene.first; scene_iter; scene_iter = scene_iter->id.next) {
 				if (scene_iter != scene && !ID_IS_LINKED_DATABLOCK(scene_iter)) {
-					base_other = BKE_scene_base_find(scene_iter, base->

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list