diff --git a/source/blender/editors/space_node/node_relationships.cc b/source/blender/editors/space_node/node_relationships.cc index f246ce61108..62252bad782 100644 --- a/source/blender/editors/space_node/node_relationships.cc +++ b/source/blender/editors/space_node/node_relationships.cc @@ -50,6 +50,7 @@ #include "BLT_translation.h" #include "NOD_node_declaration.hh" +#include "NOD_socket.hh" #include "NOD_socket_declarations.hh" #include "NOD_socket_declarations_geometry.hh" @@ -447,21 +448,24 @@ static bNodeSocket *node_link_viewer_get_socket(bNodeTree &ntree, return (bNodeSocket *)viewer_node.inputs.first; } /* For the geometry nodes viewer, find the socket with the correct type. */ - LISTBASE_FOREACH (bNodeSocket *, viewer_socket, &viewer_node.inputs) { - if (viewer_socket->type == src_socket.type) { - if (viewer_socket->type == SOCK_GEOMETRY) { - return viewer_socket; - } - NodeGeometryViewer *storage = (NodeGeometryViewer *)viewer_node.storage; - const eCustomDataType data_type = *bke::socket_type_to_custom_data_type( - eNodeSocketDatatype(src_socket.type)); - BLI_assert(data_type != CD_AUTO_FROM_NAME); - storage->data_type = data_type; - viewer_node.typeinfo->updatefunc(&ntree, &viewer_node); - return viewer_socket; - } + + if (src_socket.type == SOCK_GEOMETRY) { + return static_cast(viewer_node.inputs.first); } - return nullptr; + + ntree.ensure_topology_cache(); + if (!socket_can_be_viewed(src_socket.owner_node(), src_socket)) { + return nullptr; + } + + NodeGeometryViewer &storage = *static_cast(viewer_node.storage); + const eCustomDataType data_type = *bke::socket_type_to_custom_data_type( + eNodeSocketDatatype(src_socket.type)); + BLI_assert(data_type != CD_AUTO_FROM_NAME); + storage.data_type = data_type; + nodes::update_node_declaration_and_sockets(ntree, viewer_node); + + return static_cast(viewer_node.inputs.last); } static bool is_viewer_node(const bNode &node)