diff options
author | Jacques Lucke <jacques@blender.org> | 2021-12-11 13:25:32 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-12-11 13:26:55 +0300 |
commit | 7b88a4a3ba7eb9b839afa6c42d070812a3af7997 (patch) | |
tree | ba3df3abcdde501ed8ceb437ab2de26188eb9cef /source/blender/nodes/intern | |
parent | 4c705ab8fecf237050eaf314206cd3b9e096853e (diff) |
Geometry Nodes: remove accidental exponential time algorithm
Calling `foreach_field_input` on a highly nested field (we do that
often) has an exponential running time in the number of nodes.
That is because the same node may be visited many times.
This made Blender freeze on some setups that should work just fine.
Now every field keeps track of its inputs all the time. That replaces
the exponential algorithm with constant time access.
Diffstat (limited to 'source/blender/nodes/intern')
-rw-r--r-- | source/blender/nodes/intern/geometry_nodes_eval_log.cc | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/source/blender/nodes/intern/geometry_nodes_eval_log.cc b/source/blender/nodes/intern/geometry_nodes_eval_log.cc index f522740b905..e33f6cf345d 100644 --- a/source/blender/nodes/intern/geometry_nodes_eval_log.cc +++ b/source/blender/nodes/intern/geometry_nodes_eval_log.cc @@ -191,12 +191,14 @@ const SocketLog *NodeLog::lookup_socket_log(const bNode &node, const bNodeSocket GFieldValueLog::GFieldValueLog(fn::GField field, bool log_full_field) : type_(field.cpp_type()) { - Set<std::reference_wrapper<const FieldInput>> field_inputs_set; - field.node().foreach_field_input( - [&](const FieldInput &field_input) { field_inputs_set.add(field_input); }); + const std::shared_ptr<const fn::FieldInputs> &field_input_nodes = field.node().field_inputs(); + /* Put the deduplicated field inputs into a vector so that they can be sorted below. */ Vector<std::reference_wrapper<const FieldInput>> field_inputs; - field_inputs.extend(field_inputs_set.begin(), field_inputs_set.end()); + if (field_input_nodes) { + field_inputs.extend(field_input_nodes->deduplicated_nodes.begin(), + field_input_nodes->deduplicated_nodes.end()); + } std::sort( field_inputs.begin(), field_inputs.end(), [](const FieldInput &a, const FieldInput &b) { |