diff options
author | Joshua Leung <aligorith@gmail.com> | 2018-08-22 18:15:19 +0300 |
---|---|---|
committer | Joshua Leung <aligorith@gmail.com> | 2018-08-23 08:07:38 +0300 |
commit | 6ec933886c363c99da3df4063c6f35b94d42cbfe (patch) | |
tree | c7dc2093a9d53e99a8cd4df48c1ab871f31fd964 /source/blender/depsgraph/intern/depsgraph_query_foreach.cc | |
parent | 9a0ef0933d39f37e2267102f097ef7e4497d7789 (diff) |
Depsgraph: Fix filtering-related crashes
* Simplified operation-relation deletion. Now we collect the relations
to delete into a vector, then iterate through that, thus solving issues
with iterator invalidation (+ aborts arising from that)
* DEG_foreach_ancestor_ID() was assuming that all dependencies were
OperationDepsNodes, when in fact, some could be TimeSource nodes
Diffstat (limited to 'source/blender/depsgraph/intern/depsgraph_query_foreach.cc')
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_query_foreach.cc | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_query_foreach.cc b/source/blender/depsgraph/intern/depsgraph_query_foreach.cc index 83d81d82b26..c8aaf353874 100644 --- a/source/blender/depsgraph/intern/depsgraph_query_foreach.cc +++ b/source/blender/depsgraph/intern/depsgraph_query_foreach.cc @@ -178,21 +178,27 @@ static void deg_foreach_ancestor_ID(const Depsgraph *graph, } /* Schedule incoming operation nodes. */ if (op_node->inlinks.size() == 1) { - OperationDepsNode *from_node = (OperationDepsNode *)op_node->inlinks[0]->from; - if (from_node->scheduled == false) { - from_node->scheduled = true; - op_node = from_node; - } - else { - break; + DepsNode *from = op_node->inlinks[0]->from; + if (from->get_class() == DEG_NODE_CLASS_OPERATION) { + OperationDepsNode *from_node = (OperationDepsNode *)from; + if (from_node->scheduled == false) { + from_node->scheduled = true; + op_node = from_node; + } + else { + break; + } } } else { foreach (DepsRelation *rel, op_node->inlinks) { - OperationDepsNode *from_node = (OperationDepsNode *)rel->from; - if (from_node->scheduled == false) { - queue.push_front(from_node); - from_node->scheduled = true; + DepsNode *from = rel->from; + if (from->get_class() == DEG_NODE_CLASS_OPERATION) { + OperationDepsNode *from_node = (OperationDepsNode *)from; + if (from_node->scheduled == false) { + queue.push_front(from_node); + from_node->scheduled = true; + } } } break; |