diff options
-rw-r--r-- | source/blender/blenkernel/BKE_layer.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_object.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 38 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/object_update.c | 38 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 2 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc | 31 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_layer_types.h | 5 |
7 files changed, 63 insertions, 58 deletions
diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 36f977ea244..e3a182f9ec1 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -114,11 +114,6 @@ bool BKE_layer_collection_set_visible(struct ViewLayer *view_layer, struct Layer /* evaluation */ -void BKE_layer_eval_view_layer( - struct Depsgraph *depsgraph, - struct Scene *scene, - struct ViewLayer *view_layer); - void BKE_layer_eval_view_layer_indexed( struct Depsgraph *depsgraph, struct Scene *scene, diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 86c71b5a9fb..66a3d96cbdc 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -260,7 +260,7 @@ void BKE_object_data_select_update( struct Depsgraph *depsgraph, struct ID *object_data); -void BKE_object_eval_flush_base_flags( +void BKE_object_eval_eval_base_flags( struct Depsgraph *depsgraph, struct Scene *scene, const int view_layer_index, struct Object *object, int base_index, diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 11bcbadecbe..74c7ce6d9bd 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -1462,18 +1462,13 @@ void BKE_view_layer_bases_in_mode_iterator_end(BLI_Iterator *UNUSED(iter)) /* Evaluation */ -void BKE_layer_eval_view_layer( +static void layer_eval_view_layer( struct Depsgraph *depsgraph, struct Scene *UNUSED(scene), ViewLayer *view_layer) { DEG_debug_print_eval(depsgraph, __func__, view_layer->name, view_layer); - /* Visibility based on depsgraph mode. */ - const eEvaluationMode mode = DEG_get_mode(depsgraph); - const int base_enabled_flag = (mode == DAG_EVAL_VIEWPORT) - ? BASE_ENABLED_VIEWPORT - : BASE_ENABLED_RENDER; /* Create array of bases, for fast index-based lookup. */ const int num_object_bases = BLI_listbase_count(&view_layer->object_bases); MEM_SAFE_FREE(view_layer->object_bases_array); @@ -1481,37 +1476,8 @@ void BKE_layer_eval_view_layer( num_object_bases, sizeof(Base *), "view_layer->object_bases_array"); int base_index = 0; for (Base *base = view_layer->object_bases.first; base; base = base->next) { - /* Compute visibility for depsgraph evaluation mode. */ - if (base->flag & base_enabled_flag) { - base->flag |= BASE_ENABLED; - - /* When rendering, visibility is controlled by the enable/disable option. */ - if (mode == DAG_EVAL_RENDER) { - base->flag |= BASE_VISIBLE; - } - } - else { - base->flag &= ~(BASE_ENABLED | BASE_VISIBLE | BASE_SELECTABLE); - } - /* If base is not selectabled, clear select. */ - if ((base->flag & BASE_SELECTABLE) == 0) { - base->flag &= ~BASE_SELECTED; - } view_layer->object_bases_array[base_index++] = base; } - /* Flush back base flag to the original view layer for editing. */ - if (DEG_is_active(depsgraph) && (view_layer == DEG_get_evaluated_view_layer(depsgraph))) { - ViewLayer *view_layer_orig = DEG_get_input_view_layer(depsgraph); - Base *base_orig = view_layer_orig->object_bases.first; - const Base *base_eval = view_layer->object_bases.first; - while (base_orig != NULL) { - if (base_orig->flag & base_enabled_flag) { - base_orig->flag = base_eval->flag; - base_eval = base_eval->next; - } - base_orig = base_orig->next; - } - } } void BKE_layer_eval_view_layer_indexed( @@ -1522,5 +1488,5 @@ void BKE_layer_eval_view_layer_indexed( BLI_assert(view_layer_index >= 0); ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index); BLI_assert(view_layer != NULL); - BKE_layer_eval_view_layer(depsgraph, scene, view_layer); + layer_eval_view_layer(depsgraph, scene, view_layer); } diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c index dd0b5668c25..da6960ebc95 100644 --- a/source/blender/blenkernel/intern/object_update.c +++ b/source/blender/blenkernel/intern/object_update.c @@ -405,10 +405,10 @@ void BKE_object_data_select_update(Depsgraph *depsgraph, ID *object_data) } } -void BKE_object_eval_flush_base_flags(Depsgraph *depsgraph, - Scene *scene, const int view_layer_index, - Object *object, int base_index, - const bool is_from_set) +void BKE_object_eval_eval_base_flags(Depsgraph *depsgraph, + Scene *scene, const int view_layer_index, + Object *object, int base_index, + const bool is_from_set) { /* TODO(sergey): Avoid list lookup. */ BLI_assert(view_layer_index >= 0); @@ -422,6 +422,28 @@ void BKE_object_eval_flush_base_flags(Depsgraph *depsgraph, DEG_debug_print_eval(depsgraph, __func__, object->id.name, object); + /* Visibility based on depsgraph mode. */ + const eEvaluationMode mode = DEG_get_mode(depsgraph); + const int base_enabled_flag = (mode == DAG_EVAL_VIEWPORT) + ? BASE_ENABLED_VIEWPORT + : BASE_ENABLED_RENDER; + + /* Compute visibility for depsgraph evaluation mode. */ + if (base->flag & base_enabled_flag) { + base->flag |= BASE_ENABLED; + /* When rendering, visibility is controlled by the enable/disable option. */ + if (mode == DAG_EVAL_RENDER) { + base->flag |= BASE_VISIBLE; + } + } + else { + base->flag &= ~(BASE_ENABLED | BASE_VISIBLE | BASE_SELECTABLE); + } + /* If base is not selectable, clear select. */ + if ((base->flag & BASE_SELECTABLE) == 0) { + base->flag &= ~BASE_SELECTED; + } + /* Copy flags and settings from base. */ object->base_flag = base->flag; if (is_from_set) { @@ -438,4 +460,12 @@ void BKE_object_eval_flush_base_flags(Depsgraph *depsgraph, BKE_particle_batch_cache_dirty_tag(psys, BKE_PARTICLE_BATCH_DIRTY_ALL); } } + + /* Copy base flag back to the original view layer for editing. */ + if (DEG_is_active(depsgraph) && (view_layer == DEG_get_evaluated_view_layer(depsgraph))) { + Base *base_orig = base->base_orig; + BLI_assert(base_orig != NULL); + BLI_assert(base_orig->object != NULL); + base_orig->flag = base->flag; + } } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 0fe4afd7b55..d0723ea0ded 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -658,7 +658,7 @@ void DepsgraphNodeBuilder::build_object_flags( add_operation_node(&object->id, NodeType::OBJECT_FROM_LAYER, OperationCode::OBJECT_BASE_FLAGS, - function_bind(BKE_object_eval_flush_base_flags, + function_bind(BKE_object_eval_eval_base_flags, _1, scene_cow, view_layer_index_, 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 bd713058cce..86786a968a3 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 @@ -368,12 +368,7 @@ void view_layer_remove_disabled_bases(const Depsgraph *depsgraph, const int base_enabled_flag = (depsgraph->mode == DAG_EVAL_VIEWPORT) ? BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER; ListBase enabled_bases = {NULL, NULL}; - for (Base *base = reinterpret_cast<Base *>(view_layer->object_bases.first), - *base_next; - base != NULL; - base = base_next) - { - base_next = base->next; + LISTBASE_FOREACH_MUTABLE (Base *, base, &view_layer->object_bases) { const bool is_object_enabled = (base->flag & base_enabled_flag); if (is_object_enabled) { BLI_addtail(&enabled_bases, base); @@ -388,12 +383,26 @@ void view_layer_remove_disabled_bases(const Depsgraph *depsgraph, view_layer->object_bases = enabled_bases; } -void scene_cleanup_view_layers(const Depsgraph *depsgraph, Scene *scene_cow) +void view_layer_update_orig_base_pointers(ViewLayer *view_layer_orig, + ViewLayer *view_layer_eval) +{ + Base *base_orig = + reinterpret_cast<Base *>(view_layer_orig->object_bases.first); + LISTBASE_FOREACH (Base *, base_eval, &view_layer_eval->object_bases) { + base_eval->base_orig = base_orig; + base_orig = base_orig->next; + } +} + +void scene_setup_view_layers_after_copy(const Depsgraph *depsgraph, + Scene *scene_cow) { scene_remove_unused_view_layers(depsgraph, scene_cow); - view_layer_remove_disabled_bases( - depsgraph, - reinterpret_cast<ViewLayer *>(scene_cow->view_layers.first)); + ViewLayer *view_layer_orig = depsgraph->view_layer; + 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); /* 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. */ @@ -720,7 +729,7 @@ ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph, { done = scene_copy_inplace_no_main((Scene *)id_orig, (Scene *)id_cow); if (done) { - scene_cleanup_view_layers(depsgraph, (Scene *)id_cow); + scene_setup_view_layers_after_copy(depsgraph, (Scene *)id_cow); } break; } diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h index 1462d456563..44246952468 100644 --- a/source/blender/makesdna/DNA_layer_types.h +++ b/source/blender/makesdna/DNA_layer_types.h @@ -36,6 +36,11 @@ typedef struct Base { struct Object *object; unsigned int lay DNA_DEPRECATED; int flag_legacy; + + /* Pointer to an original base. Is initialized for evaluated view layer. + * NOTE: Only allowed to be accessed from within active dependency graph. */ + struct Base *base_orig; + void *_pad; } Base; typedef struct ViewLayerEngineData { |