[Bf-blender-cvs] [20104be] master: Fix T47482: take II, restore 2.76 behavior regarding groups when deleting an object.

Bastien Montagne noreply at git.blender.org
Mon Feb 22 12:21:43 CET 2016


Commit: 20104beea7d3bbcc32108fae935270503c251e54
Author: Bastien Montagne
Date:   Mon Feb 22 12:09:36 2016 +0100
Branches: master
https://developer.blender.org/rB20104beea7d3bbcc32108fae935270503c251e54

Fix T47482: take II, restore 2.76 behavior regarding groups when deleting an object.

Also re-reported through IRC by Thomas Beck (@plasmasolutions), thanks.

Though it's not ideal in theory, we have quite poor handling of object datablock currently
from user PoV - before this commit, it was not easily possible to get fully rid of an object
anymore if you did not removed it from all its groups before deleting it.

So for now, restore 2.76 behavior (namely, unlink an object from avaerything in Blender
once it is no more used by any scene).

Better handling of all this is TODO for later (also related to much more heavy changes
done in id-remap branch regarding sanitizing our ID deletion process).

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

M	source/blender/blenkernel/BKE_library.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/editors/object/object_add.c

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

diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 4bd762a..9cfc037 100644
--- a/source/blender/blenkernel/BKE_library.h
+++ b/source/blender/blenkernel/BKE_library.h
@@ -72,6 +72,7 @@ void BKE_id_lib_local_paths(struct Main *bmain, struct Library *lib, struct ID *
 void id_lib_extern(struct ID *id);
 void BKE_library_filepath_set(struct Library *lib, const char *filepath);
 void id_us_ensure_real(struct ID *id);
+void id_us_clear_real(struct ID *id);
 void id_us_plus(struct ID *id);
 void id_us_min(struct ID *id);
 void id_fake_user_set(struct ID *id);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index c06f776..c04eda0 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -183,7 +183,7 @@ void id_us_ensure_real(ID *id)
 }
 
 /* Unused currently... */
-static void UNUSED_FUNCTION(id_us_clear_real)(ID *id)
+void id_us_clear_real(ID *id)
 {
 	if (id && (id->tag & LIB_TAG_EXTRAUSER)) {
 		if (id->tag & LIB_TAG_EXTRAUSER_SET) {
@@ -1298,6 +1298,16 @@ void BKE_libblock_free_us(Main *bmain, void *idv)      /* test users */
 	
 	id_us_min(id);
 
+	/* XXX This is a temp (2.77) hack so that we keep same behavior as in 2.76 regarding groups when deleting an object.
+	 *     Since only 'user_one' usage of objects is groups, and only 'real user' usage of objects is scenes,
+	 *     removing that 'user_one' tag when there is no more real (scene) users of an object ensures it gets
+	 *     fully unlinked.
+	 *     Otherwise, there is no real way to get rid of an object anymore - better handling of this is TODO.
+	 */
+	if ((GS(id->name) == ID_OB) && (id->us == 1)) {
+		id_us_clear_real(id);
+	}
+
 	if (id->us == 0) {
 		switch (GS(id->name)) {
 			case ID_OB:
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c
index 57d16d3..88ab345 100644
--- a/source/blender/editors/object/object_add.c
+++ b/source/blender/editors/object/object_add.c
@@ -1151,7 +1151,6 @@ static int object_delete_exec(bContext *C, wmOperator *op)
 			}
 		}
 		/* end global */
-
 	}
 	CTX_DATA_END;
 
@@ -1159,7 +1158,7 @@ static int object_delete_exec(bContext *C, wmOperator *op)
 		return OPERATOR_CANCELLED;
 
 	/* delete has to handle all open scenes */
-	BKE_main_id_tag_listbase(&bmain->scene, LIB_TAG_DOIT, 1);
+	BKE_main_id_tag_listbase(&bmain->scene, LIB_TAG_DOIT, true);
 	for (win = wm->windows.first; win; win = win->next) {
 		scene = win->screen->scene;




More information about the Bf-blender-cvs mailing list