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.
This commit is contained in:
@@ -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_)});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user