[Bf-blender-cvs] [fa7e6fe994a] temp-T73411-view-layer-lazy-cache: Start Blender + add object.

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


Commit: fa7e6fe994a001838151a3e7868b020c127773b9
Author: Monique
Date:   Thu Sep 1 21:17:52 2022 +0200
Branches: temp-T73411-view-layer-lazy-cache
https://developer.blender.org/rBfa7e6fe994a001838151a3e7868b020c127773b9

Start Blender + add object.

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

M	source/blender/blenkernel/BKE_layer.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/layer.c
M	source/blender/blenkernel/intern/layer_utils.c
M	source/blender/blenkernel/intern/lib_override.cc
M	source/blender/blenkernel/intern/object.cc
M	source/blender/blenkernel/intern/scene.cc
M	source/blender/editors/curve/editfont.c
M	source/blender/editors/curves/intern/curves_ops.cc
M	source/blender/editors/include/ED_object.h
M	source/blender/editors/object/object_add.cc
M	source/blender/editors/object/object_constraint.c
M	source/blender/editors/object/object_edit.c
M	source/blender/editors/object/object_hook.c
M	source/blender/editors/object/object_modifier.cc
M	source/blender/editors/render/render_preview.cc
M	source/blender/editors/screen/area.c
M	source/blender/editors/space_outliner/outliner_collections.cc
M	source/blender/editors/space_outliner/outliner_draw.cc
M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M	source/blender/makesdna/DNA_layer_types.h
M	source/blender/makesrna/intern/rna_layer.c
M	source/blender/makesrna/intern/rna_object_api.c

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

diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h
index db6038f8913..3ca75a2bfeb 100644
--- a/source/blender/blenkernel/BKE_layer.h
+++ b/source/blender/blenkernel/BKE_layer.h
@@ -552,6 +552,9 @@ struct Base *BKE_view_layer_active_base_get(struct ViewLayer *view_layer, const
 
 struct LayerCollection *BKE_view_layer_active_collection_get(struct ViewLayer *view_layer,
                                                              const char *name);
+
+void BKE_view_layer_tag_out_of_sync(struct ViewLayer *view_layer);
+void BKE_view_layer_ensure_sync(struct Scene *scene, struct ViewLayer *view_layer);
 // This should not exist in the final solution.
 const struct ListBase *BKE_view_layer_object_bases_get_const(const struct ViewLayer *view_layer,
                                                              const char *name);
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index e0fb6c5e834..17a2a81c9d3 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -175,9 +175,10 @@ struct Object *BKE_object_add_only_object(struct Main *bmain,
  * \note Creates minimum required data, but without vertices etc.
  */
 struct Object *BKE_object_add(struct Main *bmain,
+                              struct Scene *scene,
                               struct ViewLayer *view_layer,
                               int type,
-                              const char *name) ATTR_NONNULL(1, 2) ATTR_RETURNS_NONNULL;
+                              const char *name) ATTR_NONNULL(1, 2, 3) ATTR_RETURNS_NONNULL;
 /**
  * Add a new object, using another one as a reference
  *
diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index c9773046364..3ece877fc75 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -342,8 +342,7 @@ static void view_layer_bases_hash_create(ViewLayer *view_layer, const bool do_ba
     if (view_layer->object_bases_hash == NULL) {
       GHash *hash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
 
-      LISTBASE_FOREACH_MUTABLE (
-          Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
+      LISTBASE_FOREACH_MUTABLE (Base *, base, &view_layer->object_bases) {
         if (base->object) {
           void **val_pp;
           if (!BLI_ghash_ensure_p(hash, base->object, &val_pp)) {
@@ -359,7 +358,7 @@ static void view_layer_bases_hash_create(ViewLayer *view_layer, const bool do_ba
             if (view_layer->basact == base) {
               view_layer->basact = NULL;
             }
-            BLI_freelinkN(BKE_view_layer_object_bases_get(view_layer, __func__), base);
+            BLI_freelinkN(&view_layer->object_bases, base);
           }
           else {
             CLOG_FATAL(&LOG,
@@ -379,6 +378,8 @@ static void view_layer_bases_hash_create(ViewLayer *view_layer, const bool do_ba
 
 Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
 {
+  BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
+                 "View layer out of sync, invoke BKE_view_layer_ensure_sync.");
   if (!view_layer->object_bases_hash) {
     view_layer_bases_hash_create(view_layer, false);
   }
@@ -957,6 +958,20 @@ static void layer_collection_resync_unused_layers_free(ViewLayer *view_layer,
   }
 }
 
+void BKE_view_layer_tag_out_of_sync(struct ViewLayer *view_layer)
+{
+  printf("%s: %s\n", __func__, view_layer->name);
+  view_layer->flag |= VIEW_LAYER_OUT_OF_SYNC;
+}
+
+void BKE_view_layer_ensure_sync(struct Scene *scene, struct ViewLayer *view_layer)
+{
+  if (view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) {
+    BKE_layer_collection_sync(scene, view_layer);
+    view_layer->flag &= ~VIEW_LAYER_OUT_OF_SYNC;
+  }
+}
+
 static void layer_collection_objects_sync(ViewLayer *view_layer,
                                           LayerCollection *layer,
                                           ListBase *r_lb_new_object_bases,
@@ -986,7 +1001,7 @@ static void layer_collection_objects_sync(ViewLayer *view_layer,
        * case also works. */
       base = *base_p;
       if (!ELEM(base, r_lb_new_object_bases->first, r_lb_new_object_bases->last)) {
-        BLI_remlink(BKE_view_layer_object_bases_get(view_layer, __func__), base);
+        BLI_remlink(&view_layer->object_bases, base);
         BLI_addtail(r_lb_new_object_bases, base);
       }
     }
@@ -1049,8 +1064,14 @@ static void layer_collection_sync(ViewLayer *view_layer,
 
   BLI_assert(layer_resync->is_used);
 
+  uint64_t skipped_children = 0;
   LISTBASE_FOREACH (CollectionChild *, child, &layer_resync->collection->children) {
     Collection *child_collection = child->collection;
+    /* Collection relations may not have rebuild yet. */
+    if (child_collection == NULL) {
+      skipped_children++;
+      continue;
+    }
     LayerCollectionResync *child_layer_resync = layer_collection_resync_find(layer_resync,
                                                                              child_collection);
 
@@ -1155,7 +1176,7 @@ static void layer_collection_sync(ViewLayer *view_layer,
 
   /* Replace layer collection list with new one. */
   layer_resync->layer->layer_collections = new_lb_layer;
-  BLI_assert(BLI_listbase_count(&layer_resync->collection->children) ==
+  BLI_assert(BLI_listbase_count(&layer_resync->collection->children) - skipped_children ==
              BLI_listbase_count(&new_lb_layer));
 
   /* Update bases etc. for objects. */
@@ -1270,7 +1291,7 @@ void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer)
   }
 
   /* Clear visible and selectable flags to be reset. */
-  LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
     base->flag &= ~g_base_collection_flags;
     base->flag_from_collection &= ~g_base_collection_flags;
   }
@@ -1299,7 +1320,7 @@ void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer)
   master_layer_resync = NULL;
 
   /* Any remaining object bases are to be removed. */
-  LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
     if (view_layer->basact == base) {
       view_layer->basact = NULL;
     }
@@ -1320,7 +1341,7 @@ void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer)
 
   view_layer_objects_base_cache_validate(view_layer, NULL);
 
-  LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer, __func__)) {
+  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
     BKE_base_eval_flags(base);
   }
 
@@ -1341,7 +1362,8 @@ void BKE_scene_collection_sync(const Scene *scene)
   }
 
   LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
-    BKE_layer_collection_sync(scene, view_layer);
+    // BKE_layer_collection_sync(scene, view_layer);
+    BKE_view_layer_tag_out_of_sync(view_layer);
   }
 }
 
@@ -1504,7 +1526,8 @@ void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool
     base->flag ^= BASE_HIDDEN;
   }
 
-  BKE_layer_collection_sync(scene, view_layer);
+  // BKE_layer_collection_sync(scene, view_layer);
+  BKE_view_layer_tag_out_of_sync(view_layer);
 }
 
 bool BKE_base_is_visible(const View3D *v3d, const Base *base)
@@ -1628,7 +1651,8 @@ void BKE_layer_collection_isolate_global(Scene *scene,
     BKE_layer_collection_activate(view_layer, lc);
   }
 
-  BKE_layer_collection_sync(scene, view_layer);
+  // BKE_layer_collection_sync(scene, view_layer);
+  BKE_view_layer_tag_out_of_sync(view_layer);
 }
 
 static void layer_collection_local_visibility_set_recursive(LayerCollection *layer_collection,
diff --git a/source/blender/blenkernel/intern/layer_utils.c b/source/blender/blenkernel/intern/layer_utils.c
index 62e928f42d1..8a1823b688f 100644
--- a/source/blender/blenkernel/intern/layer_utils.c
+++ b/source/blender/blenkernel/intern/layer_utils.c
@@ -208,30 +208,29 @@ struct Object **BKE_view_layer_array_from_objects_in_mode_unique_data(ViewLayer
   return BKE_view_layer_array_from_objects_in_mode_params(view_layer, v3d, r_len, &params);
 }
 
-struct ListBase *BKE_view_layer_object_bases_get(struct ViewLayer *view_layer,
-                                                 const char *UNUSED(name))
+struct ListBase *BKE_view_layer_object_bases_get(struct ViewLayer *view_layer, const char *name)
 {
-  // TODO: BLI_assert_msg(view_layer->flags & ..., name);
+  BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0, name);
   return &view_layer->object_bases;
 }
 
 struct Base *BKE_view_layer_active_base_get(struct ViewLayer *view_layer, const char *name)
 {
-  // TODO: BLI_assert_msg(view_layer->flags & ..., name);
+  BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0, name);
   return view_layer->basact;
 }
 
 struct LayerCollection *BKE_view_layer_active_collection_get(struct ViewLayer *view_layer,
                                                              const char *name)
 {
-  // TODO: BLI_assert_msg(view_layer->flags & ..., name);
+  BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0, name);
   return view_layer->active_collection;
 }
 
 const struct ListBase *BKE_view_layer_object_bases_get_const(const struct ViewLayer *view_layer,
-                                                             const char *UNUSED(name))
+                                                             const char *name)
 {
-  // TODO: BLI_assert_msg(view_layer->flags & ..., name);
+  BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0, name);
   return &view_layer->object_bases;
 }
 
diff --git a/source/blender/blenkernel/intern/lib_override.cc b/source/blender/blenkernel/intern/lib_override.cc
index 3c77573dc41..20cb9329213 100644
--- a/source/blender/blenkernel/intern/lib_override.cc
+++ b/source/blender/blenkernel/intern/lib_override.cc
@@ -2701,7 +2701,8 @@ void BKE_lib_override_library_main_resync(Main *bmain,
     /* Hide the collection from viewport and render. */
     override_resync_residual_storage->flag |= COLLECTI

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list