diff options
author | Jeroen Bakker <jeroen@blender.org> | 2022-09-08 12:52:02 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2022-09-08 12:52:02 +0300 |
commit | ba64e99bf0440f37cbcee094b48502d00949e492 (patch) | |
tree | cff8765933486d69fb84c31df8421c9655b5e053 /source | |
parent | 5b5e2d47737c2e2203ac82e3f5e7e80bb4703480 (diff) |
Add ensure_sync before BKE_view_layer_base_find.
Diffstat (limited to 'source')
46 files changed, 199 insertions, 61 deletions
diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index 19dbee38f36..dd7866d83e5 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -240,7 +240,8 @@ const char *BKE_collection_ui_name_get(struct Collection *collection); * Select all the objects in this Collection (and its nested collections) for this ViewLayer. * Return true if any object was selected. */ -bool BKE_collection_objects_select(struct ViewLayer *view_layer, +bool BKE_collection_objects_select(const struct Scene *scene, + struct ViewLayer *view_layer, struct Collection *collection, bool deselect); diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index aecdf13e7d8..dcef62c1a78 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -196,10 +196,12 @@ bool BKE_scene_has_object(struct Scene *scene, struct Object *ob); * It also select the objects that are in nested collections. * \note Recursive. */ -bool BKE_layer_collection_objects_select(struct ViewLayer *view_layer, +bool BKE_layer_collection_objects_select(const struct Scene *scene, + struct ViewLayer *view_layer, struct LayerCollection *lc, bool deselect); -bool BKE_layer_collection_has_selected_objects(struct ViewLayer *view_layer, +bool BKE_layer_collection_has_selected_objects(const struct Scene *scene, + struct ViewLayer *view_layer, struct LayerCollection *lc); bool BKE_layer_collection_has_layer_collection(struct LayerCollection *lc_parent, struct LayerCollection *lc_child); @@ -240,7 +242,8 @@ void BKE_layer_collection_isolate_local(const struct Scene *scene, * Don't change the collection children enable/disable state, * but it may change it for the collection itself. */ -void BKE_layer_collection_set_visible(struct ViewLayer *view_layer, +void BKE_layer_collection_set_visible(const struct Scene *scene, + struct ViewLayer *view_layer, struct LayerCollection *lc, bool visible, bool hierarchy); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 048a2fcf48e..60dfc0af25f 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -285,6 +285,7 @@ void BKE_object_matrix_local_get(struct Object *ob, float r_mat[4][4]); bool BKE_object_pose_context_check(const struct Object *ob); struct Object *BKE_object_pose_armature_get(struct Object *ob); struct Object *BKE_object_pose_armature_get_visible(struct Object *ob, + const struct Scene *scene, struct ViewLayer *view_layer, struct View3D *v3d); diff --git a/source/blender/blenkernel/intern/blendfile_link_append.c b/source/blender/blenkernel/intern/blendfile_link_append.c index d9ca1e74391..26fa33d5707 100644 --- a/source/blender/blenkernel/intern/blendfile_link_append.c +++ b/source/blender/blenkernel/intern/blendfile_link_append.c @@ -493,6 +493,7 @@ static void loose_data_instantiate_ensure_active_collection( static void loose_data_instantiate_object_base_instance_init(Main *bmain, Collection *collection, Object *ob, + const Scene *scene, ViewLayer *view_layer, const View3D *v3d, const int flag, @@ -506,7 +507,7 @@ static void loose_data_instantiate_object_base_instance_init(Main *bmain, } BKE_collection_object_add(bmain, collection, ob); - + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (v3d != NULL) { @@ -686,8 +687,14 @@ static void loose_data_instantiate_collection_process( /* TODO: why is it OK to make this active here but not in other situations? * See other callers of #object_base_instance_init */ const bool set_active = set_selected; - loose_data_instantiate_object_base_instance_init( - bmain, active_collection, ob, view_layer, v3d, lapp_context->params->flag, set_active); + loose_data_instantiate_object_base_instance_init(bmain, + active_collection, + ob, + scene, + view_layer, + v3d, + lapp_context->params->flag, + set_active); /* Assign the collection. */ ob->instance_collection = collection; @@ -698,6 +705,7 @@ static void loose_data_instantiate_collection_process( else { /* Add collection as child of active collection. */ BKE_collection_child_add(bmain, active_collection, collection); + BKE_view_layer_ensure_sync(scene, view_layer); if ((lapp_context->params->flag & FILE_AUTOSELECT) != 0) { LISTBASE_FOREACH (CollectionObject *, coll_ob, &collection->gobject) { @@ -717,6 +725,7 @@ static void loose_data_instantiate_object_process(LooseDataInstantiateContext *i { BlendfileLinkAppendContext *lapp_context = instantiate_context->lapp_context; Main *bmain = lapp_context->params->bmain; + const Scene *scene = lapp_context->params->context.scene; ViewLayer *view_layer = lapp_context->params->context.view_layer; const View3D *v3d = lapp_context->params->context.v3d; @@ -762,6 +771,7 @@ static void loose_data_instantiate_object_process(LooseDataInstantiateContext *i loose_data_instantiate_object_base_instance_init(bmain, active_collection, ob, + scene, view_layer, v3d, lapp_context->params->flag, @@ -809,6 +819,7 @@ static void loose_data_instantiate_obdata_process(LooseDataInstantiateContext *i loose_data_instantiate_object_base_instance_init(bmain, active_collection, ob, + scene, view_layer, v3d, lapp_context->params->flag, diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 6efe452e615..7d28533a875 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -852,7 +852,9 @@ void BKE_collection_object_cache_free(Collection *collection) collection_object_cache_free(collection); } -Base *BKE_collection_or_layer_objects(const Scene *scene, ViewLayer *view_layer, Collection *collection) +Base *BKE_collection_or_layer_objects(const Scene *scene, + ViewLayer *view_layer, + Collection *collection) { if (collection) { return BKE_collection_object_cache_get(collection).first; @@ -1742,7 +1744,10 @@ Collection *BKE_collection_from_index(Scene *scene, const int index) return collection_from_index_recursive(master_collection, index, &index_current); } -static bool collection_objects_select(ViewLayer *view_layer, Collection *collection, bool deselect) +static bool collection_objects_select(const Scene *scene, + ViewLayer *view_layer, + Collection *collection, + bool deselect) { bool changed = false; @@ -1750,6 +1755,7 @@ static bool collection_objects_select(ViewLayer *view_layer, Collection *collect return false; } + BKE_view_layer_ensure_sync(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); @@ -1770,7 +1776,7 @@ static bool collection_objects_select(ViewLayer *view_layer, Collection *collect } LISTBASE_FOREACH (CollectionChild *, child, &collection->children) { - if (collection_objects_select(view_layer, collection, deselect)) { + if (collection_objects_select(scene, view_layer, collection, deselect)) { changed = true; } } @@ -1778,16 +1784,19 @@ static bool collection_objects_select(ViewLayer *view_layer, Collection *collect return changed; } -bool BKE_collection_objects_select(ViewLayer *view_layer, Collection *collection, bool deselect) +bool BKE_collection_objects_select(const Scene *scene, + ViewLayer *view_layer, + Collection *collection, + bool deselect) { LayerCollection *layer_collection = BKE_layer_collection_first_from_scene_collection(view_layer, collection); if (layer_collection != NULL) { - return BKE_layer_collection_objects_select(view_layer, layer_collection, deselect); + return BKE_layer_collection_objects_select(scene, view_layer, layer_collection, deselect); } - return collection_objects_select(view_layer, collection, deselect); + return collection_objects_select(scene, view_layer, collection, deselect); } /** \} */ diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 1f1a49ca030..69673d93c20 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -440,6 +440,7 @@ static int ctx_data_base_collection_get(const bContext *C, const char *member, L Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_view_layer_ensure_sync(scene, view_layer); bool ok = false; @@ -1362,8 +1363,9 @@ struct Base *CTX_data_active_base(const bContext *C) if (ob == NULL) { return NULL; } - + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_view_layer_ensure_sync(scene, view_layer); return BKE_view_layer_base_find(view_layer, ob); } diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index bfa7a745268..b5d874a4968 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -1432,7 +1432,10 @@ void BKE_main_collection_sync_remap(const Main *bmain) /** \name Object Selection * \{ */ -bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection *lc, bool deselect) +bool BKE_layer_collection_objects_select(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc, + bool deselect) { if (lc->collection->flag & COLLECTION_HIDE_SELECT) { return false; @@ -1441,6 +1444,7 @@ bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection bool changed = false; if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { + BKE_view_layer_ensure_sync(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); @@ -1462,19 +1466,22 @@ bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection } LISTBASE_FOREACH (LayerCollection *, iter, &lc->layer_collections) { - changed |= BKE_layer_collection_objects_select(view_layer, iter, deselect); + changed |= BKE_layer_collection_objects_select(scene, view_layer, iter, deselect); } return changed; } -bool BKE_layer_collection_has_selected_objects(ViewLayer *view_layer, LayerCollection *lc) +bool BKE_layer_collection_has_selected_objects(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc) { if (lc->collection->flag & COLLECTION_HIDE_SELECT) { return false; } if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) { + BKE_view_layer_ensure_sync(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); @@ -1485,7 +1492,7 @@ bool BKE_layer_collection_has_selected_objects(ViewLayer *view_layer, LayerColle } LISTBASE_FOREACH (LayerCollection *, iter, &lc->layer_collections) { - if (BKE_layer_collection_has_selected_objects(view_layer, iter)) { + if (BKE_layer_collection_has_selected_objects(scene, view_layer, iter)) { return true; } } @@ -1675,7 +1682,8 @@ static void layer_collection_local_visibility_unset_recursive(LayerCollection *l } } -static void layer_collection_local_sync(ViewLayer *view_layer, +static void layer_collection_local_sync(const Scene *scene, + ViewLayer *view_layer, LayerCollection *layer_collection, const unsigned short local_collections_uuid, bool visible) @@ -1690,6 +1698,7 @@ static void layer_collection_local_sync(ViewLayer *view_layer, continue; } + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, cob->ob); base->local_collections_bits |= local_collections_uuid; } @@ -1697,7 +1706,7 @@ static void layer_collection_local_sync(ViewLayer *view_layer, LISTBASE_FOREACH (LayerCollection *, child, &layer_collection->layer_collections) { if ((child->flag & LAYER_COLLECTION_EXCLUDE) == 0) { - layer_collection_local_sync(view_layer, child, local_collections_uuid, visible); + layer_collection_local_sync(scene, view_layer, child, local_collections_uuid, visible); } } } @@ -1717,7 +1726,7 @@ void BKE_layer_collection_local_sync(const Scene *scene, ViewLayer *view_layer, } LISTBASE_FOREACH (LayerCollection *, layer_collection, &view_layer->layer_collections) { - layer_collection_local_sync(view_layer, layer_collection, local_collections_uuid, true); + layer_collection_local_sync(scene, view_layer, layer_collection, local_collections_uuid, true); } } @@ -1788,33 +1797,40 @@ void BKE_layer_collection_isolate_local( BKE_layer_collection_local_sync(scene, view_layer, v3d); } -static void layer_collection_bases_show_recursive(ViewLayer *view_layer, LayerCollection *lc) +static void layer_collection_bases_show_recursive(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc) { if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) { + BKE_view_layer_ensure_sync(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); base->flag &= ~BASE_HIDDEN; } } LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc->layer_collections) { - layer_collection_bases_show_recursive(view_layer, lc_iter); + layer_collection_bases_show_recursive(scene, view_layer, lc_iter); } } -static void layer_collection_bases_hide_recursive(ViewLayer *view_layer, LayerCollection *lc) +static void layer_collection_bases_hide_recursive(const Scene *scene, + ViewLayer *view_layer, + LayerCollection *lc) { if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) { + BKE_view_layer_ensure_sync(scene, view_layer); LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) { Base *base = BKE_view_layer_base_find(view_layer, cob->ob); base->flag |= BASE_HIDDEN; } } LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc->layer_collections) { - layer_collection_bases_hide_recursive(view_layer, lc_iter); + layer_collection_bases_hide_recursive(scene, view_layer, lc_iter); } } -void BKE_layer_collection_set_visible(ViewLayer *view_layer, +void BKE_layer_collection_set_visible(const Scene *scene, + ViewLayer *view_layer, LayerCollection *lc, const bool visible, const bool hierarchy) @@ -1822,11 +1838,11 @@ void BKE_layer_collection_set_visible(ViewLayer *view_layer, if (hierarchy) { if (visible) { layer_collection_flag_unset_recursive(lc, LAYER_COLLECTION_HIDE); - layer_collection_bases_show_recursive(view_layer, lc); + layer_collection_bases_show_recursive(scene, view_layer, lc); } else { layer_collection_flag_set_recursive(lc, LAYER_COLLECTION_HIDE); - layer_collection_bases_hide_recursive(view_layer, lc); + layer_collection_bases_hide_recursive(scene, view_layer, lc); } } else { @@ -1921,6 +1937,7 @@ bool BKE_view_layer_has_collection(const ViewLayer *view_layer, const Collection bool BKE_scene_has_object(Scene *scene, Object *ob) { LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { return true; diff --git a/source/blender/blenkernel/intern/lib_override.cc b/source/blender/blenkernel/intern/lib_override.cc index 1b8dcc79a9f..ecec13cc977 100644 --- a/source/blender/blenkernel/intern/lib_override.cc +++ b/source/blender/blenkernel/intern/lib_override.cc @@ -1273,6 +1273,8 @@ static void lib_override_library_create_post_process(Main *bmain, } } + BKE_view_layer_ensure_sync(scene, view_layer); + /* We need to ensure all new overrides of objects are properly instantiated. */ Collection *default_instantiating_collection = residual_storage; LISTBASE_FOREACH (Object *, ob, &bmain->objects) { diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc index 1b66bce94ee..61f941c0a8b 100644 --- a/source/blender/blenkernel/intern/object.cc +++ b/source/blender/blenkernel/intern/object.cc @@ -2295,6 +2295,7 @@ Object *BKE_object_add_from( Object *ob = object_add_common(bmain, scene, view_layer, type, name); BKE_collection_object_add_from(bmain, scene, ob_src, ob); + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); BKE_view_layer_base_select_and_set_active(view_layer, base); @@ -2323,6 +2324,7 @@ Object *BKE_object_add_for_data(Main *bmain, LayerCollection *layer_collection = BKE_layer_collection_get_active(view_layer); BKE_collection_object_add(bmain, layer_collection->collection, ob); + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); BKE_view_layer_base_select_and_set_active(view_layer, base); @@ -2538,10 +2540,14 @@ Object *BKE_object_pose_armature_get(Object *ob) return nullptr; } -Object *BKE_object_pose_armature_get_visible(Object *ob, ViewLayer *view_layer, View3D *v3d) +Object *BKE_object_pose_armature_get_visible(Object *ob, + const Scene *scene, + ViewLayer *view_layer, + View3D *v3d) { Object *ob_armature = BKE_object_pose_armature_get(ob); if (ob_armature) { + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob_armature); if (base) { if (BASE_VISIBLE(v3d, base)) { diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 86cccf1da69..cb87bdc0b93 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -1664,7 +1664,9 @@ static void rigidbody_update_sim_ob(Depsgraph *depsgraph, Object *ob, RigidBodyO return; } + const Scene *scene = DEG_get_input_scene(depsgraph); ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph); + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); const bool is_selected = base ? (base->flag & BASE_SELECTED) != 0 : false; @@ -2008,7 +2010,9 @@ static void rigidbody_free_substep_data(ListBase *substep_targets) } static void rigidbody_update_simulation_post_step(Depsgraph *depsgraph, RigidBodyWorld *rbw) { + const Scene *scene = DEG_get_input_scene(depsgraph); ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph); + BKE_view_layer_ensure_sync(scene, view_layer); FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (rbw->group, ob) { Base *base = BKE_view_layer_base_find(view_layer, ob); diff --git a/source/blender/editors/animation/anim_markers.c b/source/blender/editors/animation/anim_markers.c index b87bc029980..f9ccd1c67c7 100644 --- a/source/blender/editors/animation/anim_markers.c +++ b/source/blender/editors/animation/anim_markers.c @@ -1294,6 +1294,7 @@ static void select_marker_camera_switch( } } + BKE_view_layer_ensure_sync(scene, view_layer); for (marker = markers->first; marker; marker = marker->next) { if (marker->camera) { if (marker->frame == cfra) { diff --git a/source/blender/editors/gpencil/gpencil_convert.c b/source/blender/editors/gpencil/gpencil_convert.c index e02a82f4555..f7cfff00a00 100644 --- a/source/blender/editors/gpencil/gpencil_convert.c +++ b/source/blender/editors/gpencil/gpencil_convert.c @@ -1303,6 +1303,7 @@ static void gpencil_layer_to_curve(bContext *C, ob = BKE_object_add_only_object(bmain, OB_CURVES_LEGACY, gpl->info); cu = ob->data = BKE_curve_add(bmain, gpl->info, OB_CURVES_LEGACY); BKE_collection_object_add(bmain, collection, ob); + BKE_view_layer_ensure_sync(scene, view_layer); base_new = BKE_view_layer_base_find(view_layer, ob); DEG_relations_tag_update(bmain); /* added object */ diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h index 82cc518f029..d7fb108809f 100644 --- a/source/blender/editors/include/ED_transform.h +++ b/source/blender/editors/include/ED_transform.h @@ -94,7 +94,8 @@ bool BIF_createTransformOrientation(struct bContext *C, bool overwrite); void BIF_selectTransformOrientation(struct bContext *C, struct TransformOrientation *target); -void ED_getTransformOrientationMatrix(struct ViewLayer *view_layer, +void ED_getTransformOrientationMatrix(const struct Scene *scene, + struct ViewLayer *view_layer, const struct View3D *v3d, struct Object *ob, struct Object *obedit, diff --git a/source/blender/editors/interface/interface_ops.cc b/source/blender/editors/interface/interface_ops.cc index da97bb1c2e5..50cc49501f4 100644 --- a/source/blender/editors/interface/interface_ops.cc +++ b/source/blender/editors/interface/interface_ops.cc @@ -1508,6 +1508,7 @@ static bool jump_to_target_ptr(bContext *C, PointerRNA ptr, const bool poll) Base *base = nullptr; const short id_type = GS(ptr.owner_id->name); if (id_type == ID_OB) { + BKE_view_layer_ensure_sync(scene, view_layer); base = BKE_view_layer_base_find(view_layer, (Object *)ptr.owner_id); } else if (OB_DATA_SUPPORT_ID(id_type)) { diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c index c88db573509..3f61d266118 100644 --- a/source/blender/editors/mesh/editmesh_select.c +++ b/source/blender/editors/mesh/editmesh_select.c @@ -358,6 +358,7 @@ BMVert *EDBM_vert_find_nearest_ex(ViewContext *vc, BMVert *EDBM_vert_find_nearest(ViewContext *vc, float *dist_px_manhattan_p) { + BKE_view_layer_ensure_sync(vc->scene, vc->view_layer); Base *base = BKE_view_layer_base_find(vc->view_layer, vc->obact); return EDBM_vert_find_nearest_ex(vc, dist_px_manhattan_p, false, false, &base, 1, NULL); } @@ -612,6 +613,7 @@ BMEdge *EDBM_edge_find_nearest_ex(ViewContext *vc, BMEdge *EDBM_edge_find_nearest(ViewContext *vc, float *dist_px_manhattan_p) { + BKE_view_layer_ensure_sync(vc->scene, vc->view_layer); Base *base = BKE_view_layer_base_find(vc->view_layer, vc->obact); return EDBM_edge_find_nearest_ex( vc, dist_px_manhattan_p, NULL, false, false, NULL, &base, 1, NULL); @@ -831,6 +833,7 @@ BMFace *EDBM_face_find_nearest_ex(ViewContext *vc, BMFace *EDBM_face_find_nearest(ViewContext *vc, float *dist_px_manhattan_p) { + BKE_view_layer_ensure_sync(vc->scene, vc->view_layer); Base *base = BKE_view_layer_base_find(vc->view_layer, vc->obact); return EDBM_face_find_nearest_ex( vc, dist_px_manhattan_p, NULL, false, false, false, NULL, &base, 1, NULL); diff --git a/source/blender/editors/object/object_add.cc b/source/blender/editors/object/object_add.cc index 1dded0fe170..acd7f925f6d 100644 --- a/source/blender/editors/object/object_add.cc +++ b/source/blender/editors/object/object_add.cc @@ -2538,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_ensure_sync(scene, view_layer); Base *base_dst = BKE_view_layer_base_find(view_layer, ob_dst); BLI_assert(base_dst != nullptr); @@ -2835,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_ensure_sync(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); @@ -3579,7 +3581,7 @@ static Base *object_add_duplicate_internal(Main *bmain, *r_ob_new = obn; } DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); - + BKE_view_layer_ensure_sync(scene, view_layer); base = BKE_view_layer_base_find(view_layer, ob); if ((base != nullptr) && (base->flag & BASE_VISIBLE_DEPSGRAPH)) { BKE_collection_object_add_from(bmain, scene, ob, obn); @@ -3589,6 +3591,7 @@ static Base *object_add_duplicate_internal(Main *bmain, BKE_collection_object_add(bmain, layer_collection->collection, obn); } + BKE_view_layer_ensure_sync(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; @@ -3709,6 +3712,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_ensure_sync(scene, view_layer); Base *base_new = BKE_view_layer_base_find(view_layer, ob_new); if (base_new == nullptr) { continue; diff --git a/source/blender/editors/object/object_bake_api.c b/source/blender/editors/object/object_bake_api.c index 8db699cceb8..ce612134513 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_ensure_sync(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; } } @@ -1809,6 +1812,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, @@ -1862,6 +1866,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_edit.c b/source/blender/editors/object/object_edit.c index b401ee45342..fee248ffc7d 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -387,6 +387,7 @@ static int object_hide_collection_exec(bContext *C, wmOperator *op) void ED_collection_hide_menu_draw(const bContext *C, uiLayout *layout) { + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); LayerCollection *lc_scene = view_layer->layer_collections.first; @@ -405,7 +406,7 @@ void ED_collection_hide_menu_draw(const bContext *C, uiLayout *layout) } int icon = ICON_NONE; - if (BKE_layer_collection_has_selected_objects(view_layer, lc)) { + if (BKE_layer_collection_has_selected_objects(scene, view_layer, lc)) { icon = ICON_LAYER_ACTIVE; } else if (lc->runtime_flag & LAYER_COLLECTION_HAS_OBJECTS) { diff --git a/source/blender/editors/object/object_modes.c b/source/blender/editors/object/object_modes.c index 95d88937780..e499d4a5a6e 100644 --- a/source/blender/editors/object/object_modes.c +++ b/source/blender/editors/object/object_modes.c @@ -330,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_ensure_sync(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) { @@ -467,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_ensure_sync(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_relations.c b/source/blender/editors/object/object_relations.c index b5275c3a494..01e796c5452 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -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_ensure_sync(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"); diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 6aae4aa711d..84185471dd9 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -867,6 +867,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); @@ -879,6 +880,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_ensure_sync(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); @@ -1250,6 +1252,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_ensure_sync(scene, view_layer); Base *secbase = BKE_view_layer_base_find(view_layer, ob); if (secbase) { diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc index 50647baeb65..71ef615cf40 100644 --- a/source/blender/editors/render/render_preview.cc +++ b/source/blender/editors/render/render_preview.cc @@ -827,6 +827,7 @@ static Scene *object_preview_scene_create(const struct ObjectPreviewData *previe scene->r.ysch = preview_data->sizey; scene->r.size = 100; + BKE_view_layer_ensure_sync(scene, view_layer); Base *preview_base = BKE_view_layer_base_find(view_layer, preview_data->object); /* For 'view selected' below. */ preview_base->flag |= BASE_SELECTED; diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c index 4a69cc613eb..d37aa5ff01d 100644 --- a/source/blender/editors/screen/screen_edit.c +++ b/source/blender/editors/screen/screen_edit.c @@ -1163,6 +1163,7 @@ static void screen_set_3dview_camera(Scene *scene, /* fix any cameras that are used in the 3d view but not in the scene */ BKE_screen_view3d_sync(v3d, scene); + BKE_view_layer_ensure_sync(scene, view_layer); if (!v3d->camera || !BKE_view_layer_base_find(view_layer, v3d->camera)) { v3d->camera = BKE_view_layer_camera_find(scene, view_layer); // XXX if (screen == curscreen) handle_view3d_lock(); diff --git a/source/blender/editors/space_outliner/outliner_collections.cc b/source/blender/editors/space_outliner/outliner_collections.cc index 970b12f7d39..bc6cda2f40f 100644 --- a/source/blender/editors/space_outliner/outliner_collections.cc +++ b/source/blender/editors/space_outliner/outliner_collections.cc @@ -495,6 +495,7 @@ static LayerCollection *outliner_active_layer_collection(bContext *C) static int collection_objects_select_exec(bContext *C, wmOperator *op) { + Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); LayerCollection *layer_collection = outliner_active_layer_collection(C); bool deselect = STREQ(op->idname, "OUTLINER_OT_collection_objects_deselect"); @@ -503,9 +504,8 @@ static int collection_objects_select_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } - BKE_layer_collection_objects_select(view_layer, layer_collection, deselect); + BKE_layer_collection_objects_select(scene, view_layer, layer_collection, deselect); - Scene *scene = CTX_data_scene(C); DEG_id_tag_update(&scene->id, ID_RECALC_SELECT); WM_main_add_notifier(NC_SCENE | ND_OB_SELECT, scene); ED_outliner_select_sync_from_object_tag(C); @@ -1198,7 +1198,7 @@ static int collection_visibility_exec(bContext *C, wmOperator *op) GSET_ITER (collections_to_edit_iter, data.collections_to_edit) { LayerCollection *layer_collection = static_cast<LayerCollection *>( BLI_gsetIterator_getKey(&collections_to_edit_iter)); - BKE_layer_collection_set_visible(view_layer, layer_collection, show, is_inside); + BKE_layer_collection_set_visible(scene, view_layer, layer_collection, show, is_inside); } BLI_gset_free(data.collections_to_edit, nullptr); @@ -1503,6 +1503,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_ensure_sync(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 +1534,7 @@ static int outliner_hide_exec(bContext *C, wmOperator *UNUSED(op)) GSET_ITER (collections_to_edit_iter, data.collections_to_edit) { LayerCollection *layer_collection = static_cast<LayerCollection *>( BLI_gsetIterator_getKey(&collections_to_edit_iter)); - BKE_layer_collection_set_visible(view_layer, layer_collection, false, false); + BKE_layer_collection_set_visible(scene, view_layer, layer_collection, false, false); } BLI_gset_free(data.collections_to_edit, nullptr); diff --git a/source/blender/editors/space_outliner/outliner_dragdrop.cc b/source/blender/editors/space_outliner/outliner_dragdrop.cc index 4a0e00b8bf1..2a8353e178b 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_ensure_sync(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_ensure_sync(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 20f493d3305..27c95a1040f 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_ensure_sync(scene, view_layer); Base *base_iter = BKE_view_layer_base_find(view_layer, ob_iter); /* Child can be in a collection excluded from viewlayer. */ if (base_iter == nullptr) { @@ -349,6 +350,7 @@ static void outliner_base_or_object_pointer_create( RNA_id_pointer_create(&ob->id, ptr); } else { + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); RNA_pointer_create(&scene->id, &RNA_ObjectBase, base, ptr); } @@ -1147,6 +1149,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_ensure_sync(scene, view_layer); Base *base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(view_layer, ob); if (base) { @@ -3214,6 +3217,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_ensure_sync(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_ensure_sync(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_select.cc b/source/blender/editors/space_outliner/outliner_select.cc index 1c57cbc1d38..6f198858988 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_ensure_sync(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_ensure_sync(tvc->scene, tvc->view_layer); Base *base = BKE_view_layer_base_find(tvc->view_layer, ob); /* Hidden objects can be removed from the mode. */ @@ -908,11 +910,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_ensure_sync(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). */ @@ -1128,7 +1132,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: @@ -1418,6 +1422,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_ensure_sync(tvc->scene, tvc->view_layer); if (extend) { eObjectSelect_Mode sel = BA_SELECT; diff --git a/source/blender/editors/space_outliner/outliner_sync.cc b/source/blender/editors/space_outliner/outliner_sync.cc index 940f9509e21..158b03e9842 100644 --- a/source/blender/editors/space_outliner/outliner_sync.cc +++ b/source/blender/editors/space_outliner/outliner_sync.cc @@ -391,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_ensure_sync(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); @@ -490,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, @@ -501,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) { @@ -525,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); } } @@ -549,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 */ @@ -556,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 1a5bd1787a3..249a8a3e097 100644 --- a/source/blender/editors/space_outliner/outliner_tools.cc +++ b/source/blender/editors/space_outliner/outliner_tools.cc @@ -783,8 +783,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_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { @@ -821,8 +823,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_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { @@ -2168,6 +2172,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_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (base) { diff --git a/source/blender/editors/space_outliner/outliner_tree.cc b/source/blender/editors/space_outliner/outliner_tree.cc index 7d421f075fb..577ade5320f 100644 --- a/source/blender/editors/space_outliner/outliner_tree.cc +++ b/source/blender/editors/space_outliner/outliner_tree.cc @@ -1451,6 +1451,7 @@ static bool outliner_element_visible_get(const Scene *scene, if (exclude_filter & SO_FILTER_OB_STATE) { if (base == nullptr) { + BKE_view_layer_ensure_sync(scene, view_layer); base = BKE_view_layer_base_find(view_layer, ob); if (base == nullptr) { diff --git a/source/blender/editors/space_outliner/outliner_utils.cc b/source/blender/editors/space_outliner/outliner_utils.cc index 115a5a05a27..95e12e3b0c9 100644 --- a/source/blender/editors/space_outliner/outliner_utils.cc +++ b/source/blender/editors/space_outliner/outliner_utils.cc @@ -453,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; @@ -466,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_ensure_sync(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 f33100754ca..dbed71417b5 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)) { @@ -167,6 +168,7 @@ void TreeDisplayViewLayer::add_layer_collection_objects(ListBase &tree, LayerCollection &lc, TreeElement &ten) { + BKE_view_layer_ensure_sync(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( diff --git a/source/blender/editors/space_view3d/space_view3d.c b/source/blender/editors/space_view3d/space_view3d.c index cd98d256509..1e366ae3842 100644 --- a/source/blender/editors/space_view3d/space_view3d.c +++ b/source/blender/editors/space_view3d/space_view3d.c @@ -751,7 +751,7 @@ static void view3d_ob_drop_copy_external_asset(bContext *UNUSED(C), wmDrag *drag WM_event_add_notifier(C, NC_SCENE | ND_LAYER_CONTENT, scene); RNA_int_set(drop->ptr, "session_uuid", id->session_uuid); - + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, (Object *)id); if (base != NULL) { BKE_view_layer_base_select_and_set_active(view_layer, base); @@ -804,6 +804,7 @@ static void view3d_collection_drop_copy_external_asset(bContext *UNUSED(C), /* Make an object active, just use the first one in the collection. */ CollectionObject *cobject = collection->gobject.first; + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = cobject ? BKE_view_layer_base_find(view_layer, cobject->ob) : NULL; if (base) { BLI_assert((base->flag & BASE_SELECTABLE) && (base->flag & BASE_ENABLED_VIEWPORT)); diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 54b8794f277..82dc8252b0e 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2122,6 +2122,7 @@ bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const * \note Only use in object mode. */ static void validate_object_select_id(struct Depsgraph *depsgraph, + const Scene *scene, ViewLayer *view_layer, ARegion *region, View3D *v3d, @@ -2154,6 +2155,7 @@ static void validate_object_select_id(struct Depsgraph *depsgraph, } if (obact_eval && ((obact_eval->base_flag & BASE_VISIBLE_DEPSGRAPH) != 0)) { + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, obact); DRW_select_buffer_context_create(&base, 1, -1); } @@ -2189,7 +2191,8 @@ static void view3d_opengl_read_Z_pixels(GPUViewport *viewport, rcti *rect, void void ED_view3d_select_id_validate(ViewContext *vc) { - validate_object_select_id(vc->depsgraph, vc->view_layer, vc->region, vc->v3d, vc->obact); + validate_object_select_id( + vc->depsgraph, vc->scene, vc->view_layer, vc->region, vc->v3d, vc->obact); } int ED_view3d_backbuf_sample_size_clamp(ARegion *region, const float dist) diff --git a/source/blender/editors/space_view3d/view3d_navigate.c b/source/blender/editors/space_view3d/view3d_navigate.c index 4ebc5031b3c..826bd4b27d2 100644 --- a/source/blender/editors/space_view3d/view3d_navigate.c +++ b/source/blender/editors/space_view3d/view3d_navigate.c @@ -1178,10 +1178,12 @@ static int view_axis_exec(bContext *C, wmOperator *op) Object *obact = CTX_data_active_object(C); if (obact != NULL) { float twmat[3][3]; + const Scene *scene = CTX_data_scene(C); struct ViewLayer *view_layer = CTX_data_view_layer(C); Object *obedit = CTX_data_edit_object(C); /* same as transform gizmo when normal is set */ - ED_getTransformOrientationMatrix(view_layer, v3d, obact, obedit, V3D_AROUND_ACTIVE, twmat); + ED_getTransformOrientationMatrix( + scene, view_layer, v3d, obact, obedit, V3D_AROUND_ACTIVE, twmat); align_quat = align_quat_buf; mat3_to_quat(align_quat, twmat); invert_qt_normalized(align_quat); diff --git a/source/blender/editors/space_view3d/view3d_select.cc b/source/blender/editors/space_view3d/view3d_select.cc index e6bea3868f5..8c8eb71c383 100644 --- a/source/blender/editors/space_view3d/view3d_select.cc +++ b/source/blender/editors/space_view3d/view3d_select.cc @@ -201,6 +201,7 @@ static void editselect_buf_cache_init(ViewContext *vc, short select_mode) else { /* Use for paint modes, currently only a single object at a time. */ if (vc->obact) { + BKE_view_layer_ensure_sync(vc->scene, vc->view_layer); Base *base = BKE_view_layer_base_find(vc->view_layer, vc->obact); DRW_select_buffer_context_create(&base, 1, select_mode); } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 9b58f412eb1..c1ad4dfe4ac 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1085,7 +1085,7 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]) } else { /* object mode */ - BKE_view_layer_ensure_sync(t->scene, t->view_layer); + BKE_view_layer_ensure_sync(t->scene, t->view_layer); Base *base = BKE_view_layer_active_base_get(t->view_layer, __func__); if (base && ((!select_only) || ((base->flag & BASE_SELECTED) != 0))) { copy_v3_v3(r_center, base->object->obmat[3]); @@ -1465,6 +1465,7 @@ Object *transform_object_deform_pose_armature_get(const TransInfo *t, Object *ob * Lines below just check is also visible. */ Object *ob_armature = BKE_modifiers_is_deformed_by_armature(ob); if (ob_armature && ob_armature->mode & OB_MODE_POSE) { + BKE_view_layer_ensure_sync(t->scene, t->view_layer); Base *base_arm = BKE_view_layer_base_find(t->view_layer, ob_armature); if (base_arm) { View3D *v3d = t->view; diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c index 4c5baf93732..920c0662461 100644 --- a/source/blender/editors/transform/transform_orientations.c +++ b/source/blender/editors/transform/transform_orientations.c @@ -516,7 +516,7 @@ short ED_transform_calc_orientation_from_type_ex(const Scene *scene, } case V3D_ORIENT_NORMAL: { if (obedit || (ob && ob->mode & OB_MODE_POSE)) { - ED_getTransformOrientationMatrix(view_layer, v3d, ob, obedit, pivot_point, r_mat); + ED_getTransformOrientationMatrix(scene, view_layer, v3d, ob, obedit, pivot_point, r_mat); break; } /* No break we define 'normal' as 'local' in Object mode. */ @@ -529,7 +529,7 @@ short ED_transform_calc_orientation_from_type_ex(const Scene *scene, * use the active pones axis for display T33575, this works as expected on a single * bone and users who select many bones will understand what's going on and what local * means when they start transforming. */ - ED_getTransformOrientationMatrix(view_layer, v3d, ob, obedit, pivot_point, r_mat); + ED_getTransformOrientationMatrix(scene, view_layer, v3d, ob, obedit, pivot_point, r_mat); } else { transform_orientations_create_from_axis(r_mat, UNPACK3(ob->obmat)); @@ -745,7 +745,8 @@ static uint bm_mesh_faces_select_get_n(BMesh *bm, BMVert **elems, const uint n) } #endif -int getTransformOrientation_ex(ViewLayer *view_layer, +int getTransformOrientation_ex(const Scene *scene, + ViewLayer *view_layer, const View3D *v3d, struct Object *ob, struct Object *obedit, @@ -1253,6 +1254,7 @@ int getTransformOrientation_ex(ViewLayer *view_layer, ok = true; } else { + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); if (UNLIKELY(base == NULL)) { /* This is very unlikely, if it happens allow the value to be set since the caller @@ -1283,13 +1285,15 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3]) /* dummy value, not V3D_AROUND_ACTIVE and not V3D_AROUND_LOCAL_ORIGINS */ short around = V3D_AROUND_CENTER_BOUNDS; + const Scene *scene = CTX_data_scene(C); ViewLayer *view_layer = CTX_data_view_layer(C); View3D *v3d = CTX_wm_view3d(C); - return getTransformOrientation_ex(view_layer, v3d, obact, obedit, normal, plane, around); + return getTransformOrientation_ex(scene, view_layer, v3d, obact, obedit, normal, plane, around); } -void ED_getTransformOrientationMatrix(ViewLayer *view_layer, +void ED_getTransformOrientationMatrix(const Scene *scene, + ViewLayer *view_layer, const View3D *v3d, Object *ob, Object *obedit, @@ -1301,7 +1305,7 @@ void ED_getTransformOrientationMatrix(ViewLayer *view_layer, int type; - type = getTransformOrientation_ex(view_layer, v3d, ob, obedit, normal, plane, around); + type = getTransformOrientation_ex(scene, view_layer, v3d, ob, obedit, normal, plane, around); /* Fallback, when the plane can't be calculated. */ if (ORIENTATION_USE_PLANE(type) && is_zero_v3(plane)) { diff --git a/source/blender/editors/transform/transform_orientations.h b/source/blender/editors/transform/transform_orientations.h index 3ac235517a7..32093e830b0 100644 --- a/source/blender/editors/transform/transform_orientations.h +++ b/source/blender/editors/transform/transform_orientations.h @@ -55,7 +55,8 @@ enum { }; #define ORIENTATION_USE_PLANE(ty) ELEM(ty, ORIENTATION_NORMAL, ORIENTATION_EDGE, ORIENTATION_FACE) -int getTransformOrientation_ex(ViewLayer *view_layer, +int getTransformOrientation_ex(const Scene *scene, + ViewLayer *view_layer, const View3D *v3d, struct Object *ob, struct Object *obedit, diff --git a/source/blender/io/alembic/intern/alembic_capi.cc b/source/blender/io/alembic/intern/alembic_capi.cc index 2306f96ebf8..0cfe1bc0d9c 100644 --- a/source/blender/io/alembic/intern/alembic_capi.cc +++ b/source/blender/io/alembic/intern/alembic_capi.cc @@ -617,6 +617,7 @@ static void import_endjob(void *user_data) /* Sync the collection, and do view layer operations. */ BKE_layer_collection_resync_allow(); BKE_main_collection_sync(data->bmain); + BKE_view_layer_ensure_sync(scene, view_layer); for (AbcObjectReader *reader : data->readers) { Object *ob = reader->object(); base = BKE_view_layer_base_find(view_layer, ob); diff --git a/source/blender/io/collada/collada_utils.cpp b/source/blender/io/collada/collada_utils.cpp index 82c471a6524..0d2f97d0c2f 100644 --- a/source/blender/io/collada/collada_utils.cpp +++ b/source/blender/io/collada/collada_utils.cpp @@ -196,7 +196,7 @@ Object *bc_add_object(Main *bmain, Scene *scene, ViewLayer *view_layer, int type LayerCollection *layer_collection = BKE_layer_collection_get_active(view_layer); BKE_collection_object_add(bmain, layer_collection->collection, ob); - + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, ob); /* TODO: is setting active needed? */ BKE_view_layer_base_select_and_set_active(view_layer, base); diff --git a/source/blender/io/stl/importer/stl_import.cc b/source/blender/io/stl/importer/stl_import.cc index 545d72e3350..454464ff2d1 100644 --- a/source/blender/io/stl/importer/stl_import.cc +++ b/source/blender/io/stl/importer/stl_import.cc @@ -104,6 +104,7 @@ void importer_main(Main *bmain, Object *obj = BKE_object_add_only_object(bmain, OB_MESH, ob_name); BKE_mesh_assign_object(bmain, obj, mesh); BKE_collection_object_add(bmain, lc->collection, obj); + BKE_view_layer_ensure_sync(scene, view_layer); Base *base = BKE_view_layer_base_find(view_layer, obj); BKE_view_layer_base_select_and_set_active(view_layer, base); diff --git a/source/blender/io/usd/intern/usd_capi_import.cc b/source/blender/io/usd/intern/usd_capi_import.cc index b27ddd96e7b..17c802e356f 100644 --- a/source/blender/io/usd/intern/usd_capi_import.cc +++ b/source/blender/io/usd/intern/usd_capi_import.cc @@ -333,6 +333,7 @@ static void import_endjob(void *customdata) /* Sync the collection, and do view layer operations. */ BKE_layer_collection_resync_allow(); BKE_main_collection_sync(data->bmain); + BKE_view_layer_ensure_sync(scene, view_layer); for (USDPrimReader *reader : data->archive->readers()) { if (!reader) { continue; diff --git a/source/blender/io/wavefront_obj/importer/obj_importer.cc b/source/blender/io/wavefront_obj/importer/obj_importer.cc index 910fee0117a..d3f79e27213 100644 --- a/source/blender/io/wavefront_obj/importer/obj_importer.cc +++ b/source/blender/io/wavefront_obj/importer/obj_importer.cc @@ -76,6 +76,7 @@ static void geometry_to_blender_objects(Main *bmain, /* Sync the collection after all objects are created. */ BKE_layer_collection_resync_allow(); BKE_main_collection_sync(bmain); + BKE_view_layer_ensure_sync(scene, view_layer); /* After collection sync, select objects in the view layer and do DEG updates. */ for (Object *obj : objects) { diff --git a/source/blender/makesrna/intern/rna_layer.c b/source/blender/makesrna/intern/rna_layer.c index dc1191293b7..037a659cbec 100644 --- a/source/blender/makesrna/intern/rna_layer.c +++ b/source/blender/makesrna/intern/rna_layer.c @@ -351,9 +351,18 @@ static bool rna_LayerCollection_has_objects(LayerCollection *lc) return (lc->runtime_flag & LAYER_COLLECTION_HAS_OBJECTS) != 0; } -static bool rna_LayerCollection_has_selected_objects(LayerCollection *lc, ViewLayer *view_layer) +static bool rna_LayerCollection_has_selected_objects(LayerCollection *lc, + Main *bmain, + ViewLayer *view_layer) { - return BKE_layer_collection_has_selected_objects(view_layer, lc); + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + LISTBASE_FOREACH (ViewLayer *, scene_view_layer, &scene->view_layers) { + if (scene_view_layer == view_layer) { + return BKE_layer_collection_has_selected_objects(scene, view_layer, lc); + } + } + } + return false; } #else @@ -446,6 +455,7 @@ static void rna_def_layer_collection(BlenderRNA *brna) func = RNA_def_function( srna, "has_selected_objects", "rna_LayerCollection_has_selected_objects"); + RNA_def_function_flag(func, FUNC_USE_MAIN); RNA_def_function_ui_description(func, ""); prop = RNA_def_pointer( func, "view_layer", "ViewLayer", "", "View layer the layer collection belongs to"); |