diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-04-12 10:47:51 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-04-12 12:05:18 +0300 |
commit | 15698f99070f4d196dbfbac63d3634019c4d1ca9 (patch) | |
tree | 2776a25ee6f91cede1c197add7b0ee3afa8e9a7e /source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc | |
parent | 18c7575f93aa73f3a25290a97950d4eb6d37f94c (diff) |
Depsgraph: Avoid relations build time scene datablock expansion
Quite straightforward implementation, allows us to remove all the cherry-picking
update of specified scene/view layer/collection fields. Makes it possible to use
generic function to update scene.
The tricky part is that we need to know view layer pointer before the whole
evaluation starts. So we actually expand scene at initialization of evaluation.
context. This is still a bit of an exceptional case, but at least we still avoid
dangerous cherry-picking update.
Diffstat (limited to 'source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc | 36 |
1 files changed, 5 insertions, 31 deletions
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 8b770ab81a1..390619aeeaa 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 @@ -77,35 +77,13 @@ void DepsgraphNodeBuilder::build_view_layer( /* Setup currently building context. */ scene_ = scene; view_layer_ = view_layer; - /* Expand Scene Cow datablock to get proper pointers to bases. */ + /* Get pointer to a CoW version of scene ID. */ Scene *scene_cow; - ViewLayer *view_layer_cow; if (DEG_depsgraph_use_copy_on_write()) { - /* NOTE: We need to create ID nodes for all objects coming from bases, - * otherwise remapping will not replace objects with their CoW versions - * for CoW bases. - */ - LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) { - Object *object = base->object; - add_id_node(&object->id); - } - /* Create ID node for nested ID of nodetree as well, otherwise remapping - * will not work correct either. - */ - if (scene->nodetree != NULL) { - add_id_node(&scene->nodetree->id); - } - /* Make sure we've got ID node, so we can get pointer to CoW datablock. - */ - scene_cow = expand_cow_datablock(scene); - view_layer_cow = (ViewLayer *)BLI_findstring( - &scene_cow->view_layers, - view_layer->name, - offsetof(ViewLayer, name)); + scene_cow = get_cow_datablock(scene); } else { scene_cow = scene; - view_layer_cow = view_layer; } /* Scene objects. */ int select_color = 1; @@ -114,14 +92,10 @@ void DepsgraphNodeBuilder::build_view_layer( * tricks here iterating over the view layer. */ int base_index = 0; - for (Base *base_orig = (Base *)view_layer->object_bases.first, - *base_cow = (Base *)view_layer_cow->object_bases.first; - base_orig != NULL; - base_orig = base_orig->next, base_cow = base_cow->next) - { + LISTBASE_FOREACH(Base *, base, &view_layer->object_bases) { /* object itself */ - build_object(base_index, base_orig->object, linked_state); - base_orig->object->select_color = select_color++; + build_object(base_index, base->object, linked_state); + base->object->select_color = select_color++; ++base_index; } if (scene->camera != NULL) { |