diff options
Diffstat (limited to 'source')
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); } } |