[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