Commit: d33f458e2c04cb6a236ea1a128223b715382550a
Author: Sergey Sharybin
Date:   Wed Nov 12 13:50:05 2014 +0100
Branches: depsgraph_refactor
https://developer.blender.org/rBd33f458e2c04cb6a236ea1a128223b715382550a

Depsgraph: Cleanup of time source relation a bit

This way it is now possible to add a relation between TimeSourceKey and
OperationKey.

Some areas were trying to add such a relation already, but it just didn't
work.

Not totally happy with the implementation, but think the patch is good
enough for the first cleanup iteration.

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

M       source/blender/depsgraph/intern/depsgraph.cpp
M       source/blender/depsgraph/intern/depsgraph.h
M       source/blender/depsgraph/intern/depsgraph_build.h
M       source/blender/depsgraph/intern/depsgraph_build_relations.cpp
M       source/blender/depsgraph/intern/depsgraph_debug.cpp
M       source/blender/depsgraph/intern/depsnode.cpp
M       source/blender/depsgraph/intern/depsnode.h

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

diff --git a/source/blender/depsgraph/intern/depsgraph.cpp 
b/source/blender/depsgraph/intern/depsgraph.cpp
index a66c21c..3e6b1a8 100644
--- a/source/blender/depsgraph/intern/depsgraph.cpp
+++ b/source/blender/depsgraph/intern/depsgraph.cpp
@@ -253,13 +253,6 @@ DepsRelation 
*Depsgraph::add_new_relation(OperationDepsNode *from, OperationDeps
        return rel;
 }
 
-/* Add new dependency between outer ID node and time. */
-void Depsgraph::add_new_time_relation(IDDepsNode *from)
-{
-       TimeSourceDepsNode *time_src = find_time_source();
-       time_src->add_time_dependency(from);
-}
-
 /* Sort nodes to determine evaluation order for operation nodes
  * where dependency relationships won't get violated.
  */
diff --git a/source/blender/depsgraph/intern/depsgraph.h 
b/source/blender/depsgraph/intern/depsgraph.h
index 715086e..727ec0b 100644
--- a/source/blender/depsgraph/intern/depsgraph.h
+++ b/source/blender/depsgraph/intern/depsgraph.h
@@ -142,9 +142,6 @@ struct Depsgraph {
                                       eDepsRelation_Type type, 
                                       const string &description);
 
-       /* Add new dependency between outer ID node and time. */
-       void add_new_time_relation(IDDepsNode *from);
-
        /* Sort nodes to determine evaluation order for operation nodes
         * where dependency relationships won't get violated.
         */
diff --git a/source/blender/depsgraph/intern/depsgraph_build.h 
b/source/blender/depsgraph/intern/depsgraph_build.h
index 3049d2f..19843f4 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.h
+++ b/source/blender/depsgraph/intern/depsgraph_build.h
@@ -211,7 +211,11 @@ struct DepsgraphRelationBuilder {
        template <typename KeyFrom, typename KeyTo>
        void add_relation(const KeyFrom &key_from, const KeyTo &key_to,
                          eDepsRelation_Type type, const string &description);
-       
+
+       template <typename KeyTo>
+       void add_relation(const TimeSourceKey &key_from, const KeyTo &key_to,
+                         eDepsRelation_Type type, const string &description);
+
        template <typename KeyType>
        void add_node_handle_relation(const KeyType &key_from, const 
DepsNodeHandle *handle,
                                      eDepsRelation_Type type, const string 
&description);
@@ -310,6 +314,19 @@ void DepsgraphRelationBuilder::add_relation(const KeyFrom 
&key_from, const KeyTo
        }
 }
 
+template <typename KeyTo>
+void DepsgraphRelationBuilder::add_relation(const TimeSourceKey &key_from, 
const KeyTo &key_to,
+                                            eDepsRelation_Type type, const 
string &description)
+{
+       BLI_assert(type == DEPSREL_TYPE_TIME);
+       TimeSourceDepsNode *time_from = find_node(key_from);
+       OperationDepsNode *op_to = get_entry_operation(find_node(key_to));
+       if (time_from && op_to) {
+               /* TODO(sergey): Store description as well. */
+               time_from->add_new_relation(op_to);
+       }
+}
+
 template <typename KeyType>
 void DepsgraphRelationBuilder::add_node_handle_relation(const KeyType 
&key_from, const DepsNodeHandle *handle,
                                                         eDepsRelation_Type 
type, const string &description)
diff --git a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp 
b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
index 1644995..07523f9 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
@@ -102,32 +102,28 @@ extern "C" {
 #include "stubs.h" // XXX: REMOVE THIS INCLUDE ONCE DEPSGRAPH REFACTOR PROJECT 
IS DONE!!!
 
 /* TODO(sergey): This is a stupid copy of function from depsgraph.c/ */
-static bool object_modifiers_use_time(Object *ob)
+static bool modifier_check_depends_on_time(Object *ob, ModifierData *md)
 {
-       ModifierData *md;
-
-       /* check if a modifier in modifier stack needs time input */
-       for (md = (ModifierData *)ob-> modifiers.first;
-            md != NULL;
-            md = (ModifierData *)md->next)
-       {
-               if (modifier_dependsOnTime(md)) {
-                       return true;
-               }
+       if (modifier_dependsOnTime(md)) {
+               return true;
        }
 
-       /* check whether any modifiers are animated */
+       /* Check whether modifier is animated. */
        if (ob->adt) {
                AnimData *adt = ob->adt;
                FCurve *fcu;
 
+               char pattern[MAX_NAME + 10];
+               /* TODO(sergey): Escape modifier name. */
+               BLI_snprintf(pattern, sizeof(pattern), "modifiers[%s", 
md->name);
+
                /* action - check for F-Curves with paths containing 
'modifiers[' */
                if (adt->action) {
                        for (fcu = (FCurve *)adt->action->curves.first;
                             fcu != NULL;
                             fcu = (FCurve *)fcu->next)
                        {
-                               if (fcu->rna_path && strstr(fcu->rna_path, 
"modifiers["))
+                               if (fcu->rna_path && strstr(fcu->rna_path, 
pattern))
                                        return true;
                        }
                }
@@ -142,7 +138,7 @@ static bool object_modifiers_use_time(Object *ob)
                     fcu != NULL;
                     fcu = (FCurve *)fcu->next)
                {
-                       if (fcu->rna_path && strstr(fcu->rna_path, 
"modifiers["))
+                       if (fcu->rna_path && strstr(fcu->rna_path, pattern))
                                return true;
                }
 
@@ -204,15 +200,6 @@ void DepsgraphRelationBuilder::build_scene(Scene *scene)
 
 void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob)
 {
-       /* TODO(sergey): This is mainly for the testing purposes, in the final
-        * design we'll need to add relation between individual component to the
-        * time source.
-        */
-       if (object_modifiers_use_time(ob)) {
-               /* TODO(sergey): Replace with time relation. */
-               m_graph->add_new_time_relation(m_graph->find_id_node(&ob->id));
-       }
-
        if (ob->parent)
                build_object_parent(ob);
        
@@ -272,6 +259,12 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, 
Object *ob)
                build_particles(scene, ob);
        }
 
+       if (ob->adt) {
+               ComponentKey adt_key(&ob->id, DEPSNODE_TYPE_ANIMATION);
+               ComponentKey transform_key(&ob->id, DEPSNODE_TYPE_TRANSFORM);
+               add_relation(adt_key, local_transform_key, 
DEPSREL_TYPE_OPERATION, "Object Animation");
+       }
+
        /* TODO(sergey): This is a temp solution for now only/ */
        ComponentKey transform_key(&ob->id, DEPSNODE_TYPE_TRANSFORM);
        ComponentKey geometry_key(&ob->id, DEPSNODE_TYPE_GEOMETRY);
@@ -452,11 +445,8 @@ void DepsgraphRelationBuilder::build_animdata(ID *id)
        /* animation */
        if (adt->action || adt->nla_tracks.first) {
                /* wire up dependency to time source */
-               //TimeSourceKey time_src_key;
-               //add_relation(time_src_key, adt_key, DEPSREL_TYPE_TIME, 
"[TimeSrc -> Animation] DepsRel");
-
-               /* TODO(sergey): Replace with time relation. */
-               m_graph->add_new_time_relation(m_graph->find_id_node(id));
+               TimeSourceKey time_src_key;
+               add_relation(time_src_key, adt_key, DEPSREL_TYPE_TIME, 
"[TimeSrc -> Animation] DepsRel");
 
                // XXX: Hook up specific update callbacks for special 
properties which may need it...
        }
@@ -964,7 +954,12 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene 
*scene, Object *ob)
                                DepsNodeHandle handle = 
create_node_handle(mod_key);
                                mti->updateDepsgraph(md, scene, ob, &handle);
                        }
-                       
+
+                       if (modifier_check_depends_on_time(ob, md)) {
+                               TimeSourceKey time_src_key;
+                               add_relation(time_src_key, mod_key, 
DEPSREL_TYPE_TIME, "Time Source");
+                       }
+
                        prev_mod_key = mod_key;
                }
        }
@@ -999,11 +994,6 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene 
*scene, Object *ob)
        else {
                add_relation(geom_eval_key, obdata_ubereval_key, 
DEPSREL_TYPE_OPERATION, "Object Geometry UberEval");
        }
-
-       if (ob->adt) {
-               ComponentKey adt_key(&ob->id, DEPSNODE_TYPE_ANIMATION);
-               add_relation(adt_key, obdata_ubereval_key, 
DEPSREL_TYPE_OPERATION, "Object Geometry UberEval");
-       }
 }
 
 /* Cameras */
diff --git a/source/blender/depsgraph/intern/depsgraph_debug.cpp 
b/source/blender/depsgraph/intern/depsgraph_debug.cpp
index 69e84ae..cf61068 100644
--- a/source/blender/depsgraph/intern/depsgraph_debug.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_debug.cpp
@@ -602,6 +602,10 @@ static void deg_debug_graphviz_graph_nodes(const 
DebugContext &ctx, const Depsgr
                DepsNode *node = it->second;
                deg_debug_graphviz_node(ctx, node);
        }
+       TimeSourceDepsNode *time_source = graph->find_time_source(NULL);
+       if (time_source != NULL) {
+               deg_debug_graphviz_node(ctx, time_source);
+       }
 }
 
 static void deg_debug_graphviz_graph_relations(const DebugContext &ctx, const 
Depsgraph *graph)
@@ -629,6 +633,28 @@ static void deg_debug_graphviz_graph_relations(const 
DebugContext &ctx, const De
                        }
                }
        }
+
+       /* TODO(sergey): Cleen this up somehow? */
+       TimeSourceDepsNode *time_source = graph->find_time_source(NULL);
+       if (time_source != NULL) {
+               for (vector<OperationDepsNode*>::const_iterator link = 
time_source->outlinks.begin();
+                    link != time_source->outlinks.end();
+                    ++link)
+               {
+                       OperationDepsNode *node = *link;
+                       deg_debug_printf(ctx, "// %s -> %s\n", 
time_source->name.c_str(), node->name.c_str());
+                       deg_debug_printf(ctx, "\"node_%p\"", time_source);
+                       deg_debug_printf(ctx, " -> ");
+                       deg_debug_printf(ctx, "\"node_%p\"", node);
+
+                       deg_debug_printf(ctx, "[");
+                       /* TODO(sergey): Use proper relation name here. */
+                       deg_debug_printf(ctx, "label=\"%s\"", "Time 
Dependency");
+                       deg_debug_printf(ctx, ",fontname=\"%s\"", 
deg_debug_graphviz_fontname);
+                       deg_debug_printf(ctx, "];" NL);
+                       deg_debug_printf(ctx, NL);
+               }
+       }
 #endif
 }
 
diff --git a/source/blender/depsgraph/intern/depsnode.cpp 
b/source/blender/depsgraph/intern/depsnode.cpp
index 0a35661..439b2bd 100644
--- a/source/blender/depsgraph/intern/depsnode.cpp
+++ b/source/blender/depsgraph/intern/depsnode.cpp
@@ -34,6 +34,7 @@ extern "C" {
 
 #include "depsnode.h" /* own include */
 #include "depsnode_component.h"
+#include "depsnode_operation.h"
 #include "depsgraph.h"
 #include "depsgraph_intern.h"
 
@@ -71,18 +72,18 @@ DepsNode::~DepsNode()
 
 void TimeSourceDepsNode::tag_update(Depsgraph *graph)
 {
-       for (vector<IDDepsNode*>::const_iterator it_id = id_nodes.begin();
-            it_id != id_nodes.end();
-            ++it_id)
+       for (vector<OperationDepsNode*>::const_iterator link = outlinks.begin();
+            link != outlinks.end();
+            ++link)
        {
-               IDDepsNode *id_node = *it_id;
-               id_node->tag_update(graph);
+               OperationDepsNode *node = *link;
+               node->tag_update(graph);
        }
 }
 
-void TimeSourceDepsNode::add_time_dependency(IDDepsNode *from)
+void TimeSourceDepsNode::ad

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to