Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/modifiers')
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc31
1 files changed, 28 insertions, 3 deletions
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 706ef8578ac..9ec7bdf3b80 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -50,6 +50,7 @@
#include "BKE_lib_query.h"
#include "BKE_mesh.h"
#include "BKE_modifier.h"
+#include "BKE_node_ui_storage.hh"
#include "BKE_pointcloud.h"
#include "BKE_screen.h"
#include "BKE_simulation.h"
@@ -244,6 +245,7 @@ class GeometryNodesEvaluator {
const blender::nodes::DataTypeConversions &conversions_;
const PersistentDataHandleMap &handle_map_;
const Object *self_object_;
+ const ModifierData *modifier_;
Depsgraph *depsgraph_;
public:
@@ -252,12 +254,14 @@ class GeometryNodesEvaluator {
blender::nodes::MultiFunctionByNode &mf_by_node,
const PersistentDataHandleMap &handle_map,
const Object *self_object,
+ const ModifierData *modifier,
Depsgraph *depsgraph)
: group_outputs_(std::move(group_outputs)),
mf_by_node_(mf_by_node),
conversions_(blender::nodes::get_implicit_type_conversions()),
handle_map_(handle_map),
self_object_(self_object),
+ modifier_(modifier),
depsgraph_(depsgraph)
{
for (auto item : group_input_data.items()) {
@@ -359,7 +363,7 @@ class GeometryNodesEvaluator {
/* Execute the node. */
GValueMap<StringRef> node_outputs_map{allocator_};
GeoNodeExecParams params{
- node, node_inputs_map, node_outputs_map, handle_map_, self_object_, depsgraph_};
+ node, node_inputs_map, node_outputs_map, handle_map_, self_object_, modifier_, depsgraph_};
this->execute_node(node, params);
/* Forward computed outputs to linked input sockets. */
@@ -946,6 +950,19 @@ static void fill_data_handle_map(const NodesModifierSettings &settings,
}
}
+static void reset_tree_ui_storage(Span<const blender::nodes::NodeTreeRef *> trees,
+ const Object &object,
+ const ModifierData &modifier)
+{
+ const NodeTreeEvaluationContext context = {object, modifier};
+
+ for (const blender::nodes::NodeTreeRef *tree : trees) {
+ bNodeTree *btree_cow = tree->btree();
+ bNodeTree *btree_original = (bNodeTree *)DEG_get_original_id((ID *)btree_cow);
+ BKE_nodetree_ui_storage_free_for_context(*btree_original, context);
+ }
+}
+
/**
* Evaluate a node group to compute the output geometry.
* Currently, this uses a fairly basic and inefficient algorithm that might compute things more
@@ -992,8 +1009,14 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
Vector<const DInputSocket *> group_outputs;
group_outputs.append(&socket_to_compute);
- GeometryNodesEvaluator evaluator{
- group_inputs, group_outputs, mf_by_node, handle_map, ctx->object, ctx->depsgraph};
+ GeometryNodesEvaluator evaluator{group_inputs,
+ group_outputs,
+ mf_by_node,
+ handle_map,
+ ctx->object,
+ (ModifierData *)nmd,
+ ctx->depsgraph};
+
Vector<GMutablePointer> results = evaluator.execute();
BLI_assert(results.size() == 1);
GMutablePointer result = results[0];
@@ -1091,6 +1114,8 @@ static void modifyGeometry(ModifierData *md,
return;
}
+ reset_tree_ui_storage(tree.used_node_tree_refs(), *ctx->object, *md);
+
geometry_set = compute_geometry(
tree, group_inputs, *group_outputs[0], std::move(geometry_set), nmd, ctx);
}