[Bf-blender-cvs] [7945419a30e] temp-group-collections: Integrate group PRE processing to depsgraph

Dalai Felinto noreply at git.blender.org
Wed Nov 1 18:14:48 CET 2017


Commit: 7945419a30ed5bcbf03b7dcee28b68b6bea139ce
Author: Dalai Felinto
Date:   Mon Oct 30 15:22:59 2017 -0200
Branches: temp-group-collections
https://developer.blender.org/rB7945419a30ed5bcbf03b7dcee28b68b6bea139ce

Integrate group PRE processing to depsgraph

Something to check with Sergey:
	What happens if the group is instanced AND is in a layer collection?
	In this case we need to test something different than LIB_TAG_DOIT for
	building groups and their relations.

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

M	source/blender/blenkernel/intern/layer.c
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_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_layer.cc
M	source/blender/depsgraph/intern/depsgraph_type_defines.cc
M	source/blender/depsgraph/intern/depsgraph_types.h

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

diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index f16449c891f..f908b76d1b3 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -2047,66 +2047,6 @@ static void idproperty_reset(IDProperty **props, IDProperty *props_ref)
 	}
 }
 
-#ifndef DEG_COLLECTION_GROUP
-/**
- * Initialize all the bases of all the groups.
- *
- * This is temporary, and not needed if we managed to get depsgraph to call
- * BKE_layer_eval_layer_collection_pre for all the groups.
- *
- * \param lb: ListBase of LayerCollection elements.
- * \param gs: GSet of previously evaluated groups.
- */
-static void layer_eval_layer_collections_pre_doit(Scene *scene, ListBase *lb, GSet *gs)
-{
-	LayerCollection *layer_collection;
-	for (layer_collection = lb->first; layer_collection; layer_collection = layer_collection->next) {
-		SceneCollection *scene_collection = layer_collection->scene_collection;
-
-		switch (scene_collection->type) {
-			case COLLECTION_TYPE_GROUP:
-			{
-				Group *group = scene_collection->group;
-				if (group && !BLI_gset_haskey(gs, group)){
-					BLI_gset_add(gs, group);
-					FOREACH_GROUP_BASE(group, base)
-					{
-						base->flag &= ~(BASE_VISIBLED | BASE_SELECTABLED);
-						idproperty_reset(&base->collection_properties, scene->collection_properties);
-					}
-					FOREACH_GROUP_BASE_END
-				}
-				break;
-			}
-			case COLLECTION_TYPE_GROUP_INTERNAL:
-			case COLLECTION_TYPE_NONE:
-				/* Continue recursively. */
-				layer_eval_layer_collections_pre_doit(scene, &layer_collection->layer_collections, gs);
-				break;
-			default:
-				BLI_assert(!"Collection type not fully implemented.");
-				break;
-		}
-	}
-}
-
-/**
- * Temporary function to initialize group collections
- *
- * This should be handled by depsgraph node/relations instead so BKE_layer_eval_layer_collection_pre
- * is called once for each SceneLayer, and once for each Group of this SceneLayer
- *
- * Note: Two SceneLayers with the same Group Collection may have different evaluated results for the
- * group elements. Even though the original data (group->scene_layer, ...) should remain unchanged.
- */
-static void layer_eval_layer_collections_pre(Scene *scene, SceneLayer *scene_layer)
-{
-	GSet *gs = BLI_gset_ptr_new(__func__);
-	layer_eval_layer_collections_pre_doit(scene, &scene_layer->layer_collections, gs);
-	BLI_gset_free(gs, NULL);
-}
-#endif
-
 void BKE_layer_eval_layer_collection_pre(const struct EvaluationContext *UNUSED(eval_ctx),
                                          ID *id, SceneLayer *scene_layer)
 {
@@ -2115,10 +2055,6 @@ void BKE_layer_eval_layer_collection_pre(const struct EvaluationContext *UNUSED(
 	Scene *scene = (GS(id->name) == ID_SCE ? (Scene *)id : NULL);
 	BLI_assert(scene || (GS(id->name) == ID_GR));
 
-#ifndef DEG_COLLECTION_GROUP
-	layer_eval_layer_collections_pre(scene, scene_layer);
-#endif
-
 	for (Base *base = scene_layer->object_bases.first; base != NULL; base = base->next) {
 		base->flag &= ~(BASE_VISIBLED | BASE_SELECTABLED);
 		idproperty_reset(&base->collection_properties, scene ? scene->collection_properties : NULL);
@@ -2134,7 +2070,7 @@ void BKE_layer_eval_layer_collection_pre(const struct EvaluationContext *UNUSED(
 	scene_layer->flag |= SCENE_LAYER_ENGINE_DIRTY;
 }
 
-void BKE_layer_eval_layer_collection(const struct EvaluationContext *eval_ctx,
+void BKE_layer_eval_layer_collection(const struct EvaluationContext *UNUSED(eval_ctx),
                                      LayerCollection *layer_collection,
                                      LayerCollection *parent_layer_collection)
 {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 4fe9ebab23a..355961929ac 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -395,14 +395,28 @@ void DepsgraphNodeBuilder::build_group(Scene *scene, Group *group)
 	LINKLIST_FOREACH (Base *, base, &group->scene_layer->object_bases) {
 		build_object(scene, base->object);
 	}
+}
+
+void DepsgraphNodeBuilder::build_group(Scene *scene, Group *group, LayerCollectionState *state)
+{
+	/* XXX What happens if the group is instanced AND is in a layer collection?
+	 * We need to test something different than LIB_TAG_DOIT here (dfelinto). */
+	ID *group_id = &group->id;
+	if (group_id->tag & LIB_TAG_DOIT) {
+		return;
+	}
+	group_id->tag |= LIB_TAG_DOIT;
+
+	LINKLIST_FOREACH (Base *, base, &group->scene_layer->object_bases) {
+		build_object(scene, base->object);
+	}
 
-#ifdef DEG_COLLECTION_GROUP
 	ComponentDepsNode *comp = add_component_node(&group->id, DEG_NODE_TYPE_LAYER_COLLECTIONS);
 	add_operation_node(comp,
 	                   function_bind(BKE_layer_eval_layer_collection_pre, _1, &group->id, group->scene_layer),
-	                   DEG_OPCODE_SCENE_LAYER_INIT,
-	                   group->id.name);
-#endif
+	                   DEG_OPCODE_SCENE_LAYER_GROUP,
+	                   group->id.name + 2);
+	++state->index;
 }
 
 void DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index dbb126e2078..8e7138f6be0 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -156,8 +156,14 @@ struct DepsgraphNodeBuilder {
 	                                       const char *name = "",
 	                                       int name_tag = -1);
 
+	struct LayerCollectionState {
+		int index;
+		LayerCollection *parent;
+	};
+
 	void build_scene(Main *bmain, Scene *scene);
 	void build_group(Scene *scene, Group *group);
+	void build_group(Scene *scene, Group *group, LayerCollectionState *state);
 	void build_object(Scene *scene, Object *ob);
 	void build_object_transform(Scene *scene, Object *ob);
 	void build_object_constraints(Scene *scene, Object *ob);
@@ -194,11 +200,6 @@ struct DepsgraphNodeBuilder {
 	void build_mask(Mask *mask);
 	void build_movieclip(MovieClip *clip);
 	void build_lightprobe(Object *object);
-
-	struct LayerCollectionState {
-		int index;
-		LayerCollection *parent;
-	};
 	void build_layer_collection(Scene *scene,
 	                            LayerCollection *layer_collection,
 	                            LayerCollectionState *state);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
index c9c73449fae..56f6e36865b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
@@ -86,7 +86,7 @@ void DepsgraphNodeBuilder::build_layer_collection(Scene *scene,
 		{
 			Group *group = scene_collection->group;
 			if (group != NULL) {
-				build_group(scene, scene_collection->group);
+				build_group(scene, scene_collection->group, state);
 				/* Recurs into internal group layer collections. */
 				state->parent = layer_collection;
 				build_layer_collection(scene,
@@ -98,16 +98,15 @@ void DepsgraphNodeBuilder::build_layer_collection(Scene *scene,
 		}
 		case COLLECTION_TYPE_GROUP_INTERNAL:
 		case COLLECTION_TYPE_NONE:
+			/* Recurs into nested layer collections. */
+			state->parent = layer_collection;
+			build_layer_collections(scene, &layer_collection->layer_collections, state);
+			state->parent = parent;
 			break;
 		default:
 			BLI_assert(!"Collection type not fully implemented!");
 			break;
 	}
-
-	/* Recurs into nested layer collections. */
-	state->parent = layer_collection;
-	build_layer_collections(scene, &layer_collection->layer_collections, state);
-	state->parent = parent;
 }
 
 void DepsgraphNodeBuilder::build_layer_collections(Scene *scene,
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 81d10c0d7ed..ec92a7dfa7b 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -410,8 +410,11 @@ void DepsgraphRelationBuilder::build_group(Main *bmain,
 
 void DepsgraphRelationBuilder::build_group(Main *bmain,
                                            Scene *scene,
-                                           Group *group)
+                                           Group *group,
+                                           LayerCollectionState *state)
 {
+	/* XXX What happens if the group is instanced AND is in a layer collection?
+	 * We need to test something different than LIB_TAG_DOIT here (dfelinto). */
 	if (group->id.tag & LIB_TAG_DOIT) {
 		return;
 	}
@@ -420,6 +423,15 @@ void DepsgraphRelationBuilder::build_group(Main *bmain,
 	LINKLIST_FOREACH (Base *, base, &group->scene_layer->object_bases) {
 		build_object(bmain, scene, base->object);
 	}
+
+	OperationKey layer_key(&group->id,
+	                       DEG_NODE_TYPE_LAYER_COLLECTIONS,
+	                       DEG_OPCODE_SCENE_LAYER_GROUP,
+	                       group->id.name + 2);
+	add_relation(state->prev_key, layer_key, "Layer collection order");
+
+	++state->index;
+	state->prev_key = layer_key;
 }
 
 void DepsgraphRelationBuilder::build_object(Main *bmain, Scene *scene, Object *ob)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
index bab51c36ba2..407be16e8b0 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h
@@ -186,9 +186,16 @@ struct DepsgraphRelationBuilder
 	                              const DepsNodeHandle *handle,
 	                              const char *description);
 
+	struct LayerCollectionState {
+		int index;
+		OperationKey init_key;
+		OperationKey done_key;
+		OperationKey prev_key;
+	};
+
 	void build_scene(Main *bmain, Scene *scene);
 	void build_group(Main *bmain, Scene *scene, Object *object, Group *group);
-	void build_gro

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list