Commit: e599bb1793dfd185091ef04f1c0afb48d9dad9c7 Author: Jacques Lucke Date: Thu Sep 8 10:54:44 2022 +0200 Branches: temp-geometry-nodes-evaluator-refactor https://developer.blender.org/rBe599bb1793dfd185091ef04f1c0afb48d9dad9c7
cleanup =================================================================== M source/blender/editors/space_node/node_draw.cc M source/blender/editors/space_node/node_geometry_attribute_search.cc M source/blender/editors/space_node/node_intern.hh M source/blender/nodes/NOD_geometry_nodes_log.hh M source/blender/nodes/intern/geometry_nodes_log.cc =================================================================== diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index 79935f6396b..9d5ce17a9be 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -353,78 +353,6 @@ static bool node_socket_has_tooltip(const bNodeTree *ntree, const bNodeSocket *s return false; } -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 void create_inspection_string_for_generic_value(const GPointer value, std::stringstream &ss) { auto id_to_inspection_string = [&](const ID *id, const short idcode) { @@ -638,7 +566,7 @@ static std::optional<std::string> create_socket_inspection_string(TreeDrawContex const bNodeSocket &socket) { using namespace blender::nodes::geo_eval_log; - ValueLog *value_log = find_socket_value_log(*tree_draw_ctx.geo_tree_log, socket); + ValueLog *value_log = tree_draw_ctx.geo_tree_log->find_socket_value_log(socket); if (value_log == nullptr) { return std::nullopt; } diff --git a/source/blender/editors/space_node/node_geometry_attribute_search.cc b/source/blender/editors/space_node/node_geometry_attribute_search.cc index d65647aead0..c9dbc1649c4 100644 --- a/source/blender/editors/space_node/node_geometry_attribute_search.cc +++ b/source/blender/editors/space_node/node_geometry_attribute_search.cc @@ -93,7 +93,7 @@ static Vector<const GeometryAttributeInfo *> get_attribute_info_from_context( if (input_socket->type != SOCK_GEOMETRY) { continue; } - const ValueLog *value_log = find_socket_value_log(*tree_log, *input_socket); + const ValueLog *value_log = tree_log->find_socket_value_log(*input_socket); if (value_log == nullptr) { continue; } diff --git a/source/blender/editors/space_node/node_intern.hh b/source/blender/editors/space_node/node_intern.hh index da0f3589c3f..b9435a00843 100644 --- a/source/blender/editors/space_node/node_intern.hh +++ b/source/blender/editors/space_node/node_intern.hh @@ -155,9 +155,6 @@ void node_socket_add_tooltip(const bNodeTree &ntree, const bNodeSocket &sock, uiLayout &layout); -nodes::geo_eval_log::ValueLog *find_socket_value_log(nodes::geo_eval_log::GeoTreeLog &tree_log, - const bNodeSocket &query_socket); - /** * Sort nodes by selection: unselected nodes first, then selected, * then the active node at the very end. Relative order is kept intact. diff --git a/source/blender/nodes/NOD_geometry_nodes_log.hh b/source/blender/nodes/NOD_geometry_nodes_log.hh index b04ae35a41f..b8fb55abffb 100644 --- a/source/blender/nodes/NOD_geometry_nodes_log.hh +++ b/source/blender/nodes/NOD_geometry_nodes_log.hh @@ -171,6 +171,8 @@ class GeoTreeLog { void ensure_socket_values(); void ensure_viewer_node_logs(); void ensure_existing_attributes(); + + ValueLog *find_socket_value_log(const bNodeSocket &query_socket); }; class GeoModifierLog { diff --git a/source/blender/nodes/intern/geometry_nodes_log.cc b/source/blender/nodes/intern/geometry_nodes_log.cc index e099c8be2de..c907f475771 100644 --- a/source/blender/nodes/intern/geometry_nodes_log.cc +++ b/source/blender/nodes/intern/geometry_nodes_log.cc @@ -5,6 +5,7 @@ #include "BKE_compute_contexts.hh" #include "BKE_curves.hh" +#include "BKE_node_runtime.hh" #include "FN_field_cpp_type.hh" @@ -289,6 +290,82 @@ void GeoTreeLog::ensure_existing_attributes() reduced_existing_attributes_ = true; } +ValueLog *GeoTreeLog::find_socket_value_log(const bNodeSocket &query_socket) +{ + /** + * Geometry nodes does not log values for every socket. That would produce a lot of redundant + * data,because often many linked sockets have the same value. To find the logged value for a + * socket one might have to look at linked sockets as well. + */ + + BLI_assert(reduced_socket_values_); + if (query_socket.is_multi_input()) { + /* Not supported currently. */ + 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 = this->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; +} + GeoTreeLogger &GeoModifierLog::get_local_tree_logger(const ComputeContext &compute_context) { LocalData &local_data = data_per_thread_.local(); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs