[Bf-blender-cvs] [686d90a8249] temp-geometry-nodes-evaluator-refactor: try find socket with logged value

Jacques Lucke noreply at git.blender.org
Fri Sep 2 17:50:40 CEST 2022


Commit: 686d90a8249aedcd18bf956cf69a9bb658d4090d
Author: Jacques Lucke
Date:   Fri Sep 2 15:26:54 2022 +0200
Branches: temp-geometry-nodes-evaluator-refactor
https://developer.blender.org/rB686d90a8249aedcd18bf956cf69a9bb658d4090d

try find socket with logged value

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

M	source/blender/editors/space_node/node_draw.cc

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

diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc
index a4a57e69caf..8f654dd2001 100644
--- a/source/blender/editors/space_node/node_draw.cc
+++ b/source/blender/editors/space_node/node_draw.cc
@@ -388,19 +388,83 @@ static bool node_socket_has_tooltip(bNodeTree *ntree, bNodeSocket *socket)
   return false;
 }
 
+static blender::nodes::geo_eval_log::ValueLog *find_socket_value_log(
+    GeoTreeLog &tree_log, const bNodeSocket &query_socket)
+{
+  using namespace blender::nodes::geo_eval_log;
+  tree_log.ensure_socket_values();
+
+  if (query_socket.is_multi_input()) {
+    return nullptr;
+  }
+
+  Set<const bNodeSocket *> added_sockets;
+  Stack<const bNodeSocket *> sockets_to_check;
+  sockets_to_check.push(&query_socket);
+  added_sockets.add(&query_socket);
+
+  while (!sockets_to_check.is_empty()) {
+    const bNodeSocket &socket = *sockets_to_check.pop();
+    const bNode &node = socket.owner_node();
+    if (GeoNodeLog *node_log = tree_log.nodes.lookup_ptr(node.name)) {
+      ValueLog *value_log = socket.is_input() ?
+                                node_log->input_values_.lookup_default(socket.identifier,
+                                                                       nullptr) :
+                                node_log->output_values_.lookup_default(socket.identifier,
+                                                                        nullptr);
+      if (value_log != nullptr) {
+        return value_log;
+      }
+    }
+
+    if (socket.is_input()) {
+      const Span<const bNodeLink *> links = socket.directly_linked_links();
+      for (const bNodeLink *link : links) {
+        const bNodeSocket &from_socket = *link->fromsock;
+        if (added_sockets.add(&from_socket)) {
+          sockets_to_check.push(&from_socket);
+        }
+      }
+    }
+    else {
+      if (node.is_reroute()) {
+        const bNodeSocket &input_socket = node.input_socket(0);
+        if (added_sockets.add(&input_socket)) {
+          sockets_to_check.push(&input_socket);
+        }
+        const Span<const bNodeLink *> links = input_socket.directly_linked_links();
+        for (const bNodeLink *link : links) {
+          const bNodeSocket &from_socket = *link->fromsock;
+          if (added_sockets.add(&from_socket)) {
+            sockets_to_check.push(&from_socket);
+          }
+        }
+      }
+      else if (node.is_muted()) {
+        if (const bNodeSocket *input_socket = socket.internal_link_input()) {
+          if (added_sockets.add(input_socket)) {
+            sockets_to_check.push(input_socket);
+          }
+          const Span<const bNodeLink *> links = input_socket->directly_linked_links();
+          for (const bNodeLink *link : links) {
+            const bNodeSocket &from_socket = *link->fromsock;
+            if (added_sockets.add(&from_socket)) {
+              sockets_to_check.push(&from_socket);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  return nullptr;
+}
+
 static std::optional<std::string> create_socket_inspection_string(TreeDrawContext &tree_draw_ctx,
-                                                                  bNode &node,
                                                                   bNodeSocket &socket)
 {
   using namespace blender::nodes::geo_eval_log;
-  tree_draw_ctx.geo_tree_log->ensure_socket_values();
-  GeoNodeLog *node_log = tree_draw_ctx.geo_tree_log->nodes.lookup_ptr(node.name);
-  if (node_log == nullptr) {
-    return std::nullopt;
-  }
-  ValueLog *value_log = socket.in_out == SOCK_IN ?
-                            node_log->input_values_.lookup_default(socket.identifier, nullptr) :
-                            node_log->output_values_.lookup_default(socket.identifier, nullptr);
+  ValueLog *value_log = find_socket_value_log(*tree_draw_ctx.geo_tree_log, socket);
   if (value_log == nullptr) {
     return std::nullopt;
   }
@@ -414,7 +478,7 @@ static std::optional<std::string> create_socket_inspection_string(TreeDrawContex
 
 static char *node_socket_get_tooltip(bContext *C,
                                      bNodeTree *ntree,
-                                     bNode *node,
+                                     bNode *UNUSED(node),
                                      bNodeSocket *socket)
 {
   SpaceNode *snode = CTX_wm_space_node(C);
@@ -440,7 +504,7 @@ static char *node_socket_get_tooltip(bContext *C,
     }
 
     std::optional<std::string> socket_inspection_str = create_socket_inspection_string(
-        tree_draw_ctx, *node, *socket);
+        tree_draw_ctx, *socket);
     if (socket_inspection_str.has_value()) {
       output << *socket_inspection_str;
     }



More information about the Bf-blender-cvs mailing list