[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, ¶ms);
}
-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