Commit: 8f6e2de35f766374642ff0f216352bf6413d40cd
Author: Sergey Sharybin
Date:   Wed Jan 7 17:27:57 2015 +0500
Branches: depsgraph_refactor
https://developer.blender.org/rB8f6e2de35f766374642ff0f216352bf6413d40cd

Depsgraph: Add Component::has_operation which checks whether operation exists 
or not

This way we can explicitly distinguish situations when operation is allowed to 
not
exist (i.e. when doing a check before adding new one) and when operation 
expects to
be there (when adding relation i.e.).

Also corrected obdata geometry key when adding relation.

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

M       source/blender/depsgraph/intern/depsgraph_build_relations.cpp
M       source/blender/depsgraph/intern/depsnode_component.cpp
M       source/blender/depsgraph/intern/depsnode_component.h

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

diff --git a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp 
b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
index e53ea7a..68de63e 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
@@ -1191,7 +1191,7 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene 
*scene, Object *ob)
        /* get nodes for result of obdata's evaluation, and geometry evaluation 
on object */
        ComponentKey geom_key(&ob->id, DEPSNODE_TYPE_GEOMETRY);
        ComponentKey obdata_geom_key(obdata, DEPSNODE_TYPE_GEOMETRY);
-       OperationKey geom_eval_key(&ob->id, DEPSNODE_TYPE_GEOMETRY, "Geometry 
Eval");
+       OperationKey geom_eval_key(obdata, DEPSNODE_TYPE_GEOMETRY, 
DEG_OPCODE_PLACEHOLDER, "Geometry Eval");
        
        /* link components to each other */
        add_relation(obdata_geom_key, geom_key, DEPSREL_TYPE_DATABLOCK, "Object 
Geometry Base Data");
@@ -1315,7 +1315,7 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene 
*scene, Object *ob)
                        OperationKey mod_key(&ob->id, DEPSNODE_TYPE_GEOMETRY, 
DEG_OPCODE_GEOMETRY_MODIFIER, md->name);
                        add_relation(mod_key, obdata_ubereval_key, 
DEPSREL_TYPE_OPERATION, "Object Geometry UberEval");
                }
-               else {
+               else if (obdata != NULL) {
                        add_relation(geom_eval_key, obdata_ubereval_key, 
DEPSREL_TYPE_OPERATION, "Object Geometry UberEval");
                }
        }
diff --git a/source/blender/depsgraph/intern/depsnode_component.cpp 
b/source/blender/depsgraph/intern/depsnode_component.cpp
index 54a25dd..934fe1b 100644
--- a/source/blender/depsgraph/intern/depsnode_component.cpp
+++ b/source/blender/depsgraph/intern/depsnode_component.cpp
@@ -107,6 +107,7 @@ OperationDepsNode 
*ComponentDepsNode::find_operation(OperationIDKey key) const
        else {
                fprintf(stderr, "%s: find_operation(%s) failed\n",
                        this->identifier().c_str(), key.identifier().c_str());
+               BLI_assert(!"Request for non-existing operation, should not 
happen");
                return NULL;
        }
 }
@@ -117,9 +118,25 @@ OperationDepsNode 
*ComponentDepsNode::find_operation(eDepsOperation_Code opcode,
        return find_operation(key);
 }
 
+OperationDepsNode *ComponentDepsNode::has_operation(OperationIDKey key) const
+{
+       OperationMap::const_iterator it = this->operations.find(key);
+       if (it != this->operations.end()) {
+               return it->second;
+       }
+       return NULL;
+}
+
+OperationDepsNode *ComponentDepsNode::has_operation(eDepsOperation_Code opcode,
+                                                    const string &name) const
+{
+       OperationIDKey key(opcode, name);
+       return has_operation(key);
+}
+
 OperationDepsNode *ComponentDepsNode::add_operation(eDepsOperation_Type 
optype, DepsEvalOperationCb op, eDepsOperation_Code opcode, const string &name)
 {
-       OperationDepsNode *op_node = find_operation(opcode, name);
+       OperationDepsNode *op_node = has_operation(opcode, name);
        if (!op_node) {
                DepsNodeFactory *factory = 
DEG_get_node_factory(DEPSNODE_TYPE_OPERATION);
                op_node = (OperationDepsNode 
*)factory->create_node(this->owner->id, "", name);
diff --git a/source/blender/depsgraph/intern/depsnode_component.h 
b/source/blender/depsgraph/intern/depsnode_component.h
index f892a7e..fa36d25 100644
--- a/source/blender/depsgraph/intern/depsnode_component.h
+++ b/source/blender/depsgraph/intern/depsnode_component.h
@@ -101,10 +101,15 @@ struct ComponentDepsNode : public DepsNode {
        void copy(DepsgraphCopyContext *dcc, const ComponentDepsNode *src);
        
        string identifier() const;
-       
+
+       /* Find an existing operation, will throw an assert() if it does not 
exist. */
        OperationDepsNode *find_operation(OperationIDKey key) const;
        OperationDepsNode *find_operation(eDepsOperation_Code opcode, const 
string &name) const;
-       
+
+       /* Check operation exists and return it. */
+       OperationDepsNode *has_operation(OperationIDKey key) const;
+       OperationDepsNode *has_operation(eDepsOperation_Code opcode, const 
string &name) const;
+
        /* Create a new node for representing an operation and add this to graph
         * ! If an existing node is found, it will be modified. This helps when 
node may 
         *   have been partially created earlier (e.g. parent ref before parent 
item is added)

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

Reply via email to