diff options
Diffstat (limited to 'source/blender/editors/object/object_add.c')
-rw-r--r-- | source/blender/editors/object/object_add.c | 83 |
1 files changed, 45 insertions, 38 deletions
diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index d9c743aaf27..8d64d8b67e9 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -71,7 +71,6 @@ #include "BKE_displist.h" #include "BKE_effect.h" #include "BKE_font.h" -#include "BKE_group.h" #include "BKE_lamp.h" #include "BKE_lattice.h" #include "BKE_layer.h" @@ -1048,11 +1047,11 @@ void OBJECT_OT_lamp_add(wmOperatorType *ot) ED_object_add_generic_props(ot, false); } -/********************* Add Group Instance Operator ********************/ +/********************* Add Collection Instance Operator ********************/ -static int group_instance_add_exec(bContext *C, wmOperator *op) +static int collection_instance_add_exec(bContext *C, wmOperator *op) { - Group *group; + Collection *collection; unsigned int layer; float loc[3], rot[3]; @@ -1060,7 +1059,7 @@ static int group_instance_add_exec(bContext *C, wmOperator *op) char name[MAX_ID_NAME - 2]; RNA_string_get(op->ptr, "name", name); - group = (Group *)BKE_libblock_find_name(ID_GR, name); + collection = (Collection *)BKE_libblock_find_name(ID_GR, name); if (0 == RNA_struct_property_is_set(op->ptr, "location")) { const wmEvent *event = CTX_wm_window(C)->eventstate; @@ -1073,22 +1072,30 @@ static int group_instance_add_exec(bContext *C, wmOperator *op) } } else - group = BLI_findlink(&CTX_data_main(C)->group, RNA_enum_get(op->ptr, "group")); + collection = BLI_findlink(&CTX_data_main(C)->collection, RNA_enum_get(op->ptr, "collection")); if (!ED_object_add_generic_get_opts(C, op, 'Z', loc, rot, NULL, &layer, NULL)) return OPERATOR_CANCELLED; - if (group) { + if (collection) { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); - Object *ob = ED_object_add_type(C, OB_EMPTY, group->id.name + 2, loc, rot, false, layer); - ob->dup_group = group; - ob->transflag |= OB_DUPLIGROUP; - id_us_plus(&group->id); + ViewLayer *view_layer = CTX_data_view_layer(C); + + /* Avoid dependency cycles. */ + LayerCollection *active_lc = BKE_layer_collection_get_active(view_layer); + while (BKE_collection_find_cycle(active_lc->collection, collection)) { + active_lc = BKE_layer_collection_activate_parent(view_layer, active_lc); + } + + Object *ob = ED_object_add_type(C, OB_EMPTY, collection->id.name + 2, loc, rot, false, layer); + ob->dup_group = collection; + ob->transflag |= OB_DUPLICOLLECTION; + id_us_plus(&collection->id); /* works without this except if you try render right after, see: 22027 */ DEG_relations_tag_update(bmain); - DEG_id_tag_update(&group->id, 0); + DEG_id_tag_update(&collection->id, 0); WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); @@ -1099,27 +1106,27 @@ static int group_instance_add_exec(bContext *C, wmOperator *op) } /* only used as menu */ -void OBJECT_OT_group_instance_add(wmOperatorType *ot) +void OBJECT_OT_collection_instance_add(wmOperatorType *ot) { PropertyRNA *prop; /* identifiers */ - ot->name = "Add Group Instance"; - ot->description = "Add a dupligroup instance"; - ot->idname = "OBJECT_OT_group_instance_add"; + ot->name = "Add Collection Instance"; + ot->description = "Add a collection instance"; + ot->idname = "OBJECT_OT_collection_instance_add"; /* api callbacks */ ot->invoke = WM_enum_search_invoke; - ot->exec = group_instance_add_exec; + ot->exec = collection_instance_add_exec; ot->poll = ED_operator_objectmode; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; /* properties */ - RNA_def_string(ot->srna, "name", "Group", MAX_ID_NAME - 2, "Name", "Group name to add"); - prop = RNA_def_enum(ot->srna, "group", DummyRNA_NULL_items, 0, "Group", ""); - RNA_def_enum_funcs(prop, RNA_group_itemf); + RNA_def_string(ot->srna, "name", "Collection", MAX_ID_NAME - 2, "Name", "Collection name to add"); + prop = RNA_def_enum(ot->srna, "collection", DummyRNA_NULL_items, 0, "Collection", ""); + RNA_def_enum_funcs(prop, RNA_collection_itemf); RNA_def_property_flag(prop, PROP_ENUM_NO_TRANSLATE); ot->prop = prop; ED_object_add_generic_props(ot, false); @@ -1197,7 +1204,7 @@ void ED_object_base_free_and_unlink(Main *bmain, Scene *scene, Object *ob) DEG_id_tag_update_ex(bmain, &ob->id, DEG_TAG_BASE_FLAGS_UPDATE); - BKE_collections_object_remove(bmain, &scene->id, ob, true); + BKE_scene_collections_object_remove(bmain, scene, ob, true); } static int object_delete_exec(bContext *C, wmOperator *op) @@ -1331,7 +1338,7 @@ static void copy_object_set_idnew(bContext *C) /********************* Make Duplicates Real ************************/ /** - * \note regarding hashing dupli-objects when using OB_DUPLIGROUP, skip the first member of #DupliObject.persistent_id + * \note regarding hashing dupli-objects when using OB_DUPLICOLLECTION, skip the first member of #DupliObject.persistent_id * since its a unique index and we only want to know if the group objects are from the same dupli-group instance. */ static unsigned int dupliobject_group_hash(const void *ptr) @@ -1346,7 +1353,7 @@ static unsigned int dupliobject_group_hash(const void *ptr) } /** - * \note regarding hashing dupli-objects when NOT using OB_DUPLIGROUP, include the first member of #DupliObject.persistent_id + * \note regarding hashing dupli-objects when NOT using OB_DUPLICOLLECTION, include the first member of #DupliObject.persistent_id * since its the index of the vertex/face the object is instantiated on and we want to identify objects on the same vertex/face. */ static unsigned int dupliobject_hash(const void *ptr) @@ -1418,7 +1425,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base, dupli_gh = BLI_ghash_ptr_new(__func__); if (use_hierarchy) { - if (base->object->transflag & OB_DUPLIGROUP) { + if (base->object->transflag & OB_DUPLICOLLECTION) { parent_gh = BLI_ghash_new(dupliobject_group_hash, dupliobject_group_cmp, __func__); } else { @@ -1438,7 +1445,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base, ob_dst->totcol = 0; } - BKE_collection_object_add_from(scene, base->object, ob_dst); + BKE_collection_object_add_from(bmain, scene, base->object, ob_dst); base_dst = BKE_view_layer_base_find(view_layer, ob_dst); BLI_assert(base_dst != NULL); @@ -1492,7 +1499,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base, * they won't be read, this is simply for a hash lookup. */ DupliObject dob_key; dob_key.ob = ob_src_par; - if (base->object->transflag & OB_DUPLIGROUP) { + if (base->object->transflag & OB_DUPLICOLLECTION) { memcpy(&dob_key.persistent_id[1], &dob->persistent_id[1], sizeof(dob->persistent_id[1]) * (MAX_DUPLI_RECUR - 1)); @@ -1537,7 +1544,7 @@ static void make_object_duplilist_real(bContext *C, Scene *scene, Base *base, } } - if (base->object->transflag & OB_DUPLIGROUP && base->object->dup_group) { + if (base->object->transflag & OB_DUPLICOLLECTION && base->object->dup_group) { for (Object *ob = bmain->object.first; ob; ob = ob->id.next) { if (ob->proxy_group == base->object) { ob->proxy = NULL; @@ -1659,7 +1666,7 @@ static Base *duplibase_for_convert(Main *bmain, Scene *scene, ViewLayer *view_la obn = BKE_object_copy(bmain, ob); DEG_id_tag_update(&ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); - BKE_collection_object_add_from(scene, ob, obn); + BKE_collection_object_add_from(bmain, scene, ob, obn); basen = BKE_view_layer_base_find(view_layer, obn); ED_object_base_select(basen, BA_SELECT); @@ -2068,23 +2075,23 @@ static Base *object_add_duplicate_internal(Main *bmain, Scene *scene, ViewLayer base = BKE_view_layer_base_find(view_layer, ob); if ((base != NULL) && (base->flag & BASE_VISIBLED)) { - BKE_collection_object_add_from(scene, ob, obn); + BKE_collection_object_add_from(bmain, scene, ob, obn); } else { - LayerCollection *layer_collection = BKE_layer_collection_get_active_ensure(scene, view_layer); - BKE_collection_object_add(&scene->id, layer_collection->scene_collection, obn); + LayerCollection *layer_collection = BKE_layer_collection_get_active(view_layer); + BKE_collection_object_add(bmain, layer_collection->collection, obn); } basen = BKE_view_layer_base_find(view_layer, obn); - /* 1) duplis should end up in same group as the original - * 2) Rigid Body sim participants MUST always be part of a group... + /* 1) duplis should end up in same collection as the original + * 2) Rigid Body sim participants MUST always be part of a collection... */ // XXX: is 2) really a good measure here? - if ((ob->flag & OB_FROMGROUP) != 0 || ob->rigidbody_object || ob->rigidbody_constraint) { - Group *group; - for (group = bmain->group.first; group; group = group->id.next) { - if (BKE_group_object_exists(group, ob)) - BKE_group_object_add(group, obn); + if (ob->rigidbody_object || ob->rigidbody_constraint) { + Collection *collection; + for (collection = bmain->collection.first; collection; collection = collection->id.next) { + if (BKE_collection_has_object(collection, ob)) + BKE_collection_object_add(bmain, collection, obn); } } |