diff options
Diffstat (limited to 'source/blender/editors/space_outliner')
11 files changed, 121 insertions, 49 deletions
diff --git a/source/blender/editors/space_outliner/outliner_collections.cc b/source/blender/editors/space_outliner/outliner_collections.cc index f24d82776ad..48e7aa381ef 100644 --- a/source/blender/editors/space_outliner/outliner_collections.cc +++ b/source/blender/editors/space_outliner/outliner_collections.cc @@ -411,7 +411,8 @@ static int collection_hierarchy_delete_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); struct wmMsgBus *mbus = CTX_wm_message_bus(C); - const Base *basact_prev = view_layer->basact; + BKE_view_layer_synced_ensure(scene, view_layer); + const Base *basact_prev = BKE_view_layer_active_base_get(view_layer); outliner_collection_delete(C, bmain, scene, op->reports, true); @@ -420,7 +421,8 @@ static int collection_hierarchy_delete_exec(bContext *C, wmOperator *op) WM_main_add_notifier(NC_SCENE | ND_LAYER, nullptr); - if (basact_prev != view_layer->basact) { + BKE_view_layer_synced_ensure(scene, view_layer); + if (basact_prev != BKE_view_layer_active_base_get(view_layer)) { WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active); } @@ -960,7 +962,7 @@ static int collection_view_layer_exec(bContext *C, wmOperator *op) BLI_gset_free(data.collections_to_edit, nullptr); - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); DEG_relations_tag_update(bmain); WM_main_add_notifier(NC_SCENE | ND_LAYER, nullptr); @@ -1109,7 +1111,7 @@ static int collection_isolate_exec(bContext *C, wmOperator *op) } BLI_gset_free(data.collections_to_edit, nullptr); - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr); @@ -1193,7 +1195,7 @@ static int collection_visibility_exec(bContext *C, wmOperator *op) } BLI_gset_free(data.collections_to_edit, nullptr); - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr); @@ -1383,7 +1385,7 @@ static int collection_flag_exec(bContext *C, wmOperator *op) BLI_gset_free(data.collections_to_edit, nullptr); } - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); if (!is_render) { @@ -1492,6 +1494,7 @@ static TreeTraversalAction outliner_hide_collect_data_to_edit(TreeElement *te, v } else if ((tselem->type == TSE_SOME_ID) && (te->idcode == ID_OB)) { Object *ob = (Object *)tselem->id; + BKE_view_layer_synced_ensure(data->scene, data->view_layer); Base *base = BKE_view_layer_base_find(data->view_layer, ob); BLI_gset_add(data->bases_to_edit, base); } @@ -1533,7 +1536,7 @@ static int outliner_hide_exec(bContext *C, wmOperator *UNUSED(op)) } BLI_gset_free(data.bases_to_edit, nullptr); - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr); @@ -1567,11 +1570,12 @@ static int outliner_unhide_all_exec(bContext *C, wmOperator *UNUSED(op)) } /* Unhide all objects. */ - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { base->flag &= ~BASE_HIDDEN; } - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr); diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.cc b/source/blender/editors/space_outliner/outliner_dragdrop.cc index 4a0e00b8bf1..758928fed8e 100644 --- a/source/blender/editors/space_outliner/outliner_dragdrop.cc +++ b/source/blender/editors/space_outliner/outliner_dragdrop.cc @@ -293,6 +293,7 @@ static bool parent_drop_allowed(TreeElement *te, Object *potential_child) * active scene and parenting them is allowed (sergey) */ if (scene) { LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { + BKE_view_layer_synced_ensure(scene, view_layer); if (BKE_view_layer_base_find(view_layer, potential_child)) { return true; } @@ -580,6 +581,7 @@ static int scene_drop_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent BKE_collection_object_add(bmain, collection, ob); LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { ED_object_base_select(base, BA_SELECT); diff --git a/source/blender/editors/space_outliner/outliner_draw.cc b/source/blender/editors/space_outliner/outliner_draw.cc index 4259d3572be..912dc436a95 100644 --- a/source/blender/editors/space_outliner/outliner_draw.cc +++ b/source/blender/editors/space_outliner/outliner_draw.cc @@ -284,6 +284,7 @@ static void outliner_object_set_flag_recursive_fn(bContext *C, DEG_id_tag_update(&ob_iter->id, ID_RECALC_COPY_ON_WRITE); } else { + BKE_view_layer_synced_ensure(scene, view_layer); Base *base_iter = BKE_view_layer_base_find(view_layer, ob_iter); /* Child can be in a collection excluded from view-layer. */ if (base_iter == nullptr) { @@ -301,7 +302,7 @@ static void outliner_object_set_flag_recursive_fn(bContext *C, DEG_relations_tag_update(bmain); } else { - BKE_layer_collection_sync(scene, view_layer); + BKE_view_layer_need_resync_tag(view_layer); DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS); } } @@ -348,6 +349,7 @@ static void outliner_base_or_object_pointer_create( RNA_id_pointer_create(&ob->id, ptr); } else { + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); RNA_pointer_create(&scene->id, &RNA_ObjectBase, base, ptr); } @@ -1146,6 +1148,7 @@ static void outliner_draw_restrictbuts(uiBlock *block, RNA_id_pointer_create(&ob->id, &ptr); if (space_outliner->show_restrict_flags & SO_RESTRICT_HIDE) { + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(view_layer, ob); if (base) { @@ -3213,6 +3216,7 @@ static bool element_should_draw_faded(const TreeViewContext *tvc, case ID_OB: { const Object *ob = (const Object *)tselem->id; /* Lookup in view layer is logically const as it only checks a cache. */ + BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer); const Base *base = (te->directdata) ? (const Base *)te->directdata : BKE_view_layer_base_find( (ViewLayer *)tvc->view_layer, (Object *)ob); @@ -3281,6 +3285,7 @@ static void outliner_draw_tree_element(bContext *C, if (tselem->type == TSE_SOME_ID) { if (te->idcode == ID_OB) { Object *ob = (Object *)tselem->id; + BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer); Base *base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(tvc->view_layer, ob); const bool is_selected = (base != nullptr) && ((base->flag & BASE_SELECTED) != 0); diff --git a/source/blender/editors/space_outliner/outliner_edit.cc b/source/blender/editors/space_outliner/outliner_edit.cc index 8618c2999c2..be3c1547579 100644 --- a/source/blender/editors/space_outliner/outliner_edit.cc +++ b/source/blender/editors/space_outliner/outliner_edit.cc @@ -1262,10 +1262,12 @@ static int outliner_open_back(TreeElement *te) /* Return element representing the active base or bone in the outliner, or NULL if none exists */ static TreeElement *outliner_show_active_get_element(bContext *C, SpaceOutliner *space_outliner, + const Scene *scene, ViewLayer *view_layer) { TreeElement *te; + BKE_view_layer_synced_ensure(scene, view_layer); Object *obact = BKE_view_layer_active_object_get(view_layer); if (!obact) { @@ -1317,11 +1319,13 @@ static void outliner_show_active(SpaceOutliner *space_outliner, static int outliner_show_active_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceOutliner *space_outliner = CTX_wm_space_outliner(C); + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); ARegion *region = CTX_wm_region(C); View2D *v2d = ®ion->v2d; - TreeElement *active_element = outliner_show_active_get_element(C, space_outliner, view_layer); + TreeElement *active_element = outliner_show_active_get_element( + C, space_outliner, scene, view_layer); if (active_element) { ID *id = TREESTORE(active_element)->id; diff --git a/source/blender/editors/space_outliner/outliner_select.cc b/source/blender/editors/space_outliner/outliner_select.cc index ffd3e08fe24..15079448317 100644 --- a/source/blender/editors/space_outliner/outliner_select.cc +++ b/source/blender/editors/space_outliner/outliner_select.cc @@ -164,6 +164,7 @@ static void do_outliner_item_mode_toggle_generic(bContext *C, TreeViewContext *t ED_undo_group_begin(C); if (ED_object_mode_set(C, OB_MODE_OBJECT)) { + BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer); Base *base_active = BKE_view_layer_base_find(tvc->view_layer, tvc->obact); if (base_active != base) { BKE_view_layer_base_deselect_all(tvc->scene, tvc->view_layer); @@ -188,6 +189,7 @@ void outliner_item_mode_toggle(bContext *C, if ((tselem->type == TSE_SOME_ID) && (te->idcode == ID_OB)) { Object *ob = (Object *)tselem->id; + BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer); Base *base = BKE_view_layer_base_find(tvc->view_layer, ob); /* Hidden objects can be removed from the mode. */ @@ -234,11 +236,13 @@ static void tree_element_viewlayer_activate(bContext *C, TreeElement *te) /** * Select object tree */ -static void do_outliner_object_select_recursive(ViewLayer *view_layer, +static void do_outliner_object_select_recursive(const Scene *scene, + ViewLayer *view_layer, Object *ob_parent, bool select) { - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + BKE_view_layer_synced_ensure(scene, view_layer); + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { Object *ob = base->object; if ((((base->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT) != 0) && BKE_object_is_child_recursive(ob_parent, ob))) { @@ -300,6 +304,7 @@ static void tree_element_object_activate(bContext *C, ob = (Object *)parent_tselem->id; /* Don't return when activating children of the previous active object. */ + BKE_view_layer_synced_ensure(scene, view_layer); if (ob == BKE_view_layer_active_object_get(view_layer) && set == OL_SETSEL_NONE) { return; } @@ -316,6 +321,7 @@ static void tree_element_object_activate(bContext *C, } /* find associated base in current scene */ + BKE_view_layer_synced_ensure(sce, view_layer); base = BKE_view_layer_base_find(view_layer, ob); if (scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) { @@ -371,7 +377,8 @@ static void tree_element_object_activate(bContext *C, if (recursive) { /* Recursive select/deselect for Object hierarchies */ - do_outliner_object_select_recursive(view_layer, ob, (base->flag & BASE_SELECTED) != 0); + do_outliner_object_select_recursive( + scene, view_layer, ob, (base->flag & BASE_SELECTED) != 0); } if (set != OL_SETSEL_NONE) { @@ -382,11 +389,15 @@ static void tree_element_object_activate(bContext *C, } } -static void tree_element_material_activate(bContext *C, ViewLayer *view_layer, TreeElement *te) +static void tree_element_material_activate(bContext *C, + const Scene *scene, + ViewLayer *view_layer, + TreeElement *te) { /* we search for the object parent */ Object *ob = (Object *)outliner_search_back(te, ID_OB); /* Note : ob->matbits can be nullptr when a local object points to a library mesh. */ + BKE_view_layer_synced_ensure(scene, view_layer); if (ob == nullptr || ob != BKE_view_layer_active_object_get(view_layer) || ob->matbits == nullptr) { return; /* just paranoia */ @@ -536,6 +547,7 @@ static void tree_element_posechannel_activate(bContext *C, } static void tree_element_bone_activate(bContext *C, + const Scene *scene, ViewLayer *view_layer, TreeElement *te, TreeStoreElem *tselem, @@ -546,6 +558,7 @@ static void tree_element_bone_activate(bContext *C, Bone *bone = static_cast<Bone *>(te->directdata); if (!(bone->flag & BONE_HIDDEN_P)) { + BKE_view_layer_synced_ensure(scene, view_layer); Object *ob = BKE_view_layer_active_object_get(view_layer); if (ob) { if (set != OL_SETSEL_EXTEND) { @@ -769,7 +782,7 @@ void tree_element_activate(bContext *C, } break; case ID_MA: - tree_element_material_activate(C, tvc->view_layer, te); + tree_element_material_activate(C, tvc->scene, tvc->view_layer, te); break; case ID_WO: tree_element_world_activate(C, tvc->scene, te); @@ -796,7 +809,7 @@ void tree_element_type_active_set(bContext *C, tree_element_defgroup_activate(C, te, tselem); break; case TSE_BONE: - tree_element_bone_activate(C, tvc->view_layer, te, tselem, set, recursive); + tree_element_bone_activate(C, tvc->scene, tvc->view_layer, te, tselem, set, recursive); break; case TSE_EBONE: tree_element_ebone_activate(C, tvc->scene, tvc->view_layer, te, tselem, set, recursive); @@ -844,11 +857,13 @@ void tree_element_type_active_set(bContext *C, } } -static eOLDrawState tree_element_defgroup_state_get(const ViewLayer *view_layer, +static eOLDrawState tree_element_defgroup_state_get(const Scene *scene, + ViewLayer *view_layer, const TreeElement *te, const TreeStoreElem *tselem) { const Object *ob = (const Object *)tselem->id; + BKE_view_layer_synced_ensure(scene, view_layer); if (ob == BKE_view_layer_active_object_get(view_layer)) { if (BKE_object_defgroup_active_index_get(ob) == te->index + 1) { return OL_DRAWSEL_NORMAL; @@ -857,12 +872,14 @@ static eOLDrawState tree_element_defgroup_state_get(const ViewLayer *view_layer, return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_bone_state_get(const ViewLayer *view_layer, +static eOLDrawState tree_element_bone_state_get(const Scene *scene, + ViewLayer *view_layer, const TreeElement *te, const TreeStoreElem *tselem) { const bArmature *arm = (const bArmature *)tselem->id; const Bone *bone = static_cast<Bone *>(te->directdata); + BKE_view_layer_synced_ensure(scene, view_layer); const Object *ob = BKE_view_layer_active_object_get(view_layer); if (ob && ob->data == arm) { if (bone->flag & BONE_SELECTED) { @@ -896,11 +913,13 @@ static eOLDrawState tree_element_object_state_get(const TreeViewContext *tvc, return (tselem->id == (const ID *)tvc->obact) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_pose_state_get(const ViewLayer *view_layer, +static eOLDrawState tree_element_pose_state_get(const Scene *scene, + const ViewLayer *view_layer, const TreeStoreElem *tselem) { const Object *ob = (const Object *)tselem->id; /* This will just lookup in a cache, it will not change the arguments. */ + BKE_view_layer_synced_ensure(scene, (ViewLayer *)view_layer); const Base *base = BKE_view_layer_base_find((ViewLayer *)view_layer, (Object *)ob); if (base == nullptr) { /* Armature not instantiated in current scene (e.g. inside an appended group). */ @@ -942,12 +961,14 @@ static eOLDrawState tree_element_viewlayer_state_get(const bContext *C, const Tr return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_posegroup_state_get(const ViewLayer *view_layer, +static eOLDrawState tree_element_posegroup_state_get(const Scene *scene, + ViewLayer *view_layer, const TreeElement *te, const TreeStoreElem *tselem) { const Object *ob = (const Object *)tselem->id; + BKE_view_layer_synced_ensure(scene, view_layer); if (ob == BKE_view_layer_active_object_get(view_layer) && ob->pose) { if (ob->pose->active_group == te->index + 1) { return OL_DRAWSEL_NORMAL; @@ -1008,12 +1029,14 @@ static eOLDrawState tree_element_layer_collection_state_get(const bContext *C, return OL_DRAWSEL_NONE; } -static eOLDrawState tree_element_active_material_get(const ViewLayer *view_layer, +static eOLDrawState tree_element_active_material_get(const Scene *scene, + ViewLayer *view_layer, const TreeElement *te) { /* we search for the object parent */ const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB); /* Note : ob->matbits can be nullptr when a local object points to a library mesh. */ + BKE_view_layer_synced_ensure(scene, view_layer); if (ob == nullptr || ob != BKE_view_layer_active_object_get(view_layer) || ob->matbits == nullptr) { return OL_DRAWSEL_NONE; /* just paranoia */ @@ -1084,7 +1107,7 @@ eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc, return OL_DRAWSEL_NONE; break; case ID_MA: - return tree_element_active_material_get(tvc->view_layer, te); + return tree_element_active_material_get(tvc->scene, tvc->view_layer, te); case ID_WO: return tree_element_active_world_get(tvc->scene, te); case ID_CA: @@ -1100,9 +1123,9 @@ eOLDrawState tree_element_type_active_state_get(const bContext *C, { switch (tselem->type) { case TSE_DEFGROUP: - return tree_element_defgroup_state_get(tvc->view_layer, te, tselem); + return tree_element_defgroup_state_get(tvc->scene, tvc->view_layer, te, tselem); case TSE_BONE: - return tree_element_bone_state_get(tvc->view_layer, te, tselem); + return tree_element_bone_state_get(tvc->scene, tvc->view_layer, te, tselem); case TSE_EBONE: return tree_element_ebone_state_get(te); case TSE_MODIFIER: @@ -1112,7 +1135,7 @@ eOLDrawState tree_element_type_active_state_get(const bContext *C, case TSE_LINKED_PSYS: return OL_DRAWSEL_NONE; case TSE_POSE_BASE: - return tree_element_pose_state_get(tvc->view_layer, tselem); + return tree_element_pose_state_get(tvc->scene, tvc->view_layer, tselem); case TSE_POSE_CHANNEL: return tree_element_posechannel_state_get(tvc->ob_pose, te, tselem); case TSE_CONSTRAINT_BASE: @@ -1121,7 +1144,7 @@ eOLDrawState tree_element_type_active_state_get(const bContext *C, case TSE_R_LAYER: return tree_element_viewlayer_state_get(C, te); case TSE_POSEGRP: - return tree_element_posegroup_state_get(tvc->view_layer, te, tselem); + return tree_element_posegroup_state_get(tvc->scene, tvc->view_layer, te, tselem); case TSE_SEQUENCE: return tree_element_sequence_state_get(tvc->scene, te); case TSE_SEQUENCE_DUP: @@ -1402,6 +1425,7 @@ static void do_outliner_item_activate_tree_element(bContext *C, } else if ((te->idcode == ID_GR) && (space_outliner->outlinevis != SO_VIEW_LAYER)) { Collection *gr = (Collection *)tselem->id; + BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer); if (extend) { eObjectSelect_Mode sel = BA_SELECT; @@ -1575,7 +1599,9 @@ static bool outliner_is_co_within_active_mode_column(bContext *C, SpaceOutliner *space_outliner, const float view_mval[2]) { + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_view_layer_synced_ensure(scene, view_layer); Object *obact = BKE_view_layer_active_object_get(view_layer); return outliner_is_co_within_mode_column(space_outliner, view_mval) && obact && diff --git a/source/blender/editors/space_outliner/outliner_sync.cc b/source/blender/editors/space_outliner/outliner_sync.cc index 8f1c15873b4..995c83b589d 100644 --- a/source/blender/editors/space_outliner/outliner_sync.cc +++ b/source/blender/editors/space_outliner/outliner_sync.cc @@ -225,7 +225,8 @@ static void outliner_select_sync_to_object(ViewLayer *view_layer, } } -static void outliner_select_sync_to_edit_bone(ViewLayer *view_layer, +static void outliner_select_sync_to_edit_bone(const Scene *scene, + ViewLayer *view_layer, TreeElement *te, TreeStoreElem *tselem, GSet *selected_ebones) @@ -250,6 +251,7 @@ static void outliner_select_sync_to_edit_bone(ViewLayer *view_layer, /* Tag if selection changed */ if (bone_flag != ebone->flag) { + BKE_view_layer_synced_ensure(scene, view_layer); Object *obedit = BKE_view_layer_edit_object_get(view_layer); DEG_id_tag_update(&arm->id, ID_RECALC_SELECT); WM_main_add_notifier(NC_OBJECT | ND_BONE_SELECT, obedit); @@ -318,7 +320,8 @@ static void outliner_sync_selection_from_outliner(Scene *scene, } else if (tselem->type == TSE_EBONE) { if (sync_types->edit_bone) { - outliner_select_sync_to_edit_bone(view_layer, te, tselem, selected_items->edit_bones); + outliner_select_sync_to_edit_bone( + scene, view_layer, te, tselem, selected_items->edit_bones); } } else if (tselem->type == TSE_POSE_CHANNEL) { @@ -388,12 +391,14 @@ void ED_outliner_select_sync_from_outliner(bContext *C, SpaceOutliner *space_out namespace blender::ed::outliner { -static void outliner_select_sync_from_object(ViewLayer *view_layer, +static void outliner_select_sync_from_object(const Scene *scene, + ViewLayer *view_layer, Object *obact, TreeElement *te, TreeStoreElem *tselem) { Object *ob = (Object *)tselem->id; + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(view_layer, ob); const bool is_selected = (base != nullptr) && ((base->flag & BASE_SELECTED) != 0); @@ -487,7 +492,8 @@ struct SyncSelectActiveData { }; /** Sync select and active flags from active view layer, bones, and sequences to the outliner. */ -static void outliner_sync_selection_to_outliner(ViewLayer *view_layer, +static void outliner_sync_selection_to_outliner(const Scene *scene, + ViewLayer *view_layer, SpaceOutliner *space_outliner, ListBase *tree, SyncSelectActiveData *active_data, @@ -498,7 +504,7 @@ static void outliner_sync_selection_to_outliner(ViewLayer *view_layer, if ((tselem->type == TSE_SOME_ID) && te->idcode == ID_OB) { if (sync_types->object) { - outliner_select_sync_from_object(view_layer, active_data->object, te, tselem); + outliner_select_sync_from_object(scene, view_layer, active_data->object, te, tselem); } } else if (tselem->type == TSE_EBONE) { @@ -522,7 +528,7 @@ static void outliner_sync_selection_to_outliner(ViewLayer *view_layer, /* Sync subtree elements */ outliner_sync_selection_to_outliner( - view_layer, space_outliner, &te->subtree, active_data, sync_types); + scene, view_layer, space_outliner, &te->subtree, active_data, sync_types); } } @@ -531,6 +537,7 @@ static void get_sync_select_active_data(const bContext *C, SyncSelectActiveData { Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_view_layer_synced_ensure(scene, view_layer); active_data->object = BKE_view_layer_active_object_get(view_layer); active_data->edit_bone = CTX_data_active_bone(C); active_data->pose_channel = CTX_data_active_pose_bone(C); @@ -545,6 +552,7 @@ void outliner_sync_selection(const bContext *C, SpaceOutliner *space_outliner) C, space_outliner, &sync_types); if (sync_required) { + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); /* Store active object, bones, and sequence */ @@ -552,7 +560,7 @@ void outliner_sync_selection(const bContext *C, SpaceOutliner *space_outliner) get_sync_select_active_data(C, &active_data); outliner_sync_selection_to_outliner( - view_layer, space_outliner, &space_outliner->tree, &active_data, &sync_types); + scene, view_layer, space_outliner, &space_outliner->tree, &active_data, &sync_types); /* Keep any un-synced data in the dirty flag. */ if (sync_types.object) { diff --git a/source/blender/editors/space_outliner/outliner_tools.cc b/source/blender/editors/space_outliner/outliner_tools.cc index bab5b945d43..1628945c4cd 100644 --- a/source/blender/editors/space_outliner/outliner_tools.cc +++ b/source/blender/editors/space_outliner/outliner_tools.cc @@ -782,8 +782,10 @@ static void object_select_fn(bContext *C, TreeStoreElem *tselem, void *UNUSED(user_data)) { + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Object *ob = (Object *)tselem->id; + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { @@ -820,8 +822,10 @@ static void object_deselect_fn(bContext *C, TreeStoreElem *tselem, void *UNUSED(user_data)) { + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Object *ob = (Object *)tselem->id; + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { @@ -1317,6 +1321,7 @@ static void id_override_library_clear_single_fn(bContext *C, * override. */ if (BKE_lib_override_library_is_hierarchy_leaf(bmain, id)) { bool do_remap_active = false; + BKE_view_layer_synced_ensure(CTX_data_scene(C), view_layer); if (BKE_view_layer_active_object_get(view_layer) == reinterpret_cast<Object *>(id)) { BLI_assert(GS(id->name) == ID_OB); do_remap_active = true; @@ -2108,9 +2113,10 @@ static Base *outliner_batch_delete_hierarchy( if (!base) { return nullptr; } - + BKE_view_layer_synced_ensure(scene, view_layer); object = base->object; - for (child_base = static_cast<Base *>(view_layer->object_bases.first); child_base; + for (child_base = static_cast<Base *>(BKE_view_layer_object_bases_get(view_layer)->first); + child_base; child_base = base_next) { base_next = child_base->next; for (parent = child_base->object->parent; parent && (parent != object); @@ -2160,6 +2166,7 @@ static void object_batch_delete_hierarchy_fn(bContext *C, ViewLayer *view_layer = CTX_data_view_layer(C); Object *obedit = CTX_data_edit_object(C); + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { @@ -2384,7 +2391,8 @@ static int outliner_delete_exec(bContext *C, wmOperator *op) SpaceOutliner *space_outliner = CTX_wm_space_outliner(C); struct wmMsgBus *mbus = CTX_wm_message_bus(C); ViewLayer *view_layer = CTX_data_view_layer(C); - const Base *basact_prev = view_layer->basact; + BKE_view_layer_synced_ensure(scene, view_layer); + const Base *basact_prev = BKE_view_layer_active_base_get(view_layer); const bool delete_hierarchy = RNA_boolean_get(op->ptr, "hierarchy"); @@ -2428,7 +2436,8 @@ static int outliner_delete_exec(bContext *C, wmOperator *op) DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE); DEG_relations_tag_update(bmain); - if (basact_prev != view_layer->basact) { + BKE_view_layer_synced_ensure(scene, view_layer); + if (basact_prev != BKE_view_layer_active_base_get(view_layer)) { WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene); WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active); } diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc index a8f469c135a..8a2ff8c2ece 100644 --- a/source/blender/editors/space_outliner/outliner_tree.cc +++ b/source/blender/editors/space_outliner/outliner_tree.cc @@ -1395,7 +1395,8 @@ static int outliner_exclude_filter_get(const SpaceOutliner *space_outliner) return exclude_filter; } -static bool outliner_element_visible_get(ViewLayer *view_layer, +static bool outliner_element_visible_get(const Scene *scene, + ViewLayer *view_layer, TreeElement *te, const int exclude_filter) { @@ -1450,6 +1451,7 @@ static bool outliner_element_visible_get(ViewLayer *view_layer, if (exclude_filter & SO_FILTER_OB_STATE) { if (base == nullptr) { + BKE_view_layer_synced_ensure(scene, view_layer); base = BKE_view_layer_base_find(view_layer, ob); if (base == nullptr) { @@ -1475,7 +1477,8 @@ static bool outliner_element_visible_get(ViewLayer *view_layer, } else { BLI_assert(exclude_filter & SO_FILTER_OB_STATE_ACTIVE); - if (base != view_layer->basact) { + BKE_view_layer_synced_ensure(scene, view_layer); + if (base != BKE_view_layer_active_base_get(view_layer)) { is_visible = false; } } @@ -1557,6 +1560,7 @@ static TreeElement *outliner_extract_children_from_subtree(TreeElement *element, } static int outliner_filter_subtree(SpaceOutliner *space_outliner, + const Scene *scene, ViewLayer *view_layer, ListBase *lb, const char *search_string, @@ -1567,18 +1571,18 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner, for (te = static_cast<TreeElement *>(lb->first); te; te = te_next) { te_next = te->next; - if ((outliner_element_visible_get(view_layer, te, exclude_filter) == false)) { + if ((outliner_element_visible_get(scene, view_layer, te, exclude_filter) == false)) { /* Don't free the tree, but extract the children from the parent and add to this tree. */ /* This also needs filtering the subtree prior (see T69246). */ outliner_filter_subtree( - space_outliner, view_layer, &te->subtree, search_string, exclude_filter); + space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter); te_next = outliner_extract_children_from_subtree(te, lb); continue; } if ((exclude_filter & SO_FILTER_SEARCH) == 0) { /* Filter subtree too. */ outliner_filter_subtree( - space_outliner, view_layer, &te->subtree, search_string, exclude_filter); + space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter); continue; } @@ -1596,7 +1600,8 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner, if ((!TSELEM_OPEN(tselem, space_outliner)) || outliner_filter_subtree( - space_outliner, view_layer, &te->subtree, search_string, exclude_filter) == 0) { + space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter) == + 0) { outliner_free_tree_element(te, lb); } } @@ -1608,7 +1613,7 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner, /* filter subtree too */ outliner_filter_subtree( - space_outliner, view_layer, &te->subtree, search_string, exclude_filter); + space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter); } } @@ -1616,7 +1621,9 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner, return (BLI_listbase_is_empty(lb) == false); } -static void outliner_filter_tree(SpaceOutliner *space_outliner, ViewLayer *view_layer) +static void outliner_filter_tree(SpaceOutliner *space_outliner, + const Scene *scene, + ViewLayer *view_layer) { char search_buff[sizeof(((struct SpaceOutliner *)nullptr)->search_string) + 2]; char *search_string; @@ -1637,7 +1644,7 @@ static void outliner_filter_tree(SpaceOutliner *space_outliner, ViewLayer *view_ } outliner_filter_subtree( - space_outliner, view_layer, &space_outliner->tree, search_string, exclude_filter); + space_outliner, scene, view_layer, &space_outliner->tree, search_string, exclude_filter); } static void outliner_clear_newid_from_main(Main *bmain) @@ -1714,7 +1721,7 @@ void outliner_build_tree(Main *mainvar, outliner_collections_children_sort(&space_outliner->tree); } - outliner_filter_tree(space_outliner, view_layer); + outliner_filter_tree(space_outliner, scene, view_layer); outliner_restore_scrolling_position(space_outliner, region, &focus); /* `ID.newid` pointer is abused when building tree, DO NOT call #BKE_main_id_newptr_and_tag_clear diff --git a/source/blender/editors/space_outliner/outliner_utils.cc b/source/blender/editors/space_outliner/outliner_utils.cc index ff5292e2883..2deedccc29e 100644 --- a/source/blender/editors/space_outliner/outliner_utils.cc +++ b/source/blender/editors/space_outliner/outliner_utils.cc @@ -45,6 +45,7 @@ void outliner_viewcontext_init(const bContext *C, TreeViewContext *tvc) tvc->view_layer = CTX_data_view_layer(C); /* Objects. */ + BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer); tvc->obact = BKE_view_layer_active_object_get(tvc->view_layer); if (tvc->obact != nullptr) { tvc->ob_edit = OBEDIT_FROM_OBACT(tvc->obact); @@ -452,6 +453,7 @@ using namespace blender::ed::outliner; Base *ED_outliner_give_base_under_cursor(bContext *C, const int mval[2]) { ARegion *region = CTX_wm_region(C); + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); SpaceOutliner *space_outliner = CTX_wm_space_outliner(C); TreeElement *te; @@ -465,6 +467,7 @@ Base *ED_outliner_give_base_under_cursor(bContext *C, const int mval[2]) TreeStoreElem *tselem = TREESTORE(te); if ((tselem->type == TSE_SOME_ID) && (te->idcode == ID_OB)) { Object *ob = (Object *)tselem->id; + BKE_view_layer_synced_ensure(scene, view_layer); base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(view_layer, ob); } } diff --git a/source/blender/editors/space_outliner/tree/tree_display.hh b/source/blender/editors/space_outliner/tree/tree_display.hh index 295eeb59eaa..13b46651562 100644 --- a/source/blender/editors/space_outliner/tree/tree_display.hh +++ b/source/blender/editors/space_outliner/tree/tree_display.hh @@ -105,6 +105,7 @@ class AbstractTreeDisplay { * \brief Tree-Display for the View Layer display mode. */ class TreeDisplayViewLayer final : public AbstractTreeDisplay { + Scene *scene_ = nullptr; ViewLayer *view_layer_ = nullptr; bool show_objects_ = true; diff --git a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc index c8869d90eca..66c1fa34914 100644 --- a/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc +++ b/source/blender/editors/space_outliner/tree/tree_display_view_layer.cc @@ -64,6 +64,7 @@ ListBase TreeDisplayViewLayer::buildTree(const TreeSourceData &source_data) { ListBase tree = {nullptr}; Scene *scene = source_data.scene; + scene_ = scene; show_objects_ = !(space_outliner_.filter & SO_FILTER_NO_OBJECT); for (auto *view_layer : ListBaseWrapper<ViewLayer>(scene->view_layers)) { @@ -96,7 +97,8 @@ void TreeDisplayViewLayer::add_view_layer(Scene &scene, ListBase &tree, TreeElem if (space_outliner_.filter & SO_FILTER_NO_COLLECTION) { /* Show objects in the view layer. */ - for (Base *base : List<Base>(view_layer_->object_bases)) { + BKE_view_layer_synced_ensure(&scene, view_layer_); + for (Base *base : List<Base>(*BKE_view_layer_object_bases_get(view_layer_))) { TreeElement *te_object = outliner_add_element( &space_outliner_, &tree, base->object, parent, TSE_SOME_ID, 0); te_object->directdata = base; @@ -166,6 +168,7 @@ void TreeDisplayViewLayer::add_layer_collection_objects(ListBase &tree, LayerCollection &lc, TreeElement &ten) { + BKE_view_layer_synced_ensure(scene_, view_layer_); for (CollectionObject *cob : List<CollectionObject>(lc.collection->gobject)) { Base *base = BKE_view_layer_base_find(view_layer_, cob->ob); TreeElement *te_object = outliner_add_element( |