[Bf-blender-cvs] [535adcdaa3c] blender2.8: Depsgraph: Iterates over ID Nodes instead of Bases

Dalai Felinto noreply at git.blender.org
Mon Nov 6 20:52:30 CET 2017


Commit: 535adcdaa3cc83c62abe211b0f645cf0a8237eba
Author: Dalai Felinto
Date:   Mon Nov 6 17:44:39 2017 -0200
Branches: blender2.8
https://developer.blender.org/rB535adcdaa3cc83c62abe211b0f645cf0a8237eba

Depsgraph: Iterates over ID Nodes instead of Bases

Although this works by itself, it should actually happen after:

"Reshuffle collections base flags evaluation, make it so object is gathering
its base flags from collections."

Meanwhile we have one single hacky function (deg_flush_base_flags_and_settings)
to be removed once the task above is tackled.

Reviewers: sergey

Differential Revision: https://developer.blender.org/D2899

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

M	source/blender/depsgraph/DEG_depsgraph_query.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_rig.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
M	source/blender/depsgraph/intern/depsgraph_build.cc
M	source/blender/depsgraph/intern/depsgraph_query.cc
M	source/blender/depsgraph/intern/depsgraph_types.h
M	source/blender/depsgraph/intern/nodes/deg_node.cc
M	source/blender/depsgraph/intern/nodes/deg_node.h

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

diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 1020d4e606e..59158ef0454 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -33,6 +33,8 @@
 #ifndef __DEG_DEPSGRAPH_QUERY_H__
 #define __DEG_DEPSGRAPH_QUERY_H__
 
+#include "BLI_ghash.h"
+
 #include "DEG_depsgraph.h"
 
 struct ID;
@@ -81,9 +83,6 @@ typedef struct DEGObjectsIteratorData {
 	struct Scene *scene;
 	struct EvaluationContext eval_ctx;
 
-	/* TODO(sergey): Base should never be a thing coming FROM depsgraph. */
-	struct Base *base;
-	int base_flag;
 	int flag;
 
 	/* **** Iteration over dupli-list. *** */
@@ -102,13 +101,16 @@ typedef struct DEGObjectsIteratorData {
 	 * other users of the iterator.
 	 */
 	struct Object temp_dupli_object;
+
+	/* **** ghash **** */
+	struct GHashIterator gh_iter;
+
 } DEGObjectsIteratorData;
 
 void DEG_objects_iterator_begin(struct BLI_Iterator *iter, DEGObjectsIteratorData *data);
 void DEG_objects_iterator_next(struct BLI_Iterator *iter);
 void DEG_objects_iterator_end(struct BLI_Iterator *iter);
 
-/* Temporary hacky solution waiting for cow depsgraph implementation. */
 #define DEG_OBJECT_ITER(graph_, instance_, flag_)                                 \
 	{                                                                             \
 		DEGObjectsIteratorData data_ = {                                          \
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index ec60d86ec82..464a1454749 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -128,7 +128,7 @@ static void modifier_walk(void *user_data,
 {
 	BuilderWalkUserData *data = (BuilderWalkUserData *)user_data;
 	if (*obpoin) {
-		data->builder->build_object(data->scene, *obpoin);
+		data->builder->build_object(data->scene, *obpoin, DEG_ID_LINKED_INDIRECTLY);
 	}
 }
 
@@ -141,7 +141,7 @@ void constraint_walk(bConstraint * /*con*/,
 	if (*idpoin) {
 		ID *id = *idpoin;
 		if (GS(id->name) == ID_OB) {
-			data->builder->build_object(data->scene, (Object *)id);
+			data->builder->build_object(data->scene, (Object *)id, DEG_ID_LINKED_INDIRECTLY);
 		}
 	}
 }
@@ -203,6 +203,11 @@ IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id, bool do_tag)
 	return id_node;
 }
 
+IDDepsNode *DepsgraphNodeBuilder::find_id_node(ID *id)
+{
+	return m_graph->find_id_node(id);
+}
+
 TimeSourceDepsNode *DepsgraphNodeBuilder::add_time_source()
 {
 	return m_graph->add_time_source();
@@ -392,27 +397,33 @@ void DepsgraphNodeBuilder::build_group(Scene *scene, Group *group)
 	group_id->tag |= LIB_TAG_DOIT;
 
 	LINKLIST_FOREACH (GroupObject *, go, &group->gobject) {
-		build_object(scene, go->ob);
+		build_object(scene, go->ob, DEG_ID_LINKED_INDIRECTLY);
 	}
 }
 
-void DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
+void DepsgraphNodeBuilder::build_object(Scene *scene,
+                                        Object *ob,
+                                        eDepsNode_LinkedState_Type linked_state)
 {
 	/* Skip rest of components if the ID node was already there. */
 	if (ob->id.tag & LIB_TAG_DOIT) {
+		IDDepsNode *id_node = find_id_node(&ob->id);
+		id_node->linked_state = std::max(id_node->linked_state, linked_state);
 		return;
 	}
 	ob->id.tag |= LIB_TAG_DOIT;
 
-	/* Create ID node for obejct and begin init. */
+	/* Create ID node for object and begin init. */
 	IDDepsNode *id_node = add_id_node(&ob->id);
+	id_node->linked_state = linked_state;
+
 	ob->customdata_mask = 0;
 
 	/* Standard components. */
 	build_object_transform(scene, ob);
 
 	if (ob->parent != NULL) {
-		build_object(scene, ob->parent);
+		build_object(scene, ob->parent, linked_state);
 	}
 	if (ob->modifiers.first != NULL) {
 		BuilderWalkUserData data;
@@ -502,7 +513,7 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
 	/* Object that this is a proxy for. */
 	if (ob->proxy) {
 		ob->proxy->proxy_from = ob;
-		build_object(scene, ob->proxy);
+		build_object(scene, ob->proxy, DEG_ID_LINKED_INDIRECTLY);
 	}
 
 	/* Object dupligroup. */
@@ -1003,13 +1014,13 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
 			 */
 			Curve *cu = (Curve *)obdata;
 			if (cu->bevobj != NULL) {
-				build_object(scene, cu->bevobj);
+				build_object(scene, cu->bevobj, DEG_ID_LINKED_INDIRECTLY);
 			}
 			if (cu->taperobj != NULL) {
-				build_object(scene, cu->taperobj);
+				build_object(scene, cu->taperobj, DEG_ID_LINKED_INDIRECTLY);
 			}
 			if (ob->type == OB_FONT && cu->textoncurve != NULL) {
-				build_object(scene, cu->textoncurve);
+				build_object(scene, cu->textoncurve, DEG_ID_LINKED_INDIRECTLY);
 			}
 			break;
 		}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index dbb126e2078..e7bf8c9998d 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -111,6 +111,7 @@ struct DepsgraphNodeBuilder {
 	void begin_build(Main *bmain);
 
 	IDDepsNode *add_id_node(ID *id, bool do_tag = true);
+	IDDepsNode *find_id_node(ID *id);
 	TimeSourceDepsNode *add_time_source();
 
 	ComponentDepsNode *add_component_node(ID *id,
@@ -156,9 +157,13 @@ struct DepsgraphNodeBuilder {
 	                                       const char *name = "",
 	                                       int name_tag = -1);
 
-	void build_scene(Main *bmain, Scene *scene);
+	void build_scene(Main *bmain,
+	                 Scene *scene,
+	                 eDepsNode_LinkedState_Type linked_state);
 	void build_group(Scene *scene, Group *group);
-	void build_object(Scene *scene, Object *ob);
+	void build_object(Scene *scene,
+	                  Object *ob,
+	                  eDepsNode_LinkedState_Type linked_state);
 	void build_object_transform(Scene *scene, Object *ob);
 	void build_object_constraints(Scene *scene, Object *ob);
 	void build_pose_constraints(Scene *scene, Object *ob, bPoseChannel *pchan);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
index 20263e1d751..dabebb9d4a9 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
@@ -304,7 +304,7 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *object)
 		/* Custom shape. */
 		/* NOTE: Custom shape datablock is already remapped to CoW version. */
 		if (pchan->custom != NULL) {
-			build_object(scene, get_orig_datablock(pchan->custom));
+			build_object(scene, get_orig_datablock(pchan->custom), DEG_ID_LINKED_INDIRECTLY);
 		}
 	}
 }
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
index a8acc88f7f3..097720f514a 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
@@ -65,7 +65,7 @@ extern "C" {
 
 namespace DEG {
 
-void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
+void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene, eDepsNode_LinkedState_Type linked_state)
 {
 	/* scene ID block */
 	add_id_node(&scene->id);
@@ -77,7 +77,7 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
 	// XXX: depending on how this goes, that scene itself could probably store its
 	//      own little partial depsgraph?
 	if (scene->set) {
-		build_scene(bmain, scene->set);
+		build_scene(bmain, scene->set, DEG_ID_LINKED_VIA_SET);
 	}
 
 	/* scene objects */
@@ -85,12 +85,12 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
 	for (SceneLayer *sl = (SceneLayer *)scene->render_layers.first; sl; sl = sl->next) {
 		for (Base *base = (Base *)sl->object_bases.first; base; base = base->next) {
 			/* object itself */
-			build_object(scene, base->object);
+			build_object(scene, base->object, linked_state);
 			base->object->select_color = select_color++;
 		}
 	}
 	if (scene->camera != NULL) {
-		build_object(scene, scene->camera);
+		build_object(scene, scene->camera, linked_state);
 	}
 
 	/* rigidbody */
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc
index d58f61a5077..e58a5707bc9 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cc
+++ b/source/blender/depsgraph/intern/depsgraph_build.cc
@@ -209,7 +209,7 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
 	/* 1) Generate all the nodes in the graph first */
 	DEG::DepsgraphNodeBuilder node_builder(bmain, deg_graph);
 	node_builder.begin_build(bmain);
-	node_builder.build_scene(bmain, scene);
+	node_builder.build_scene(bmain, scene, DEG::DEG_ID_LINKED_DIRECTLY);
 
 	/* 2) Hook up relationships between operations - to determine evaluation
 	 *    order.
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc
index 9e9a2c38993..156b98a6421 100644
--- a/source/blender/depsgraph/intern/depsgraph_query.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query.cc
@@ -33,6 +33,7 @@
 #include "MEM_guardedalloc.h"
 
 extern "C" {
+#include "BLI_ghash.h"
 #include "BLI_math.h"
 #include "BKE_anim.h"
 #include "BKE_idcode.h"
@@ -116,42 +117,57 @@ ID *DEG_get_evaluated_id(struct Depsgraph *depsgraph, ID *id)
 	return id_node->id_cow;
 }
 
-/* ************************ DAG ITERATORS ********************* */
+/* ************************ DEG ITERATORS ********************* */
 
-#define BASE_FLUSH_FLAGS (BASE_FROM_SET | BASE_FROMDUPLI)
-
-void DEG_objects_iterator_begin(BLI_Iterator *iter, DEGObjectsIteratorData *data)
+/**
+ * XXX (dfelinto/sergey) big hack, waiting for:
+ * "Reshuffle collections base flags evaluation, make it so object is gathering its base flags from collections."
+ *
+ * Returns false if object shouldn't be found (which should never happen in the final imple

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list