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).
This commit is contained in:
Bastien Montagne 2016-02-22 12:09:36 +01:00
parent 9cfc203749
commit 20104beea7
Notes: blender-bot 2023-02-14 08:29:54 +01:00
Referenced by issue #47482, Object linked to scene, is not updated correctly in GroupInstance (objects with face users)
3 changed files with 13 additions and 3 deletions

View File

@ -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);

View File

@ -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:

View File

@ -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;