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

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to