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

Reply via email to