Fix T47482: take II, restore 2.76 behavior regarding groups when deleting an object.
authorBastien Montagne <montagne29@wanadoo.fr>
Mon, 22 Feb 2016 11:09:36 +0000 (12:09 +0100)
committerBastien Montagne <montagne29@wanadoo.fr>
Mon, 22 Feb 2016 11:16:29 +0000 (12:16 +0100)
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).

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

index 4bd762a0ca3273ff3044f663d85e1f35b0386fdf..9cfc0373952c6e4d356908f56062a238502a21d7 100644 (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);
index c06f776f6d0a868d65ef9b89efde7e55fc0c5e1c..c04eda009043fbfe93f16bf6c22c7e6452d8c727 100644 (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:
index 57d16d3104b6a41bbbae366907d229888401e578..88ab3450b049c9b4adf1552a582d93ba8033e0dd 100644 (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;