Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-02-26 17:58:37 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-02-27 16:45:38 +0300
commit05dc3d43caf5a5153a8bd1e69d5f77b0e019aa3d (patch)
tree5ffb91daad9a43ba754d52a8a315aa03d01cc43b /source/blender/depsgraph
parent8a432c1a4061492fbb0b8c1880a2408444e8009a (diff)
Move base flags evaluation to its own function
No need to have iterator loop in the view layer evaluation, this only makes it more difficult to have base flags covered by the dependency graph. Other good thing is that we don't need to worry about whether base has been removed from the evaluated view layer or not. Reviewers: brecht Reviewed By: brecht Differential Revision: https://developer.blender.org/D4414
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc2
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc31
2 files changed, 21 insertions, 12 deletions
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;
}