diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-05-17 18:07:45 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-05-23 17:22:25 +0300 |
commit | 0ec6fa782b63a05e52df2d013ffbf547b178ffd1 (patch) | |
tree | e625e12716494085a1ef183d7ae32f0ff1563fc1 | |
parent | b88f1d3491a7ce202e4b72ba6b05281147c316d3 (diff) |
Depsgraph: Allow building scene properties
This is used by driers and this is a first step towards support of
scenes used for only compositor or sequencer.
Fixes T61014: Assert adding a driver that uses a single property of a scene ID
10 files changed, 118 insertions, 6 deletions
diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt index ba6b3b32d60..c3099c9486d 100644 --- a/source/blender/depsgraph/CMakeLists.txt +++ b/source/blender/depsgraph/CMakeLists.txt @@ -42,11 +42,13 @@ set(SRC intern/builder/deg_builder_map.cc intern/builder/deg_builder_nodes.cc intern/builder/deg_builder_nodes_rig.cc + intern/builder/deg_builder_nodes_scene.cc intern/builder/deg_builder_nodes_view_layer.cc intern/builder/deg_builder_pchanmap.cc intern/builder/deg_builder_relations.cc intern/builder/deg_builder_relations_keys.cc intern/builder/deg_builder_relations_rig.cc + intern/builder/deg_builder_relations_scene.cc intern/builder/deg_builder_relations_view_layer.cc intern/builder/deg_builder_rna.cc intern/builder/deg_builder_transitive.cc diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 3e93b76d508..10bcfcf04d7 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -453,6 +453,9 @@ void DepsgraphNodeBuilder::build_id(ID *id) case ID_CF: build_cachefile((CacheFile *)id); break; + case ID_SCE: + build_scene_parameters((Scene *)id); + break; default: fprintf(stderr, "Unhandled ID %s\n", id->name); BLI_assert(!"Should never happen"); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 41314380b23..8b9578915a1 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -152,6 +152,9 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { ID *id, NodeType comp_type, OperationCode opcode, const char *name = "", int name_tag = -1); void build_id(ID *id); + + void build_scene_parameters(Scene *scene); + void build_layer_collections(ListBase *lb); void build_view_layer(Scene *scene, ViewLayer *view_layer, diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc new file mode 100644 index 00000000000..5fd1b4e8332 --- /dev/null +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc @@ -0,0 +1,39 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2013 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup depsgraph + */ + +#include "intern/builder/deg_builder_nodes.h" + +#include "DNA_scene_types.h" + +namespace DEG { + +void DepsgraphNodeBuilder::build_scene_parameters(Scene *scene) +{ + if (built_map_.checkIsBuiltAndTag(scene, BuilderMap::TAG_PARAMETERS)) { + return; + } + add_operation_node(&scene->id, NodeType::PARAMETERS, OperationCode::SCENE_EVAL); + add_operation_node(&scene->id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EVAL); +} + +} // namespace DEG 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 b898b3d3519..675933a38e3 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 @@ -157,7 +157,7 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, OperationCode::VIEW_LAYER_EVAL, function_bind(BKE_layer_eval_view_layer_indexed, _1, scene_cow, view_layer_index_)); /* Parameters evaluation for scene relations mainly. */ - add_operation_node(&scene->id, NodeType::PARAMETERS, OperationCode::SCENE_EVAL); + build_scene_parameters(scene); /* Build all set scenes. */ if (scene->set != NULL) { ViewLayer *set_view_layer = BKE_view_layer_default_render(scene->set); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index c8821c3fa0b..10e81faf333 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -497,6 +497,9 @@ void DepsgraphRelationBuilder::build_id(ID *id) case ID_CF: build_cachefile((CacheFile *)id); break; + case ID_SCE: + build_scene_parameters((Scene *)id); + break; default: fprintf(stderr, "Unhandled ID %s\n", id->name); BLI_assert(!"Should never happen"); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 1cf0b48128f..c97c8a4b375 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -194,6 +194,9 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder { void add_special_eval_flag(ID *object, uint32_t flag); void build_id(ID *id); + + void build_scene_parameters(Scene *scene); + void build_layer_collections(ListBase *lb); void build_view_layer(Scene *scene, ViewLayer *view_layer); void build_collection(LayerCollection *from_layer_collection, diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc new file mode 100644 index 00000000000..d8672d35ddb --- /dev/null +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc @@ -0,0 +1,41 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2013 Blender Foundation. + * All rights reserved. + */ + +/** \file + * \ingroup depsgraph + */ + +#include "intern/builder/deg_builder_relations.h" + +#include "DNA_scene_types.h" + +namespace DEG { + +void DepsgraphRelationBuilder::build_scene_parameters(Scene *scene) +{ + if (built_map_.checkIsBuiltAndTag(scene, BuilderMap::TAG_PARAMETERS)) { + return; + } + OperationKey parameters_eval_key( + &scene->id, NodeType::PARAMETERS, OperationCode::PARAMETERS_EVAL); + OperationKey scene_eval_key(&scene->id, NodeType::PARAMETERS, OperationCode::SCENE_EVAL); + add_relation(parameters_eval_key, scene_eval_key, "Parameters -> Scene Eval"); +} + +} // namespace DEG diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc index b5a926ad597..a744ecc0f50 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc @@ -128,6 +128,8 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, ViewLayer *view_la build_collection(NULL, NULL, fls->group); } } + /* Scene parameters. */ + build_scene_parameters(scene); /* Build all set scenes. */ if (scene->set != NULL) { ViewLayer *set_view_layer = BKE_view_layer_default_render(scene->set); 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 2a76d5cd362..98c50bf6fdf 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 @@ -340,7 +340,15 @@ void scene_remove_unused_view_layers(const Depsgraph *depsgraph, const IDNode *id_node, Scene *scene_cow) { - const ViewLayer *view_layer_input = get_original_view_layer(depsgraph, id_node); + const ViewLayer *view_layer_input; + /* Indirectly linked scenes means it's not an input scene and not a set scene, and is pulled via + * some driver. Such scenes should not have view layers after copy. */ + if (id_node->linked_state == DEG_ID_LINKED_INDIRECTLY) { + view_layer_input = NULL; + } + else { + view_layer_input = get_original_view_layer(depsgraph, id_node); + } ViewLayer *view_layer_eval = NULL; /* Find evaluated view layer. At the same time we free memory used by * all other of the view layers. */ @@ -349,16 +357,17 @@ void scene_remove_unused_view_layers(const Depsgraph *depsgraph, view_layer_cow != NULL; view_layer_cow = view_layer_next) { view_layer_next = view_layer_cow->next; - if (STREQ(view_layer_input->name, view_layer_cow->name)) { + if (view_layer_input != NULL && STREQ(view_layer_input->name, view_layer_cow->name)) { view_layer_eval = view_layer_cow; } else { BKE_view_layer_free_ex(view_layer_cow, false); } } - BLI_assert(view_layer_eval != NULL); - /* Make evaluated view layer the only one in the evaluated scene. */ - view_layer_eval->prev = view_layer_eval->next = NULL; + /* Make evaluated view layer the only one in the evaluated scene (if it exists). */ + if (view_layer_eval != NULL) { + view_layer_eval->prev = view_layer_eval->next = NULL; + } scene_cow->view_layers.first = view_layer_eval; scene_cow->view_layers.last = view_layer_eval; } @@ -367,6 +376,9 @@ void scene_remove_unused_view_layers(const Depsgraph *depsgraph, * objects. */ void view_layer_remove_disabled_bases(const Depsgraph *depsgraph, ViewLayer *view_layer) { + if (view_layer == NULL) { + return; + } ListBase enabled_bases = {NULL, NULL}; LISTBASE_FOREACH_MUTABLE (Base *, base, &view_layer->object_bases) { /* TODO(sergey): Would be cool to optimize this somehow, or make it so @@ -397,6 +409,10 @@ void view_layer_remove_disabled_bases(const Depsgraph *depsgraph, ViewLayer *vie void view_layer_update_orig_base_pointers(const ViewLayer *view_layer_orig, ViewLayer *view_layer_eval) { + if (view_layer_orig == NULL || view_layer_eval == NULL) { + /* Happens when scene is only used for parameters or compositor/sequencer. */ + return; + } 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; |