[Bf-blender-cvs] [339839d58d3] node-tree-update-refactor: progress
Jacques Lucke
noreply at git.blender.org
Mon Nov 15 19:09:22 CET 2021
Commit: 339839d58d35ca929a6d425af092b8f2304c9fcf
Author: Jacques Lucke
Date: Mon Nov 15 18:01:00 2021 +0100
Branches: node-tree-update-refactor
https://developer.blender.org/rB339839d58d35ca929a6d425af092b8f2304c9fcf
progress
===================================================================
M source/blender/blenkernel/intern/node_tree_update.cc
M source/blender/makesdna/DNA_node_types.h
===================================================================
diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc
index d6c60eb1b38..82b62b5d37c 100644
--- a/source/blender/blenkernel/intern/node_tree_update.cc
+++ b/source/blender/blenkernel/intern/node_tree_update.cc
@@ -311,19 +311,93 @@ class NodeTreeMainUpdater {
TreeUpdateResult update_tree(bNodeTree &ntree)
{
- ntreeUpdateTree(bmain_, &ntree);
TreeUpdateResult result;
+
+ if (ntree.changed_flag & NTREE_CHANGED_INTERFACE) {
+ result.interface_changed = true;
+ }
+
+ if (ntree.changed_flag & NTREE_CHANGED_LINK) {
+ this->update_input_socket_link_pointers(ntree);
+ }
+ this->update_individual_nodes(ntree);
+
+ if (ntree.typeinfo->update) {
+ ntree.typeinfo->update(&ntree);
+ }
+
result.interface_changed = true;
result.output_changed = true;
+
+ if (result.interface_changed) {
+ ntreeInterfaceTypeUpdate(&ntree);
+ }
+
return result;
}
+
+ void update_input_socket_link_pointers(bNodeTree &ntree)
+ {
+ LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
+ LISTBASE_FOREACH (bNodeSocket *, socket, &node->inputs) {
+ socket->link = nullptr;
+ }
+ }
+
+ LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
+ link->tosock->link = link;
+ }
+
+ this->update_socket_used_tags(ntree);
+ }
+
+ void update_socket_used_tags(bNodeTree &ntree)
+ {
+ /* First clear flag. */
+ LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
+ LISTBASE_FOREACH (bNodeSocket *, sock, &node->inputs) {
+ sock->flag &= ~SOCK_IN_USE;
+ }
+ LISTBASE_FOREACH (bNodeSocket *, sock, &node->outputs) {
+ sock->flag &= ~SOCK_IN_USE;
+ }
+ }
+
+ LISTBASE_FOREACH (bNodeLink *, link, &ntree.links) {
+ link->fromsock->flag |= SOCK_IN_USE;
+ if (!(link->flag & NODE_LINK_MUTED)) {
+ link->tosock->flag |= SOCK_IN_USE;
+ }
+ }
+ }
+
+ void update_individual_nodes(bNodeTree &ntree)
+ {
+ LISTBASE_FOREACH (bNode *, node, &ntree.nodes) {
+ if (ntree.changed_flag & NTREE_CHANGED_ANY || node->changed_flag & NODE_CHANGED_ANY) {
+ this->update_individual_node(ntree, *node);
+ }
+ }
+ }
+
+ void update_individual_node(bNodeTree &ntree, bNode &node)
+ {
+ if (node.typeinfo->updatefunc) {
+ node.typeinfo->updatefunc(&ntree, &node);
+ }
+
+ BLI_freelistN(&node.internal_links);
+ if (node.typeinfo->update_internal_links) {
+ node.typeinfo->update_internal_links(&ntree, &node);
+ }
+ }
};
} // namespace blender::bke
void BKE_node_tree_update_tag(bNodeTree *ntree)
{
- ntree->changed_flag |= NTREE_CHANGED_ANY;
+ ntree->changed_flag |= NTREE_CHANGED_ALL;
ntree->update |= NTREE_UPDATE;
}
@@ -381,7 +455,7 @@ void BKE_node_tree_update_tag_missing_runtime_data(bNodeTree *ntree)
void BKE_node_tree_update_tag_interface(bNodeTree *ntree)
{
- ntree->changed_flag |= NTREE_CHANGED_ANY;
+ ntree->changed_flag |= NTREE_CHANGED_INTERFACE;
ntree->update |= NTREE_UPDATE;
}
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index a0d88bd0289..3db38a08622 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -601,6 +601,8 @@ typedef enum eNodeTreeChangedFlag {
NTREE_CHANGED_LINK = (1 << 3),
NTREE_CHANGED_REMOVED_ANY = (1 << 4),
NTREE_CHANGED_MISSING_RUNTIME_DATA = (1 << 5),
+ NTREE_CHANGED_INTERFACE = (1 << 6),
+ NTREE_CHANGED_ALL = -1,
} eNodeTreeChangedFlag;
/* ntree->type, index */
More information about the Bf-blender-cvs
mailing list