diff options
author | Bastien Montagne <bastien@blender.org> | 2022-08-24 18:12:01 +0300 |
---|---|---|
committer | Bastien Montagne <bastien@blender.org> | 2022-08-24 18:12:01 +0300 |
commit | 5d4d5a216271e22ed9775402dedff33cdf420e30 (patch) | |
tree | 6ef6e3f20fac05e50ebaba3da5c5c9a283154a9f /source/blender/editors/object | |
parent | 61896947d4b75829d4275043e1554bd5eb4d8abb (diff) | |
parent | 8b7293eb4168908945d562fdd1c3f8cd4d4944e5 (diff) |
Merge branch 'blender-v3.3-release'
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/object_relations.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 6a922f11c8b..206dbba8704 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -2420,6 +2420,8 @@ static int make_override_library_exec(bContext *C, wmOperator *op) DEG_id_tag_update(&CTX_data_scene(C)->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE); WM_event_add_notifier(C, NC_WINDOW, NULL); + WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, NULL); + WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); return success ? OPERATOR_FINISHED : OPERATOR_CANCELLED; } @@ -2552,7 +2554,8 @@ static int reset_override_library_exec(bContext *C, wmOperator *UNUSED(op)) } FOREACH_SELECTED_OBJECT_END; - WM_event_add_notifier(C, NC_WM | ND_DATACHANGED, NULL); + WM_event_add_notifier(C, NC_WINDOW, NULL); + WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, NULL); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); return OPERATOR_FINISHED; @@ -2582,26 +2585,49 @@ void OBJECT_OT_reset_override_library(wmOperatorType *ot) static int clear_override_library_exec(bContext *C, wmOperator *UNUSED(op)) { Main *bmain = CTX_data_main(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + Scene *scene = CTX_data_scene(C); + LinkNode *todo_objects = NULL, *todo_object_iter; /* Make already existing selected liboverrides editable. */ - FOREACH_SELECTED_OBJECT_BEGIN (CTX_data_view_layer(C), CTX_wm_view3d(C), ob_iter) { + FOREACH_SELECTED_OBJECT_BEGIN (view_layer, CTX_wm_view3d(C), ob_iter) { if (ID_IS_LINKED(ob_iter)) { continue; } + BLI_linklist_prepend_alloca(&todo_objects, ob_iter); + } + FOREACH_SELECTED_OBJECT_END; + + for (todo_object_iter = todo_objects; todo_object_iter != NULL; + todo_object_iter = todo_object_iter->next) { + Object *ob_iter = todo_object_iter->link; if (BKE_lib_override_library_is_hierarchy_leaf(bmain, &ob_iter->id)) { + bool do_remap_active = false; + if (OBACT(view_layer) == ob_iter) { + do_remap_active = true; + } BKE_libblock_remap(bmain, &ob_iter->id, ob_iter->id.override_library->reference, ID_REMAP_SKIP_INDIRECT_USAGE); + if (do_remap_active) { + Object *ref_object = ob_iter->id.override_library->reference; + Base *basact = BKE_view_layer_base_find(view_layer, ref_object); + if (basact != NULL) { + view_layer->basact = basact; + } + DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); + } BKE_id_delete(bmain, &ob_iter->id); } else { BKE_lib_override_library_id_reset(bmain, &ob_iter->id, true); } } - FOREACH_SELECTED_OBJECT_END; - WM_event_add_notifier(C, NC_WM | ND_DATACHANGED, NULL); + DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS | ID_RECALC_COPY_ON_WRITE); + WM_event_add_notifier(C, NC_WINDOW, NULL); + WM_event_add_notifier(C, NC_WM | ND_LIB_OVERRIDE_CHANGED, NULL); WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, NULL); return OPERATOR_FINISHED; |