diff options
author | Jacques Lucke <jacques@blender.org> | 2021-10-18 12:40:00 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-10-18 12:46:21 +0300 |
commit | eb0d216dc1caab515eb7cf1ef6bb1632e5ca8fae (patch) | |
tree | 59e9f61142052255df5680d34d93fe8271251ec3 /source/blender/nodes/intern | |
parent | 746ee29d3638402e2435f47787087b6458f026c7 (diff) |
Geometry Nodes: decouple multi-function lifetimes from modifier
Previously, some multi-functions were allocated in a resource scope.
This was fine as long as the multi-functions were only needed during
the current evaluation of the node tree. However, now cases arise
that require the multi-functions to be alive after the modifier is finished.
For example, we want to evaluate fields created with geometry nodes
outside of geometry nodes.
To make this work, `std::shared_ptr` has to be used in a few more places.
Realistically, this shouldn't have a noticable impact on performance.
If this does become a bottleneck in the future, we can think about ways
to make this work without using `shared_ptr` for multi-functions that
are only used once.
Diffstat (limited to 'source/blender/nodes/intern')
-rw-r--r-- | source/blender/nodes/intern/node_multi_function.cc | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/source/blender/nodes/intern/node_multi_function.cc b/source/blender/nodes/intern/node_multi_function.cc index c91899ed8c2..6d79ed839b2 100644 --- a/source/blender/nodes/intern/node_multi_function.cc +++ b/source/blender/nodes/intern/node_multi_function.cc @@ -18,7 +18,7 @@ namespace blender::nodes { -NodeMultiFunctions::NodeMultiFunctions(const DerivedNodeTree &tree, ResourceScope &resource_scope) +NodeMultiFunctions::NodeMultiFunctions(const DerivedNodeTree &tree) { for (const NodeTreeRef *tree_ref : tree.used_node_tree_refs()) { bNodeTree *btree = tree_ref->btree(); @@ -27,11 +27,10 @@ NodeMultiFunctions::NodeMultiFunctions(const DerivedNodeTree &tree, ResourceScop if (bnode->typeinfo->build_multi_function == nullptr) { continue; } - NodeMultiFunctionBuilder builder{resource_scope, *bnode, *btree}; + NodeMultiFunctionBuilder builder{*bnode, *btree}; bnode->typeinfo->build_multi_function(builder); - const MultiFunction *fn = builder.built_fn_; - if (fn != nullptr) { - map_.add_new(bnode, fn); + if (builder.built_fn_ != nullptr) { + map_.add_new(bnode, {builder.built_fn_, std::move(builder.owned_built_fn_)}); } } } |