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
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-05-17 18:07:45 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-05-23 17:22:25 +0300
commit0ec6fa782b63a05e52df2d013ffbf547b178ffd1 (patch)
treee625e12716494085a1ef183d7ae32f0ff1563fc1 /source
parentb88f1d3491a7ce202e4b72ba6b05281147c316d3 (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
Diffstat (limited to 'source')
-rw-r--r--source/blender/depsgraph/CMakeLists.txt2
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc39
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc2
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc41
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc2
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc26
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;