[Bf-blender-cvs] [87066782e72] master: Depsgraph: Make it easier to control which bases being pulled into the graph

Sergey Sharybin noreply at git.blender.org
Wed Feb 27 14:57:02 CET 2019


Commit: 87066782e720257bef19450f0e3f7c739101b9b8
Author: Sergey Sharybin
Date:   Wed Feb 27 11:17:36 2019 +0100
Branches: master
https://developer.blender.org/rB87066782e720257bef19450f0e3f7c739101b9b8

Depsgraph: Make it easier to control which bases being pulled into the graph

Just de-duplicates some logic. Should be no functional changes.

===================================================================

M	source/blender/depsgraph/intern/builder/deg_builder.cc
M	source/blender/depsgraph/intern/builder/deg_builder.h
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.h
M	source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc

===================================================================

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);
 		}
 	}



More information about the Bf-blender-cvs mailing list