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/blenkernel/intern/node_runtime.cc')
-rw-r--r--source/blender/blenkernel/intern/node_runtime.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/node_runtime.cc b/source/blender/blenkernel/intern/node_runtime.cc
index 0c78c0f09d1..00b78284791 100644
--- a/source/blender/blenkernel/intern/node_runtime.cc
+++ b/source/blender/blenkernel/intern/node_runtime.cc
@@ -10,8 +10,22 @@
#include "BLI_task.hh"
#include "BLI_timeit.hh"
+#include "NOD_geometry_nodes_lazy_function.hh"
+
namespace blender::bke::node_tree_runtime {
+void handle_node_tree_output_changed(bNodeTree &tree_cow)
+{
+ if (tree_cow.type == NTREE_GEOMETRY) {
+ /* Rebuild geometry nodes lazy function graph. */
+ {
+ std::lock_guard lock{tree_cow.runtime->geometry_nodes_lazy_function_graph_info_mutex};
+ tree_cow.runtime->geometry_nodes_lazy_function_graph_info.reset();
+ }
+ blender::nodes::ensure_geometry_nodes_lazy_function_graph(tree_cow);
+ }
+}
+
static void double_checked_lock(std::mutex &mutex, bool &data_is_dirty, FunctionRef<void()> fn)
{
if (!data_is_dirty) {
@@ -36,11 +50,15 @@ static void update_node_vector(const bNodeTree &ntree)
{
bNodeTreeRuntime &tree_runtime = *ntree.runtime;
tree_runtime.nodes.clear();
+ tree_runtime.group_nodes.clear();
tree_runtime.has_undefined_nodes_or_sockets = false;
LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
node->runtime->index_in_tree = tree_runtime.nodes.append_and_get_index(node);
node->runtime->owner_tree = const_cast<bNodeTree *>(&ntree);
tree_runtime.has_undefined_nodes_or_sockets |= node->typeinfo == &NodeTypeUndefined;
+ if (node->is_group()) {
+ tree_runtime.group_nodes.append(node);
+ }
}
}
@@ -258,6 +276,7 @@ static void toposort_from_start_node(const ToposortDirection direction,
Stack<Item, 64> nodes_to_check;
nodes_to_check.push({&start_node});
+ node_states[start_node.runtime->index_in_tree].is_in_stack = true;
while (!nodes_to_check.is_empty()) {
Item &item = nodes_to_check.peek();
bNode &node = *item.node;