From 067daec2709178ca418c57095165583a1191f11f Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Wed, 20 Mar 2024 11:26:07 +0100 Subject: [PATCH] Nodes: don't use combined input/output sockets in node tree interface Those shouldn't really exist at all currently, since we forbid them in 354915cf3c87b. Unfortunately, not all cases were removed, and many node trees with such sockets have been created during the development of 4.1 due to the auto-smooth changes. I'm not entirely sure if it's still possible to properly remove them now. The commit above mentions that we might lose links due to changed identifiers. Maybe we're better off just supporting these inlined sockets while also allowing the "align with previous socket" functionality. Either way, not creating more of such node trees for now is reasonable, since we explicitly disabled that functionality for now. Pull Request: https://projects.blender.org/blender/blender/pulls/119654 --- .../blenkernel/intern/mesh_legacy_convert.cc | 23 +++++++++---------- .../blenkernel/intern/node_tree_interface.cc | 4 ++++ .../blenloader/intern/versioning_300.cc | 9 ++++---- .../editors/curves/intern/curves_add.cc | 9 ++++---- .../usd/intern/usd_reader_pointinstancer.cc | 9 ++++---- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh_legacy_convert.cc b/source/blender/blenkernel/intern/mesh_legacy_convert.cc index bbe66337c79..d18b185b544 100644 --- a/source/blender/blenkernel/intern/mesh_legacy_convert.cc +++ b/source/blender/blenkernel/intern/mesh_legacy_convert.cc @@ -2128,11 +2128,10 @@ static bNodeTree *add_auto_smooth_node_tree(Main &bmain) } group->geometry_node_asset_traits->flag |= GEO_NODE_ASSET_MODIFIER; - group->tree_interface.add_socket(DATA_("Geometry"), - "", - "NodeSocketGeometry", - NODE_INTERFACE_SOCKET_INPUT | NODE_INTERFACE_SOCKET_OUTPUT, - nullptr); + group->tree_interface.add_socket( + DATA_("Geometry"), "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_OUTPUT, nullptr); + group->tree_interface.add_socket( + DATA_("Geometry"), "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_INPUT, nullptr); bNodeTreeInterfaceSocket *angle_io_socket = group->tree_interface.add_socket( DATA_("Angle"), "", "NodeSocketFloat", NODE_INTERFACE_SOCKET_INPUT, nullptr); auto &angle_data = *static_cast(angle_io_socket->socket_data); @@ -2147,7 +2146,7 @@ static bNodeTree *add_auto_smooth_node_tree(Main &bmain) group_input_angle->locx = -420.0f; group_input_angle->locy = -300.0f; LISTBASE_FOREACH (bNodeSocket *, socket, &group_input_angle->outputs) { - if (!STREQ(socket->identifier, "Socket_1")) { + if (!STREQ(socket->identifier, "Socket_2")) { socket->flag |= SOCK_HIDDEN; } } @@ -2155,7 +2154,7 @@ static bNodeTree *add_auto_smooth_node_tree(Main &bmain) group_input_mesh->locx = -60.0f; group_input_mesh->locy = -100.0f; LISTBASE_FOREACH (bNodeSocket *, socket, &group_input_mesh->outputs) { - if (!STREQ(socket->identifier, "Socket_0")) { + if (!STREQ(socket->identifier, "Socket_1")) { socket->flag |= SOCK_HIDDEN; } } @@ -2198,7 +2197,7 @@ static bNodeTree *add_auto_smooth_node_tree(Main &bmain) nodeFindSocket(group_output, SOCK_IN, "Socket_0")); nodeAddLink(group, group_input_angle, - nodeFindSocket(group_input_angle, SOCK_OUT, "Socket_1"), + nodeFindSocket(group_input_angle, SOCK_OUT, "Socket_2"), less_than_or_equal, nodeFindSocket(less_than_or_equal, SOCK_IN, "B")); nodeAddLink(group, @@ -2213,7 +2212,7 @@ static bNodeTree *add_auto_smooth_node_tree(Main &bmain) nodeFindSocket(boolean_and, SOCK_IN, "Boolean_001")); nodeAddLink(group, group_input_mesh, - nodeFindSocket(group_input_mesh, SOCK_OUT, "Socket_0"), + nodeFindSocket(group_input_mesh, SOCK_OUT, "Socket_1"), shade_smooth_edge, nodeFindSocket(shade_smooth_edge, SOCK_IN, "Geometry")); nodeAddLink(group, @@ -2337,14 +2336,14 @@ static ModifierData *create_auto_smooth_modifier( id_us_plus(&md->node_group->id); md->settings.properties = idprop::create_group("Nodes Modifier Settings").release(); - IDProperty *angle_prop = idprop::create("Socket_1", angle).release(); + IDProperty *angle_prop = idprop::create("Socket_2", angle).release(); auto *ui_data = reinterpret_cast(IDP_ui_data_ensure(angle_prop)); ui_data->base.rna_subtype = PROP_ANGLE; ui_data->soft_min = 0.0f; ui_data->soft_max = DEG2RADF(180.0f); IDP_AddToGroup(md->settings.properties, angle_prop); - IDP_AddToGroup(md->settings.properties, idprop::create("Socket_1_use_attribute", 0).release()); - IDP_AddToGroup(md->settings.properties, idprop::create("Socket_1_attribute_name", "").release()); + IDP_AddToGroup(md->settings.properties, idprop::create("Socket_2_use_attribute", 0).release()); + IDP_AddToGroup(md->settings.properties, idprop::create("Socket_2_attribute_name", "").release()); BKE_modifiers_persistent_uid_init(object, md->modifier); return &md->modifier; diff --git a/source/blender/blenkernel/intern/node_tree_interface.cc b/source/blender/blenkernel/intern/node_tree_interface.cc index eca2c2c2f22..f16ff37cbd2 100644 --- a/source/blender/blenkernel/intern/node_tree_interface.cc +++ b/source/blender/blenkernel/intern/node_tree_interface.cc @@ -1190,6 +1190,10 @@ bNodeTreeInterfaceSocket *bNodeTreeInterface::add_socket(const blender::StringRe const NodeTreeInterfaceSocketFlag flag, bNodeTreeInterfacePanel *parent) { + /* Check that each interface socket is either an input or an output. Technically, it can be both + * at the same time, but we don't want that for the time being. */ + BLI_assert(((NODE_INTERFACE_SOCKET_INPUT | NODE_INTERFACE_SOCKET_OUTPUT) & flag) != + (NODE_INTERFACE_SOCKET_INPUT | NODE_INTERFACE_SOCKET_OUTPUT)); if (parent == nullptr) { parent = &root_panel; } diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index ec8dda52171..60fd9864eef 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -554,11 +554,10 @@ static bNodeTree *add_realize_node_tree(Main *bmain) { bNodeTree *node_tree = ntreeAddTree(bmain, "Realize Instances 2.93 Legacy", "GeometryNodeTree"); - node_tree->tree_interface.add_socket("Geometry", - "", - "NodeSocketGeometry", - NODE_INTERFACE_SOCKET_INPUT | NODE_INTERFACE_SOCKET_OUTPUT, - nullptr); + node_tree->tree_interface.add_socket( + "Geometry", "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_OUTPUT, nullptr); + node_tree->tree_interface.add_socket( + "Geometry", "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_INPUT, nullptr); bNode *group_input = nodeAddStaticNode(nullptr, node_tree, NODE_GROUP_INPUT); group_input->locx = -400.0f; diff --git a/source/blender/editors/curves/intern/curves_add.cc b/source/blender/editors/curves/intern/curves_add.cc index 980ec5765f3..01f1bdff7de 100644 --- a/source/blender/editors/curves/intern/curves_add.cc +++ b/source/blender/editors/curves/intern/curves_add.cc @@ -74,11 +74,10 @@ void ensure_surface_deformation_node_exists(bContext &C, Object &curves_ob) nmd.node_group = ntreeAddTree(bmain, DATA_("Surface Deform"), "GeometryNodeTree"); bNodeTree *ntree = nmd.node_group; - ntree->tree_interface.add_socket("Geometry", - "", - "NodeSocketGeometry", - NODE_INTERFACE_SOCKET_INPUT | NODE_INTERFACE_SOCKET_OUTPUT, - nullptr); + ntree->tree_interface.add_socket( + "Geometry", "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_OUTPUT, nullptr); + ntree->tree_interface.add_socket( + "Geometry", "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_INPUT, nullptr); bNode *group_input = nodeAddStaticNode(&C, ntree, NODE_GROUP_INPUT); bNode *group_output = nodeAddStaticNode(&C, ntree, NODE_GROUP_OUTPUT); bNode *deform_node = nodeAddStaticNode(&C, ntree, GEO_NODE_DEFORM_CURVES_ON_SURFACE); diff --git a/source/blender/io/usd/intern/usd_reader_pointinstancer.cc b/source/blender/io/usd/intern/usd_reader_pointinstancer.cc index 0a09a779979..e1209f88ad5 100644 --- a/source/blender/io/usd/intern/usd_reader_pointinstancer.cc +++ b/source/blender/io/usd/intern/usd_reader_pointinstancer.cc @@ -162,11 +162,10 @@ void USDPointInstancerReader::read_object_data(Main *bmain, const double motionS bNodeTree *ntree = nmd.node_group; - ntree->tree_interface.add_socket("Geometry", - "", - "NodeSocketGeometry", - NODE_INTERFACE_SOCKET_INPUT | NODE_INTERFACE_SOCKET_OUTPUT, - nullptr); + ntree->tree_interface.add_socket( + "Geometry", "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_OUTPUT, nullptr); + ntree->tree_interface.add_socket( + "Geometry", "", "NodeSocketGeometry", NODE_INTERFACE_SOCKET_INPUT, nullptr); bNode *group_input = nodeAddStaticNode(nullptr, ntree, NODE_GROUP_INPUT); group_input->locx = -400.0f; bNode *group_output = nodeAddStaticNode(nullptr, ntree, NODE_GROUP_OUTPUT);