diff options
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/object_add.cc | 26 | ||||
-rw-r--r-- | source/blender/editors/object/object_bake_api.c | 11 | ||||
-rw-r--r-- | source/blender/editors/object/object_collection.c | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_constraint.c | 4 | ||||
-rw-r--r-- | source/blender/editors/object/object_edit.c | 21 | ||||
-rw-r--r-- | source/blender/editors/object/object_hook.c | 13 | ||||
-rw-r--r-- | source/blender/editors/object/object_modes.c | 6 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.cc | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_relations.c | 9 | ||||
-rw-r--r-- | source/blender/editors/object/object_select.c | 31 | ||||
-rw-r--r-- | source/blender/editors/object/object_utils.c | 10 |
11 files changed, 94 insertions, 39 deletions
diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index ee2bb551c40..8b0146709fc 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -609,6 +609,7 @@ Object *ED_object_add_type_with_obdata(bContext *C, ViewLayer *view_layer = CTX_data_view_layer(C); { + BKE_view_layer_synced_ensure(scene, view_layer); Object *obedit = BKE_view_layer_edit_object_get(view_layer); if (obedit != nullptr) { ED_object_editmode_exit_ex(bmain, scene, obedit, EM_FREEDATA); @@ -629,7 +630,8 @@ Object *ED_object_add_type_with_obdata(bContext *C, ob = BKE_object_add(bmain, scene, view_layer, type, name); } - Base *ob_base_act = view_layer->basact; + BKE_view_layer_synced_ensure(scene, view_layer); + Base *ob_base_act = BKE_view_layer_active_base_get(view_layer); /* While not getting a valid base is not a good thing, it can happen in convoluted corner cases, * better not crash on it in releases. */ BLI_assert(ob_base_act != nullptr); @@ -990,6 +992,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) } bool newob = false; + BKE_view_layer_synced_ensure(scene, view_layer); Object *obedit = BKE_view_layer_edit_object_get(view_layer); if (obedit == nullptr || obedit->type != OB_MBALL) { obedit = ED_object_add_type(C, OB_MBALL, nullptr, loc, rot, true, local_view_bits); @@ -1099,6 +1102,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_view_layer_synced_ensure(scene, view_layer); Object *obedit = BKE_view_layer_edit_object_get(view_layer); RegionView3D *rv3d = CTX_wm_region_view3d(C); @@ -2534,6 +2538,7 @@ static void make_object_duplilist_real(bContext *C, } BKE_collection_object_add_from(bmain, scene, base->object, ob_dst); + BKE_view_layer_synced_ensure(scene, view_layer); Base *base_dst = BKE_view_layer_base_find(view_layer, ob_dst); BLI_assert(base_dst != nullptr); @@ -2831,6 +2836,7 @@ static Base *duplibase_for_convert( DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION); BKE_collection_object_add_from(bmain, scene, ob, obn); + BKE_view_layer_synced_ensure(scene, view_layer); Base *basen = BKE_view_layer_base_find(view_layer, obn); ED_object_base_select(basen, BA_SELECT); ED_object_base_select(base, BA_DESELECT); @@ -3443,9 +3449,13 @@ static int object_convert_exec(bContext *C, wmOperator *op) ED_object_base_activate(C, basact); view_layer->basact = basact; } - else if (view_layer->basact->object->flag & OB_DONE) { - WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, view_layer->basact->object); - WM_event_add_notifier(C, NC_OBJECT | ND_DATA, view_layer->basact->object); + else { + BKE_view_layer_synced_ensure(scene, view_layer); + Object *object = BKE_view_layer_active_object_get(view_layer); + if (object->flag & OB_DONE) { + WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, object); + WM_event_add_notifier(C, NC_OBJECT | ND_DATA, object); + } } DEG_relations_tag_update(bmain); @@ -3572,6 +3582,7 @@ static Base *object_add_duplicate_internal(Main *bmain, } DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); + BKE_view_layer_synced_ensure(scene, view_layer); base = BKE_view_layer_base_find(view_layer, ob); if ((base != nullptr) && (base->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT)) { BKE_collection_object_add_from(bmain, scene, ob, obn); @@ -3581,6 +3592,7 @@ static Base *object_add_duplicate_internal(Main *bmain, BKE_collection_object_add(bmain, layer_collection->collection, obn); } + BKE_view_layer_synced_ensure(scene, view_layer); basen = BKE_view_layer_base_find(view_layer, obn); if (base != nullptr && basen != nullptr) { basen->local_view_bits = base->local_view_bits; @@ -3682,7 +3694,8 @@ static int duplicate_exec(bContext *C, wmOperator *op) ED_object_base_select(base, BA_DESELECT); /* new object will become active */ - if (view_layer->basact == base) { + BKE_view_layer_synced_ensure(scene, view_layer); + if (BKE_view_layer_active_base_get(view_layer) == base) { ob_new_active = ob_new; } } @@ -3700,6 +3713,7 @@ static int duplicate_exec(bContext *C, wmOperator *op) for (const auto &item : source_bases_new_objects) { Object *ob_new = item.second; Base *base_source = item.first; + BKE_view_layer_synced_ensure(scene, view_layer); Base *base_new = BKE_view_layer_base_find(view_layer, ob_new); if (base_new == nullptr) { continue; @@ -3888,12 +3902,14 @@ void OBJECT_OT_add_named(wmOperatorType *ot) static int object_transform_to_mouse_exec(bContext *C, wmOperator *op) { Main *bmain = CTX_data_main(C); + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); Object *ob = reinterpret_cast<Object *>( WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op->ptr, ID_OB)); if (!ob) { + BKE_view_layer_synced_ensure(scene, view_layer); ob = BKE_view_layer_active_object_get(view_layer); } diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index f7b66241081..bdaa3523402 100644 --- a/source/blender/editors/object/object_bake_api.c +++ b/source/blender/editors/object/object_bake_api.c @@ -419,11 +419,13 @@ static bool is_noncolor_pass(eScenePassType pass_type) } /* if all is good tag image and return true */ -static bool bake_object_check(ViewLayer *view_layer, +static bool bake_object_check(const Scene *scene, + ViewLayer *view_layer, Object *ob, const eBakeTarget target, ReportList *reports) { + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base == NULL) { @@ -591,6 +593,7 @@ static bool bake_pass_filter_check(eScenePassType pass_type, /* before even getting in the bake function we check for some basic errors */ static bool bake_objects_check(Main *bmain, + const Scene *scene, ViewLayer *view_layer, Object *ob, ListBase *selected_objects, @@ -606,7 +609,7 @@ static bool bake_objects_check(Main *bmain, if (is_selected_to_active) { int tot_objects = 0; - if (!bake_object_check(view_layer, ob, target, reports)) { + if (!bake_object_check(scene, view_layer, ob, target, reports)) { return false; } @@ -640,7 +643,7 @@ static bool bake_objects_check(Main *bmain, } for (link = selected_objects->first; link; link = link->next) { - if (!bake_object_check(view_layer, link->ptr.data, target, reports)) { + if (!bake_object_check(scene, view_layer, link->ptr.data, target, reports)) { return false; } } @@ -1812,6 +1815,7 @@ static int bake_exec(bContext *C, wmOperator *op) } if (!bake_objects_check(bkr.main, + bkr.scene, bkr.view_layer, bkr.ob, &bkr.selected_objects, @@ -1865,6 +1869,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), short *do_update, floa } if (!bake_objects_check(bkr->main, + bkr->scene, bkr->view_layer, bkr->ob, &bkr->selected_objects, diff --git a/source/blender/editors/object/object_collection.c b/source/blender/editors/object/object_collection.c index 426f33e53ca..53e1a75cba0 100644 --- a/source/blender/editors/object/object_collection.c +++ b/source/blender/editors/object/object_collection.c @@ -203,6 +203,7 @@ static int objects_remove_active_exec(bContext *C, wmOperator *op) Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_view_layer_synced_ensure(scene, view_layer); Object *ob = BKE_view_layer_active_object_get(view_layer); int single_collection_index = RNA_enum_get(op->ptr, "collection"); Collection *single_collection = collection_object_active_find_index( diff --git a/source/blender/editors/object/object_constraint.c b/source/blender/editors/object/object_constraint.c index 6aefabe780d..98fd2726204 100644 --- a/source/blender/editors/object/object_constraint.c +++ b/source/blender/editors/object/object_constraint.c @@ -31,6 +31,7 @@ #include "BKE_constraint.h" #include "BKE_context.h" #include "BKE_fcurve.h" +#include "BKE_layer.h" #include "BKE_main.h" #include "BKE_object.h" #include "BKE_report.h" @@ -2315,7 +2316,8 @@ static bool get_new_constraint_target( Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); - Base *base = view_layer->basact; + BKE_view_layer_synced_ensure(scene, view_layer); + Base *base = BKE_view_layer_active_base_get(view_layer); Object *obt; /* add new target object */ diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 0e369941be8..c3482b13db6 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -142,6 +142,7 @@ Object **ED_object_array_in_mode_or_selected(bContext *C, ScrArea *area = CTX_wm_area(C); const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_view_layer_synced_ensure(scene, view_layer); Object *ob_active = BKE_view_layer_active_object_get(view_layer); ID *id_pin = NULL; const bool use_objects_in_mode = (ob_active != NULL) && @@ -235,7 +236,8 @@ static int object_hide_view_clear_exec(bContext *C, wmOperator *op) const bool select = RNA_boolean_get(op->ptr, "select"); bool changed = false; - 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)) { if (base->flag & BASE_HIDDEN) { base->flag &= ~BASE_HIDDEN; changed = true; @@ -253,7 +255,7 @@ static int object_hide_view_clear_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - 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_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); WM_event_add_notifier(C, NC_SCENE | ND_OB_VISIBLE, scene); @@ -287,7 +289,8 @@ static int object_hide_view_set_exec(bContext *C, wmOperator *op) bool changed = false; /* Hide selected or unselected 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)) { if (!(base->flag & BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT)) { continue; } @@ -311,7 +314,7 @@ static int object_hide_view_set_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - 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_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene); WM_event_add_notifier(C, NC_SCENE | ND_OB_VISIBLE, scene); @@ -703,6 +706,7 @@ bool ED_object_editmode_free_ex(Main *bmain, Object *obedit) bool ED_object_editmode_exit_multi_ex(Main *bmain, Scene *scene, ViewLayer *view_layer, int flag) { + BKE_view_layer_synced_ensure(scene, view_layer); Object *obedit = BKE_view_layer_edit_object_get(view_layer); if (obedit == NULL) { return false; @@ -710,7 +714,8 @@ bool ED_object_editmode_exit_multi_ex(Main *bmain, Scene *scene, ViewLayer *view bool changed = false; const short obedit_type = obedit->type; - 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 ((ob->type == obedit_type) && (ob->mode & OB_MODE_EDIT)) { changed |= ED_object_editmode_exit_ex(bmain, scene, base->object, flag); @@ -843,6 +848,7 @@ static int editmode_toggle_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(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); const int mode_flag = OB_MODE_EDIT; const bool is_mode_set = (obact->mode & mode_flag) != 0; @@ -955,6 +961,7 @@ static int posemode_exec(bContext *C, wmOperator *op) } { + BKE_view_layer_synced_ensure(scene, view_layer); Object *obedit = BKE_view_layer_edit_object_get(view_layer); if (obact == obedit) { ED_object_editmode_exit_ex(bmain, scene, obedit, EM_FREEDATA); @@ -1479,7 +1486,9 @@ static int shade_smooth_exec(bContext *C, wmOperator *op) /* For modes that only use an active object, don't handle the whole selection. */ { + 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); if (obact && ((obact->mode & OB_MODE_ALL_PAINT))) { ctx_ob_single_active.ptr.data = obact; @@ -1552,7 +1561,9 @@ static int shade_smooth_exec(bContext *C, wmOperator *op) static bool shade_poll(bContext *C) { + 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); if (obact != NULL) { /* Doesn't handle edit-data, sculpt dynamic-topology, or their undo systems. */ diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c index 077891f92ed..27659042f50 100644 --- a/source/blender/editors/object/object_hook.c +++ b/source/blender/editors/object/object_hook.c @@ -485,22 +485,21 @@ static bool hook_op_edit_poll(bContext *C) } static Object *add_hook_object_new( - Main *bmain, const Scene *scene, ViewLayer *view_layer, View3D *v3d, Object *obedit) + Main *bmain, Scene *scene, ViewLayer *view_layer, View3D *v3d, Object *obedit) { Base *basedit; Object *ob; - ob = BKE_object_add(bmain, scene, view_layer, OB_EMPTY, NULL); - - basedit = BKE_view_layer_base_find(view_layer, obedit); - BLI_assert(view_layer->basact->object == ob); - + BKE_view_layer_synced_ensure(scene, view_layer); + Base *basact = BKE_view_layer_active_base_get(view_layer); + BLI_assert(basact->object == ob); if (v3d && v3d->localvd) { - view_layer->basact->local_view_bits |= v3d->local_view_uuid; + basact->local_view_bits |= v3d->local_view_uuid; } /* icky, BKE_object_add sets new base as active. * so set it back to the original edit object */ + basedit = BKE_view_layer_base_find(view_layer, obedit); view_layer->basact = basedit; return ob; diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c index fd28a377333..6525f2d6027 100644 --- a/source/blender/editors/object/object_modes.c +++ b/source/blender/editors/object/object_modes.c @@ -190,7 +190,10 @@ bool ED_object_mode_compat_set(bContext *C, Object *ob, eObjectMode mode, Report bool ED_object_mode_set_ex(bContext *C, eObjectMode mode, bool use_undo, ReportList *reports) { wmWindowManager *wm = CTX_wm_manager(C); + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + + BKE_view_layer_synced_ensure(scene, view_layer); Object *ob = BKE_view_layer_active_object_get(view_layer); if (ob == NULL) { return (mode == OB_MODE_OBJECT); @@ -327,9 +330,11 @@ static void ed_object_posemode_set_for_weight_paint_ex(bContext *C, const bool is_mode_set) { View3D *v3d = CTX_wm_view3d(C); + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); if (ob_arm != NULL) { + BKE_view_layer_synced_ensure(scene, view_layer); const Base *base_arm = BKE_view_layer_base_find(view_layer, ob_arm); if (base_arm && BASE_VISIBLE(v3d, base_arm)) { if (is_mode_set) { @@ -464,6 +469,7 @@ static bool object_transfer_mode_to_base(bContext *C, wmOperator *op, Base *base if (ED_object_mode_set_ex(C, OB_MODE_OBJECT, true, op->reports)) { Object *ob_dst_orig = DEG_get_original_object(ob_dst); + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob_dst_orig); BKE_view_layer_base_deselect_all(scene, view_layer); BKE_view_layer_base_select_and_set_active(view_layer, base); diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc index b5820ac55da..38ebae6ba83 100644 --- a/source/blender/editors/object/object_modifier.cc +++ b/source/blender/editors/object/object_modifier.cc @@ -1233,6 +1233,7 @@ static int modifier_remove_exec(bContext *C, wmOperator *op) /* if cloth/softbody was removed, particle mode could be cleared */ if (mode_orig & OB_MODE_PARTICLE_EDIT) { if ((ob->mode & OB_MODE_PARTICLE_EDIT) == 0) { + BKE_view_layer_synced_ensure(scene, view_layer); if (ob == BKE_view_layer_active_object_get(view_layer)) { WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, nullptr); } diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index 81aadfa6d41..4a523997473 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -262,8 +262,8 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) } else { Object workob; - - ob->parent = view_layer->basact->object; + BKE_view_layer_synced_ensure(scene, view_layer); + ob->parent = BKE_view_layer_active_object_get(view_layer); if (par3 != INDEX_UNSET) { ob->partype = PARVERT3; ob->par1 = par1; @@ -2073,6 +2073,7 @@ static void tag_localizable_objects(bContext *C, const int mode) * otherwise they're lost on reload, see T40595. */ static bool make_local_all__instance_indirect_unused(Main *bmain, + const Scene *scene, ViewLayer *view_layer, Collection *collection) { @@ -2086,6 +2087,7 @@ static bool make_local_all__instance_indirect_unused(Main *bmain, id_us_plus(&ob->id); BKE_collection_object_add(bmain, collection, ob); + BKE_view_layer_synced_ensure(scene, view_layer); base = BKE_view_layer_base_find(view_layer, ob); ED_object_base_select(base, BA_SELECT); DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION); @@ -2162,7 +2164,7 @@ static int make_local_exec(bContext *C, wmOperator *op) /* De-select so the user can differentiate newly instanced from existing objects. */ BKE_view_layer_base_deselect_all(scene, view_layer); - if (make_local_all__instance_indirect_unused(bmain, view_layer, collection)) { + if (make_local_all__instance_indirect_unused(bmain, scene, view_layer, collection)) { BKE_report(op->reports, RPT_INFO, "Orphan library objects added to the current scene to avoid loss"); @@ -2623,6 +2625,7 @@ static int clear_override_library_exec(bContext *C, wmOperator *UNUSED(op)) Object *ob_iter = todo_object_iter->link; if (BKE_lib_override_library_is_hierarchy_leaf(bmain, &ob_iter->id)) { bool do_remap_active = false; + BKE_view_layer_synced_ensure(scene, view_layer); if (BKE_view_layer_active_object_get(view_layer) == ob_iter) { do_remap_active = true; } diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 8a7e6d9447d..43867877fdb 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -117,26 +117,24 @@ void ED_object_base_activate(bContext *C, Base *base) void ED_object_base_activate_with_mode_exit_if_needed(bContext *C, Base *base) { + Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); /* Currently we only need to be concerned with edit-mode. */ + BKE_view_layer_synced_ensure(scene, view_layer); Object *obedit = BKE_view_layer_edit_object_get(view_layer); if (obedit) { Object *ob = base->object; if (((ob->mode & OB_MODE_EDIT) == 0) || (obedit->type != ob->type)) { Main *bmain = CTX_data_main(C); - Scene *scene = CTX_data_scene(C); ED_object_editmode_exit_multi_ex(bmain, scene, view_layer, EM_FREEDATA); } } ED_object_base_activate(C, base); } -bool ED_object_base_deselect_all_ex(const Scene *UNUSED(scene), - ViewLayer *view_layer, - View3D *v3d, - int action, - bool *r_any_visible) +bool ED_object_base_deselect_all_ex( + const Scene *scene, ViewLayer *view_layer, View3D *v3d, int action, bool *r_any_visible) { if (action == SEL_TOGGLE) { action = SEL_SELECT; @@ -216,12 +214,13 @@ static int get_base_select_priority(Base *base) return 1; } -Base *ED_object_find_first_by_data_id(const Scene *UNUSED(scene), ViewLayer *view_layer, ID *id) +Base *ED_object_find_first_by_data_id(const Scene *scene, ViewLayer *view_layer, ID *id) { BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name))); /* Try active object. */ - Base *basact = view_layer->basact; + BKE_view_layer_synced_ensure(scene, view_layer); + Base *basact = BKE_view_layer_active_base_get(view_layer); if (basact && basact->object && basact->object->data == id) { return basact; @@ -231,7 +230,7 @@ Base *ED_object_find_first_by_data_id(const Scene *UNUSED(scene), ViewLayer *vie Base *base_best = NULL; int priority_best = 0; - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) { if (base->object && base->object->data == id) { if (base->flag & BASE_SELECTED) { return base; @@ -254,6 +253,7 @@ bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_ const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); View3D *v3d = CTX_wm_view3d(C); + BKE_view_layer_synced_ensure(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base == NULL) { @@ -262,7 +262,7 @@ bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_ /* TODO: use 'reveal_hidden', as is done with bones. */ - if (view_layer->basact != base || !(base->flag & BASE_SELECTED)) { + if (BKE_view_layer_active_base_get(view_layer) != base || !(base->flag & BASE_SELECTED)) { /* Select if not selected. */ if (!(base->flag & BASE_SELECTED)) { ED_object_base_deselect_all(scene, view_layer, v3d, SEL_DESELECT); @@ -631,6 +631,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op) ED_object_base_deselect_all(scene, view_layer, v3d, SEL_DESELECT); } + BKE_view_layer_synced_ensure(scene, view_layer); ob = BKE_view_layer_active_object_get(view_layer); if (ob == NULL) { BKE_report(op->reports, RPT_ERROR, "No active object"); @@ -785,6 +786,7 @@ static bool select_grouped_children(bContext *C, Object *ob, const bool recursiv /* Makes parent active and de-selected BKE_view_layer_active_object_get. */ static bool select_grouped_parent(bContext *C) { + Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); View3D *v3d = CTX_wm_view3d(C); Base *baspar, *basact = CTX_data_active_base(C); @@ -795,6 +797,7 @@ static bool select_grouped_parent(bContext *C) return 0; } + BKE_view_layer_synced_ensure(scene, view_layer); baspar = BKE_view_layer_base_find(view_layer, basact->object->parent); /* can be NULL if parent in other scene */ @@ -863,6 +866,7 @@ static bool select_grouped_collection(bContext *C, Object *ob) static bool select_grouped_object_hooks(bContext *C, Object *ob) { + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); View3D *v3d = CTX_wm_view3d(C); @@ -875,6 +879,7 @@ static bool select_grouped_object_hooks(bContext *C, Object *ob) if (md->type == eModifierType_Hook) { hmd = (HookModifierData *)md; if (hmd->object) { + BKE_view_layer_synced_ensure(scene, view_layer); base = BKE_view_layer_base_find(view_layer, hmd->object); if (base && ((base->flag & BASE_SELECTED) == 0) && (BASE_SELECTABLE(v3d, base))) { ED_object_base_select(base, BA_SELECT); @@ -1028,6 +1033,7 @@ static int object_select_grouped_exec(bContext *C, wmOperator *op) changed = ED_object_base_deselect_all(scene, view_layer, v3d, SEL_DESELECT); } + BKE_view_layer_synced_ensure(scene, view_layer); ob = BKE_view_layer_active_object_get(view_layer); if (ob == NULL) { BKE_report(op->reports, RPT_ERROR, "No active object"); @@ -1245,6 +1251,7 @@ static int object_select_mirror_exec(bContext *C, wmOperator *op) if (!STREQ(name_flip, primbase->object->id.name + 2)) { Object *ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, name_flip); if (ob) { + BKE_view_layer_synced_ensure(scene, view_layer); Base *secbase = BKE_view_layer_base_find(view_layer, ob); if (secbase) { @@ -1296,9 +1303,11 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot) static bool object_select_more_less(bContext *C, const bool select) { + Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); - 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; ob->flag &= ~OB_DONE; ob->id.tag &= ~LIB_TAG_DOIT; diff --git a/source/blender/editors/object/object_utils.c b/source/blender/editors/object/object_utils.c index b50d44194c7..50ba5b8af5f 100644 --- a/source/blender/editors/object/object_utils.c +++ b/source/blender/editors/object/object_utils.c @@ -22,6 +22,7 @@ #include "BKE_armature.h" #include "BKE_editmesh.h" #include "BKE_lattice.h" +#include "BKE_layer.h" #include "BKE_object.h" #include "BKE_scene.h" @@ -169,7 +170,7 @@ struct XFormObjectSkipChild_Container *ED_object_xform_skip_child_container_crea void ED_object_xform_skip_child_container_item_ensure_from_array( struct XFormObjectSkipChild_Container *xcs, - const Scene *UNUSED(scene), + const Scene *scene, ViewLayer *view_layer, Object **objects, uint objects_len) @@ -179,8 +180,9 @@ void ED_object_xform_skip_child_container_item_ensure_from_array( Object *ob = objects[ob_index]; BLI_gset_add(objects_in_transdata, ob); } - - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + BKE_view_layer_synced_ensure(scene, view_layer); + ListBase *object_bases = BKE_view_layer_object_bases_get(view_layer); + LISTBASE_FOREACH (Base *, base, object_bases) { Object *ob = base->object; if (ob->parent != NULL) { if (!BLI_gset_haskey(objects_in_transdata, ob)) { @@ -210,7 +212,7 @@ void ED_object_xform_skip_child_container_item_ensure_from_array( } } - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { + LISTBASE_FOREACH (Base *, base, object_bases) { Object *ob = base->object; if (BLI_gset_haskey(objects_in_transdata, ob)) { |