[Bf-blender-cvs] [ffd8b05e206] temp-enum-socket: initial enum inferencin

Jacques Lucke noreply at git.blender.org
Mon Nov 8 16:07:03 CET 2021


Commit: ffd8b05e206efe1c27b5617b3e01bc4744dc669a
Author: Jacques Lucke
Date:   Sun Nov 7 12:07:38 2021 +0100
Branches: temp-enum-socket
https://developer.blender.org/rBffd8b05e206efe1c27b5617b3e01bc4744dc669a

initial enum inferencin

===================================================================

M	source/blender/blenkernel/intern/node.cc
M	source/blender/nodes/intern/node_socket_declarations.cc

===================================================================

diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc
index aca49a01384..56fde3ac25f 100644
--- a/source/blender/blenkernel/intern/node.cc
+++ b/source/blender/blenkernel/intern/node.cc
@@ -87,6 +87,7 @@
 #include "NOD_node_tree_ref.hh"
 #include "NOD_shader.h"
 #include "NOD_socket.h"
+#include "NOD_socket_declarations.hh"
 #include "NOD_texture.h"
 
 #include "DEG_depsgraph.h"
@@ -4579,7 +4580,7 @@ static bool is_field_socket_type(const SocketRef &socket)
   return is_field_socket_type((eNodeSocketDatatype)socket.typeinfo()->type);
 }
 
-static bool update_field_inferencing(bNodeTree &btree);
+static bool update_field_inferencing(const NodeTreeRef &tree);
 
 static InputSocketFieldType get_interface_input_field_type(const NodeRef &node,
                                                            const InputSocketRef &socket)
@@ -4678,7 +4679,8 @@ static FieldInferencingInterface get_node_field_inferencing_interface(const Node
     }
     if (group->field_inferencing_interface == nullptr) {
       /* Update group recursively. */
-      update_field_inferencing(*group);
+      const NodeTreeRef group_tree{group};
+      update_field_inferencing(group_tree);
     }
     return *group->field_inferencing_interface;
   }
@@ -5036,12 +5038,10 @@ static void update_socket_shapes(const NodeTreeRef &tree,
   }
 }
 
-static bool update_field_inferencing(bNodeTree &btree)
+static bool update_field_inferencing(const NodeTreeRef &tree)
 {
   using namespace blender::nodes;
-  if (btree.type != NTREE_GEOMETRY) {
-    return false;
-  }
+  bNodeTree &btree = *tree.btree();
 
   /* Create new inferencing interface for this node group. */
   FieldInferencingInterface *new_inferencing_interface = new FieldInferencingInterface();
@@ -5050,9 +5050,6 @@ static bool update_field_inferencing(bNodeTree &btree)
   new_inferencing_interface->outputs.resize(BLI_listbase_count(&btree.outputs),
                                             OutputFieldDependency::ForDataSource());
 
-  /* Create #NodeTreeRef to accelerate various queries on the node tree (e.g. linked sockets). */
-  const NodeTreeRef tree{&btree};
-
   /* Keep track of the state of all sockets. The index into this array is #SocketRef::id(). */
   Array<SocketFieldState> field_state_by_socket_id(tree.sockets().size());
 
@@ -5074,6 +5071,33 @@ static bool update_field_inferencing(bNodeTree &btree)
 
 }  // namespace blender::bke::node_field_inferencing
 
+namespace blender::bke::enum_inferencing {
+
+static bool update_enum_inferencing(const NodeTreeRef &tree)
+{
+  bNodeTree &btree = *tree.btree();
+
+  for (const NodeRef *node : tree.nodes()) {
+    bNode &bnode = *node->bnode();
+    nodeDeclarationEnsure(&btree, &bnode);
+    const NodeDeclaration *node_decl = bnode.declaration;
+    for (const int i : node->inputs().index_range()) {
+      const InputSocketRef &socket = node->input(i);
+      if (socket.typeinfo()->type == SOCK_ENUM) {
+        bNodeSocketValueEnum *socket_value =
+            (bNodeSocketValueEnum *)socket.bsocket()->default_value;
+        const nodes::decl::Enum &enum_decl = static_cast<const nodes::decl::Enum &>(
+            *node_decl->inputs()[i]);
+        socket_value->items = enum_decl.items()->items();
+      }
+    }
+  }
+
+  return false;
+}
+
+}  // namespace blender::bke::enum_inferencing
+
 /**
  * \param tree_update_flag: #eNodeTreeUpdate enum.
  */
@@ -5165,10 +5189,19 @@ void ntreeUpdateTree(Main *bmain, bNodeTree *ntree)
   int tree_user_update_flag = 0;
 
   if (ntree->update & NTREE_UPDATE) {
-    /* If the field interface of this node tree has changed, all node trees using
-     * this group will need to recalculate their interface as well. */
-    if (blender::bke::node_field_inferencing::update_field_inferencing(*ntree)) {
-      tree_user_update_flag |= NTREE_UPDATE_FIELD_INFERENCING;
+    if (ntree->type == NTREE_GEOMETRY) {
+      /* Create #NodeTreeRef to accelerate various queries on the node tree (e.g. linked
+       * sockets). */
+      const NodeTreeRef tree{ntree};
+      /* If the field interface of this node tree has changed, all node trees using
+       * this group will need to recalculate their interface as well. */
+      if (blender::bke::node_field_inferencing::update_field_inferencing(tree)) {
+        tree_user_update_flag |= NTREE_UPDATE_FIELD_INFERENCING;
+      }
+      if (blender::bke::enum_inferencing::update_enum_inferencing(tree)) {
+        /* TODO: Fix flag handling. */
+        tree_user_update_flag |= NTREE_UPDATE_FIELD_INFERENCING;
+      }
     }
   }
 
diff --git a/source/blender/nodes/intern/node_socket_declarations.cc b/source/blender/nodes/intern/node_socket_declarations.cc
index 548267b5c66..b9966277b66 100644
--- a/source/blender/nodes/intern/node_socket_declarations.cc
+++ b/source/blender/nodes/intern/node_socket_declarations.cc
@@ -311,7 +311,6 @@ bNodeSocket &Enum::build(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out)
       &ntree, &node, in_out, SOCK_ENUM, PROP_NONE, identifier_.c_str(), name_.c_str());
   ((bNodeSocketValueEnum *)socket.default_value)->value = default_value_;
   this->set_common_flags(socket);
-  ((bNodeSocketValueEnum *)socket.default_value)->items = items_->items();
   return socket;
 }



More information about the Bf-blender-cvs mailing list