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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
