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-27 13:17:36 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-02-27 16:50:42 +0300
commit87066782e720257bef19450f0e3f7c739101b9b8 (patch)
tree40240cc52841fa80b3b33ff7bb0cb5ca513d7649 /source/blender/depsgraph
parent05dc3d43caf5a5153a8bd1e69d5f77b0e019aa3d (diff)
Depsgraph: Make it easier to control which bases being pulled into the graph
Just de-duplicates some logic. Should be no functional changes.
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder.cc25
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder.h13
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.cc3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes.h13
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc15
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc3
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.h8
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc5
8 files changed, 55 insertions, 30 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc
index d137b4a199d..5520282db27 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder.cc
@@ -24,8 +24,9 @@
#include "intern/builder/deg_builder.h"
#include "DNA_anim_types.h"
-#include "DNA_object_types.h"
+#include "DNA_layer_types.h"
#include "DNA_ID.h"
+#include "DNA_object_types.h"
#include "BLI_utildefines.h"
#include "BLI_ghash.h"
@@ -48,6 +49,28 @@ extern "C" {
namespace DEG {
+/*******************************************************************************
+ * Base class for builders.
+ */
+
+DepsgraphBuilder::DepsgraphBuilder(Main *bmain, Depsgraph *graph)
+ : bmain_(bmain),
+ graph_(graph) {
+}
+
+bool DepsgraphBuilder::needPullBaseIntoGraph(struct Base *base) {
+ const int base_flag = (graph_->mode == DAG_EVAL_VIEWPORT) ?
+ BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER;
+ if (base->flag & base_flag) {
+ return true;
+ }
+ return false;
+}
+
+/*******************************************************************************
+ * Builder finalizer.
+ */
+
namespace {
void deg_graph_build_flush_visibility(Depsgraph *graph)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder.h b/source/blender/depsgraph/intern/builder/deg_builder.h
index a8f3318d9e2..e64ae98c6ce 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder.h
@@ -23,12 +23,25 @@
#pragma once
+struct Base;
struct Main;
namespace DEG {
struct Depsgraph;
+class DepsgraphBuilder {
+public:
+ bool needPullBaseIntoGraph(struct Base *base);
+
+protected:
+ DepsgraphBuilder(Main *bmain, Depsgraph *graph);
+
+ /* State which never changes, same for the whole builder time. */
+ Main *bmain_;
+ Depsgraph *graph_;
+};
+
void deg_graph_build_finalize(struct Main *bmain, struct Depsgraph *graph);
} // namespace DEG
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index d0723ea0ded..463f4fa0935 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -131,8 +131,7 @@ void free_copy_on_write_datablock(void *id_info_v)
/* **** General purpose functions **** */
DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph)
- : bmain_(bmain),
- graph_(graph),
+ : DepsgraphBuilder(bmain, graph),
scene_(NULL),
view_layer_(NULL),
view_layer_index_(-1),
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 88d5dee535a..0bf4c13d515 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -23,14 +23,14 @@
#pragma once
+#include "intern/builder/deg_builder.h"
#include "intern/builder/deg_builder_map.h"
#include "intern/depsgraph_type.h"
-
-#include "DEG_depsgraph.h"
-
#include "intern/node/deg_node_id.h"
#include "intern/node/deg_node_operation.h"
+#include "DEG_depsgraph.h"
+
struct Base;
struct CacheFile;
struct Camera;
@@ -74,7 +74,8 @@ struct Node;
struct OperationNode;
struct TimeSourceNode;
-struct DepsgraphNodeBuilder {
+class DepsgraphNodeBuilder : public DepsgraphBuilder {
+public:
DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph);
~DepsgraphNodeBuilder();
@@ -259,10 +260,6 @@ protected:
bool is_reference,
void *user_data);
- /* State which never changes, same for the whole builder time. */
- Main *bmain_;
- Depsgraph *graph_;
-
/* State which demotes currently built entities. */
Scene *scene_;
ViewLayer *view_layer_;
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 411199fe9be..db1cfa6b83f 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
@@ -97,16 +97,15 @@ void DepsgraphNodeBuilder::build_view_layer(
* but object is expected to be an original one. Hence we go into some
* tricks here iterating over the view layer. */
int base_index = 0;
- const int base_flag = (graph_->mode == DAG_EVAL_VIEWPORT) ?
- BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER;
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
/* object itself */
- const bool is_object_visible = (base->flag & base_flag);
- if (is_object_visible) {
- build_object(base_index,
- base->object,
- linked_state,
- is_object_visible);
+ if (needPullBaseIntoGraph(base)) {
+ /* NOTE: We consider object visible even if it's currently
+ * restricted by the base/restriction flags. Otherwise its drivers
+ * will never be evaluated.
+ *
+ * TODO(sergey): Need to go more granular on visibility checks. */
+ build_object(base_index, base->object, linked_state, true);
++base_index;
}
base->object->select_id = select_id++;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 99334c81db5..9aab90f88cf 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -212,8 +212,7 @@ static bool bone_has_segments(Object *object, const char *bone_name)
DepsgraphRelationBuilder::DepsgraphRelationBuilder(Main *bmain,
Depsgraph *graph)
- : bmain_(bmain),
- graph_(graph),
+ : DepsgraphBuilder(bmain, graph),
scene_(NULL),
rna_node_query_(graph)
{
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index 190fcb7aedf..fb76b469572 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -36,6 +36,7 @@
#include "BLI_utildefines.h"
#include "BLI_string.h"
+#include "intern/builder/deg_builder.h"
#include "intern/builder/deg_builder_map.h"
#include "intern/builder/deg_builder_rna.h"
#include "intern/depsgraph.h"
@@ -172,8 +173,9 @@ struct RNAPathKey
RNAPointerSource source;
};
-struct DepsgraphRelationBuilder
+class DepsgraphRelationBuilder : public DepsgraphBuilder
{
+public:
DepsgraphRelationBuilder(Main *bmain, Depsgraph *graph);
void begin_build();
@@ -352,10 +354,6 @@ private:
bool is_reference,
void *user_data);
- /* State which never changes, same for the whole builder time. */
- Main *bmain_;
- Depsgraph *graph_;
-
/* State which demotes currently built entities. */
Scene *scene_;
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 31c514e972e..54a72d3b8d4 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
@@ -83,11 +83,8 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, ViewLayer *view_la
/* NOTE: Nodes builder requires us to pass CoW base because it's being
* passed to the evaluation functions. During relations builder we only
* do NULL-pointer check of the base, so it's fine to pass original one. */
- const int base_flag = (graph_->mode == DAG_EVAL_VIEWPORT) ?
- BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER;
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
- const bool is_object_visible = (base->flag & base_flag);
- if (is_object_visible) {
+ if (needPullBaseIntoGraph(base)) {
build_object(base, base->object);
}
}