[Bf-blender-cvs] [6b7980f3b66] temp-T73411-view-layer-lazy-cache: Call ensure

Monique noreply at git.blender.org
Mon Sep 5 20:44:39 CEST 2022


Commit: 6b7980f3b66e4366c8e9f9e0be65830763e950ae
Author: Monique
Date:   Sun Sep 4 17:47:31 2022 +0200
Branches: temp-T73411-view-layer-lazy-cache
https://developer.blender.org/rB6b7980f3b66e4366c8e9f9e0be65830763e950ae

Call ensure

===================================================================

M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/editors/animation/anim_channels_edit.c
M	source/blender/editors/animation/anim_filter.c
M	source/blender/editors/gpencil/gpencil_armature.c
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/interface/interface_ops.cc
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_select.c

===================================================================

diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 0e1c7b8ec7a..bfa7a745268 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -2192,8 +2192,6 @@ void BKE_view_layer_bases_in_mode_iterator_next(BLI_Iterator *iter)
 
   if (base == data->base_active) {
     /* first step */
-    // TODO: We should assure that the object_bases are valid. Adding
-    // BKE_view_layer_object_bases_get here seems not correct. this should happen by the caller.
     base = data->view_layer->object_bases.first;
     if ((base == data->base_active) && BKE_base_is_visible(data->v3d, base)) {
       base = base->next;
@@ -2396,13 +2394,13 @@ void BKE_view_layer_blend_read_lib(BlendLibReader *reader, Library *lib, ViewLay
     BLO_read_id_address(reader, lib, &fls->group);
   }
 
-  LISTBASE_FOREACH_MUTABLE (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
+  LISTBASE_FOREACH_MUTABLE (Base *, base, &view_layer->object_bases) {
     /* we only bump the use count for the collection objects */
     BLO_read_id_address(reader, lib, &base->object);
 
     if (base->object == NULL) {
       /* Free in case linked object got lost. */
-      BLI_freelinkN(BKE_view_layer_object_bases_get(view_layer, __func__), base);
+      BLI_freelinkN(&view_layer->object_bases, base);
       if (view_layer->basact == base) {
         view_layer->basact = NULL;
       }
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 5de3bebb7f6..8c722bfad9a 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -512,6 +512,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
       }
     }
 
+    BKE_view_layer_ensure_sync(scene, view_layer);
     /* for convenience set the same active object in all the layers */
     if (scene->basact) {
       view_layer->basact = BKE_view_layer_base_find(view_layer, scene->basact->object);
@@ -537,6 +538,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
       view_layer->flag &= ~VIEW_LAYER_RENDER;
     }
 
+    BKE_view_layer_ensure_sync(scene, view_layer);
     /* convert active base */
     if (scene->basact) {
       view_layer->basact = BKE_view_layer_base_find(view_layer, scene->basact->object);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 980c86ed082..2fedc33b7a2 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -2118,8 +2118,9 @@ void DepsgraphNodeBuilder::build_scene_audio(Scene *scene)
                      });
 }
 
-void DepsgraphNodeBuilder::build_scene_speakers(Scene * /*scene*/, ViewLayer *view_layer)
+void DepsgraphNodeBuilder::build_scene_speakers(Scene *scene, ViewLayer *view_layer)
 {
+  BKE_view_layer_ensure_sync(scene, view_layer);
   LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
     Object *object = base->object;
     if (object->type != OB_SPEAKER || !need_pull_base_into_graph(base)) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
index afe47210a33..4a6157e11c3 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
@@ -90,6 +90,7 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene,
    * but object is expected to be an original one. Hence we go into some
    * tricks here iterating over the view layer. */
   int base_index = 0;
+  BKE_view_layer_ensure_sync(scene, view_layer);
   LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
     /* object itself */
     if (!need_pull_base_into_graph(base)) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 2343bd66133..eeee1b2bbbc 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -3050,8 +3050,9 @@ void DepsgraphRelationBuilder::build_scene_audio(Scene *scene)
   }
 }
 
-void DepsgraphRelationBuilder::build_scene_speakers(Scene * /*scene*/, ViewLayer *view_layer)
+void DepsgraphRelationBuilder::build_scene_speakers(Scene *scene, ViewLayer *view_layer)
 {
+  BKE_view_layer_ensure_sync(scene, view_layer);
   LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
     Object *object = base->object;
     if (object->type != OB_SPEAKER || !need_pull_base_into_graph(base)) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
index 14850a77d14..731efa0d497 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc
@@ -75,6 +75,7 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene,
 {
   /* Setup currently building context. */
   scene_ = scene;
+  BKE_view_layer_ensure_sync(scene, view_layer);
   /* Scene objects. */
   /* NOTE: Nodes builder requires us to pass CoW base because it's being
    * passed to the evaluation functions. During relations builder we only
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index cb84ed78c9b..b800897b8c9 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -408,18 +408,21 @@ void scene_remove_unused_view_layers(const Depsgraph *depsgraph,
 void scene_remove_all_bases(Scene *scene_cow)
 {
   LISTBASE_FOREACH (ViewLayer *, view_layer, &scene_cow->view_layers) {
-    BLI_freelistN(BKE_view_layer_object_bases_get(view_layer, __func__));
+    BLI_freelistN(&view_layer->object_bases);
   }
 }
 
 /* Makes it so given view layer only has bases corresponding to enabled
  * objects. */
-void view_layer_remove_disabled_bases(const Depsgraph *depsgraph, ViewLayer *view_layer)
+void view_layer_remove_disabled_bases(const Depsgraph *depsgraph,
+                                      const Scene *scene,
+                                      ViewLayer *view_layer)
 {
   if (view_layer == nullptr) {
     return;
   }
   ListBase enabled_bases = {nullptr, nullptr};
+  BKE_view_layer_ensure_sync(scene, view_layer);
   LISTBASE_FOREACH_MUTABLE (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
     /* TODO(sergey): Would be cool to optimize this somehow, or make it so
      * builder tags bases.
@@ -480,7 +483,7 @@ void scene_setup_view_layers_after_remap(const Depsgraph *depsgraph,
   const ViewLayer *view_layer_orig = get_original_view_layer(depsgraph, id_node);
   ViewLayer *view_layer_eval = reinterpret_cast<ViewLayer *>(scene_cow->view_layers.first);
   view_layer_update_orig_base_pointers(view_layer_orig, view_layer_eval);
-  view_layer_remove_disabled_bases(depsgraph, view_layer_eval);
+  view_layer_remove_disabled_bases(depsgraph, scene_cow, view_layer_eval);
   /* TODO(sergey): Remove objects from collections as well.
    * Not a HUGE deal for now, nobody is looking into those CURRENTLY.
    * Still not an excuse to have those. */
diff --git a/source/blender/editors/animation/anim_channels_edit.c b/source/blender/editors/animation/anim_channels_edit.c
index 036e960e717..86921db8109 100644
--- a/source/blender/editors/animation/anim_channels_edit.c
+++ b/source/blender/editors/animation/anim_channels_edit.c
@@ -2954,6 +2954,7 @@ static int click_select_channel_object(bContext *C,
                                        bAnimListElem *ale,
                                        const short /* eEditKeyframes_Select or -1 */ selectmode)
 {
+  Scene *scene = ac->scene;
   ViewLayer *view_layer = ac->view_layer;
   Base *base = (Base *)ale->data;
   Object *ob = base->object;
@@ -2973,6 +2974,7 @@ static int click_select_channel_object(bContext *C,
   }
   else {
     /* deselect all */
+    BKE_view_layer_ensure_sync(scene, view_layer);
     /* TODO: should this deselect all other types of channels too? */
     LISTBASE_FOREACH (Base *, b, BKE_view_layer_object_bases_get(view_layer, __func__)) {
       ED_object_base_select(b, BA_DESELECT);
diff --git a/source/blender/editors/animation/anim_filter.c b/source/blender/editors/animation/anim_filter.c
index bdb629075f2..cc319e8585b 100644
--- a/source/blender/editors/animation/anim_filter.c
+++ b/source/blender/editors/animation/anim_filter.c
@@ -1847,6 +1847,7 @@ static size_t animdata_filter_gpencil(bAnimContext *ac,
   bDopeSheet *ads = ac->ads;
   size_t items = 0;
 
+  Scene *scene = ac->scene;
   ViewLayer *view_layer = (ViewLayer *)ac->view_layer;
 
   /* Include all annotation datablocks. */
@@ -1859,6 +1860,7 @@ static size_t animdata_filter_gpencil(bAnimContext *ac,
     }
   }
   /* Objects in the scene */
+  BKE_view_layer_ensure_sync(scene, view_layer);
   LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
     /* Only consider this object if it has got some GP data (saving on all the other tests) */
     if (base->object && (base->object->type == OB_GPENCIL)) {
@@ -3169,11 +3171,13 @@ static int ds_base_sorting_cmp(const void *base1_ptr, const void *base2_ptr)
 
 /* Get a sorted list of all the bases - for inclusion in dopesheet (when drawing channels) */
 static Base **animdata_filter_ds_sorted_bases(bDopeSheet *ads,
+                                              const Scene *scene,
                                               ViewLayer *view_layer,
                                               int filter_mode,
                                               size_t *r_usable_bases)
 {
   /* Create an array with space 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list