[Bf-blender-cvs] [82c0a541685] blender2.8: Depsgraph: Use dedicated function for group evaluation

Sergey Sharybin noreply at git.blender.org
Fri Dec 8 15:06:25 CET 2017


Commit: 82c0a5416855b3dc762d3d03bdae637cd7f8dd83
Author: Sergey Sharybin
Date:   Fri Dec 8 14:45:15 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB82c0a5416855b3dc762d3d03bdae637cd7f8dd83

Depsgraph: Use dedicated function for group evaluation

It is still based on generic collection evaluation, but the idea is to avoid
having view_layer pointer passed from group to it's evaluation function.

This is essential for copy-on-write, where we need to pass view_layer pointer
from a copied datablock, but that copy is not yet available at construction
time. Also, this is NOT the case where we want to expand datablock at a
construction time, just to keep our life easier.

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

M	source/blender/blenkernel/BKE_group.h
M	source/blender/blenkernel/intern/group.c
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc

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

diff --git a/source/blender/blenkernel/BKE_group.h b/source/blender/blenkernel/BKE_group.h
index ac436876dc4..b522ad65fe7 100644
--- a/source/blender/blenkernel/BKE_group.h
+++ b/source/blender/blenkernel/BKE_group.h
@@ -55,6 +55,13 @@ bool          BKE_group_is_animated(struct Group *group, struct Object *parent);
 
 void          BKE_group_handle_recalc_and_update(const struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *parent, struct Group *group);
 
+/* Dependency graph evaluation. */
+
+void BKE_group_eval_view_layers(const struct EvaluationContext *eval_ctx,
+                                struct Group *group);
+
+/* Helper macros. */
+
 #define FOREACH_GROUP_BASE(_group, _base)                         \
 	for (Base *_base = (Base *)(_group)->view_layer->object_bases.first; \
 	     _base;                                                   \
diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c
index 1bc2e951fe7..fbd4f07a93f 100644
--- a/source/blender/blenkernel/intern/group.c
+++ b/source/blender/blenkernel/intern/group.c
@@ -55,6 +55,8 @@
 #include "BKE_object.h"
 #include "BKE_scene.h"
 
+#define DEBUG_PRINT if (G.debug & G_DEBUG_DEPSGRAPH) printf
+
 /** Free (or release) any data used by this group (does not free the group itself). */
 void BKE_group_free(Group *group)
 {
@@ -379,3 +381,36 @@ void BKE_group_handle_recalc_and_update(const struct EvaluationContext *eval_ctx
 		FOREACH_GROUP_OBJECT_END
 	}
 }
+
+/* ******** Dependency graph evaluation ******** */
+
+static void group_eval_layer_collections(
+        const struct EvaluationContext *eval_ctx,
+        Group *group,
+        ListBase *layer_collections,
+        LayerCollection *parent_layer_collection)
+{
+	LINKLIST_FOREACH (LayerCollection *, layer_collection, layer_collections) {
+		/* Evaluate layer collection itself. */
+		BKE_layer_eval_layer_collection(eval_ctx,
+		                                layer_collection,
+		                                parent_layer_collection);
+		/* Evaluate nested collections. */
+		group_eval_layer_collections(eval_ctx,
+		                             group,
+		                             &layer_collection->layer_collections,
+		                             layer_collection);
+	}
+}
+
+void BKE_group_eval_view_layers(const struct EvaluationContext *eval_ctx,
+                                Group *group)
+{
+	DEBUG_PRINT("%s on %s (%p)\n", __func__, group->id.name, group);
+	BKE_layer_eval_layer_collection_pre(eval_ctx, &group->id, group->view_layer);
+	group_eval_layer_collections(eval_ctx,
+	                             group,
+	                             &group->view_layer->layer_collections,
+	                             NULL);
+	BKE_layer_eval_layer_collection_post(eval_ctx, group->view_layer);
+}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 342ce8e862b..17831fc1ccd 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -422,16 +422,27 @@ void DepsgraphNodeBuilder::end_build()
 void DepsgraphNodeBuilder::build_group(Group *group)
 {
 	ID *group_id = &group->id;
+	Group *group_cow = get_cow_datablock(group);
 	if (group_id->tag & LIB_TAG_DOIT) {
 		return;
 	}
 	group_id->tag |= LIB_TAG_DOIT;
-
+	/* Build group objects. */
 	LINKLIST_FOREACH(Base *, base, &group->view_layer->object_bases) {
 		build_object(NULL, base->object, DEG_ID_LINKED_INDIRECTLY);
 	}
-
-	build_view_layer_collections(&group->id, group->view_layer);
+	/* Operation to evaluate the whole view layer.
+	 *
+	 * NOTE: We re-use DONE opcode even though the function does everything.
+	 * This way we wouldn't need to worry about possible relations from DONE,
+	 * regardless whether it's a group or scene or something else.
+	 */
+	add_operation_node(group_id,
+	                   DEG_NODE_TYPE_LAYER_COLLECTIONS,
+	                   function_bind(BKE_group_eval_view_layers,
+	                                 _1,
+	                                 group_cow),
+	                   DEG_OPCODE_VIEW_LAYER_DONE);
 }
 
 void DepsgraphNodeBuilder::build_object(Base *base,
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 890e6c050d0..2caa0d4ed5a 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -429,8 +429,6 @@ void DepsgraphRelationBuilder::build_group(Object *object, Group *group)
 		LINKLIST_FOREACH(Base *, base, &group->view_layer->object_bases) {
 			build_object(NULL, base->object);
 		}
-
-		build_view_layer_collections(&group->id, group->view_layer);
 		group_id->tag |= LIB_TAG_DOIT;
 	}



More information about the Bf-blender-cvs mailing list