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