diff --git a/source/blender/blenkernel/BKE_blendfile_link_append.hh b/source/blender/blenkernel/BKE_blendfile_link_append.hh index 5ae60bff991..0e70a602d60 100644 --- a/source/blender/blenkernel/BKE_blendfile_link_append.hh +++ b/source/blender/blenkernel/BKE_blendfile_link_append.hh @@ -168,6 +168,12 @@ void BKE_blendfile_append(BlendfileLinkAppendContext *lapp_context, ReportList * */ void BKE_blendfile_link(BlendfileLinkAppendContext *lapp_context, ReportList *reports); +/** + * Instantiate loose data in the scene (e.g. add object to the active collection). + */ +void BKE_blendfile_link_append_instantiate_loose(BlendfileLinkAppendContext *lapp_context, + ReportList *reports); + /** * Options controlling the behavior of liboverrides creation. */ diff --git a/source/blender/blenkernel/intern/blender_copybuffer.cc b/source/blender/blenkernel/intern/blender_copybuffer.cc index aa2ca44317b..ffbca5a1313 100644 --- a/source/blender/blenkernel/intern/blender_copybuffer.cc +++ b/source/blender/blenkernel/intern/blender_copybuffer.cc @@ -50,6 +50,9 @@ static void copybuffer_append(BlendfileLinkAppendContext *lapp_context, /* Append, rather than linking */ BKE_blendfile_append(lapp_context, reports); + /* Instantiate loose data in the scene (e.g. add object to the active collection). */ + BKE_blendfile_link_append_instantiate_loose(lapp_context, reports); + /* This must be unset, otherwise these object won't link into other scenes from this blend * file. */ BKE_main_id_tag_all(bmain, LIB_TAG_PRE_EXISTING, false); diff --git a/source/blender/blenkernel/intern/blendfile_link_append.cc b/source/blender/blenkernel/intern/blendfile_link_append.cc index 07f6c17582a..94323aef735 100644 --- a/source/blender/blenkernel/intern/blendfile_link_append.cc +++ b/source/blender/blenkernel/intern/blendfile_link_append.cc @@ -1476,12 +1476,6 @@ void BKE_blendfile_append(BlendfileLinkAppendContext *lapp_context, ReportList * } BKE_id_multi_tagged_delete(bmain); - /* Instantiate newly created (duplicated) IDs as needed. */ - LooseDataInstantiateContext instantiate_context{}; - instantiate_context.lapp_context = lapp_context; - instantiate_context.active_collection = nullptr; - loose_data_instantiate(&instantiate_context); - BKE_main_id_newptr_and_tag_clear(bmain); BlendFileReadReport bf_reports{}; @@ -1535,12 +1529,13 @@ static int foreach_libblock_link_finalize_cb(LibraryIDLinkCallbackData *cb_data) return IDWALK_RET_NOP; } -static void blendfile_link_finalize(BlendfileLinkAppendContext *lapp_context, ReportList *reports) +void BKE_blendfile_link_append_instantiate_loose(BlendfileLinkAppendContext *lapp_context, + ReportList *reports) { - BLI_assert((lapp_context->params->flag & FILE_LINK) != 0); - - /* Instantiate newly linked IDs as needed. */ - if (lapp_context->params->context.scene != nullptr) { + if (!lapp_context->params->context.scene) { + return; + } + if (lapp_context->params->flag & FILE_LINK) { new_id_to_item_mapping_create(lapp_context); /* Add items for all not yet known IDs (i.e. implicitly linked indirect dependencies) to the * list. @@ -1564,16 +1559,12 @@ static void blendfile_link_finalize(BlendfileLinkAppendContext *lapp_context, Re &cb_data, IDWALK_NOP); } - - LooseDataInstantiateContext instantiate_context{}; - instantiate_context.lapp_context = lapp_context; - instantiate_context.active_collection = nullptr; - loose_data_instantiate(&instantiate_context); } - BlendFileReadReport bf_reports{}; - bf_reports.reports = reports; - BLO_read_do_version_after_setup(lapp_context->params->bmain, &bf_reports); + LooseDataInstantiateContext instantiate_context{}; + instantiate_context.lapp_context = lapp_context; + instantiate_context.active_collection = nullptr; + loose_data_instantiate(&instantiate_context); } void BKE_blendfile_link(BlendfileLinkAppendContext *lapp_context, ReportList *reports) @@ -1646,8 +1637,10 @@ void BKE_blendfile_link(BlendfileLinkAppendContext *lapp_context, ReportList *re * * In append case, the finalizing process is much more complex and requires and additional call * to #BKE_blendfile_append for caller code. */ - if ((lapp_context->params->flag & FILE_LINK) != 0) { - blendfile_link_finalize(lapp_context, reports); + if (lapp_context->params->flag & FILE_LINK) { + BlendFileReadReport bf_reports{}; + bf_reports.reports = reports; + BLO_read_do_version_after_setup(lapp_context->params->bmain, &bf_reports); } } diff --git a/source/blender/editors/space_view3d/space_view3d.cc b/source/blender/editors/space_view3d/space_view3d.cc index 9236b80a46b..fe2e4ebe341 100644 --- a/source/blender/editors/space_view3d/space_view3d.cc +++ b/source/blender/editors/space_view3d/space_view3d.cc @@ -780,26 +780,38 @@ static void view3d_ob_drop_copy_external_asset(bContext *C, wmDrag *drag, wmDrop * can use the context setup here to place the objects. */ BLI_assert(drag->type == WM_DRAG_ASSET); + Main *bmain = CTX_data_main(C); wmDragAsset *asset_drag = WM_drag_get_asset_data(drag, 0); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + View3D *v3d = CTX_wm_view3d(C); BKE_view_layer_base_deselect_all(scene, view_layer); - ID *id = WM_drag_asset_id_import(C, asset_drag, FILE_AUTOSELECT); + Object *object = reinterpret_cast( + WM_drag_asset_id_import(C, asset_drag, FILE_AUTOSELECT)); + + LayerCollection *lc = BKE_layer_collection_get_active(view_layer); + Collection *collection = BKE_collection_parent_editable_find_recursive(view_layer, + lc->collection); + object->visibility_flag &= ~(OB_HIDE_VIEWPORT | OB_HIDE_SELECT); + + BKE_collection_object_add(bmain, collection, object); + BKE_view_layer_synced_ensure(scene, view_layer); + Base *base = BKE_view_layer_base_find(view_layer, object); + base->local_view_bits |= v3d->local_view_uid; + base->flag |= BASE_SELECTED; + BKE_scene_object_base_flag_sync_from_base(base); /* TODO(sergey): Only update relations for the current scene. */ DEG_relations_tag_update(CTX_data_main(C)); WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene); - RNA_int_set(drop->ptr, "session_uid", id->session_uid); + RNA_int_set(drop->ptr, "session_uid", object->id.session_uid); BKE_view_layer_synced_ensure(scene, view_layer); - Base *base = BKE_view_layer_base_find(view_layer, (Object *)id); - if (base != nullptr) { - BKE_view_layer_base_select_and_set_active(view_layer, base); - WM_main_add_notifier(NC_SCENE | ND_OB_ACTIVE, scene); - } + BKE_view_layer_base_select_and_set_active(view_layer, base); + WM_main_add_notifier(NC_SCENE | ND_OB_ACTIVE, scene); DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); ED_outliner_select_sync_from_object_tag(C); @@ -812,7 +824,7 @@ static void view3d_ob_drop_copy_external_asset(bContext *C, wmDrag *drag, wmDrop if (snap_state) { float obmat_final[4][4]; - view3d_ob_drop_matrix_from_snap(snap_state, (Object *)id, obmat_final); + view3d_ob_drop_matrix_from_snap(snap_state, object, obmat_final); RNA_float_set_array(drop->ptr, "matrix", &obmat_final[0][0]); } diff --git a/source/blender/windowmanager/intern/wm_files_link.cc b/source/blender/windowmanager/intern/wm_files_link.cc index b294aa126d9..2cc1f76bc11 100644 --- a/source/blender/windowmanager/intern/wm_files_link.cc +++ b/source/blender/windowmanager/intern/wm_files_link.cc @@ -366,6 +366,9 @@ static int wm_link_append_exec(bContext *C, wmOperator *op) BKE_blendfile_append(lapp_context, op->reports); } + /* Instantiate loose data in the scene (e.g. add object to the active collection). */ + BKE_blendfile_link_append_instantiate_loose(lapp_context, op->reports); + BKE_blendfile_link_append_context_free(lapp_context); /* Important we unset, otherwise these object won't