From a57709ca253bb7a20fa24f2ab3e1b2486601de1d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 24 Jul 2025 08:13:34 +0200 Subject: [PATCH] Fix #142828: broken socket usage inference for some nodes The issue was an oversight in f7f18cd0c74871671e32229c291c9176e9d68f7f. This patch also adds some unit tests that would have caught this error. Pull Request: https://projects.blender.org/blender/blender/pulls/143026 --- .../nodes/intern/socket_usage_inference.cc | 3 +- .../node_group/socket_usage_inference.blend | 3 + tests/python/CMakeLists.txt | 7 ++ .../python/bl_node_socket_usage_inference.py | 84 +++++++++++++++++++ 4 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 tests/files/node_group/socket_usage_inference.blend create mode 100644 tests/python/bl_node_socket_usage_inference.py diff --git a/source/blender/nodes/intern/socket_usage_inference.cc b/source/blender/nodes/intern/socket_usage_inference.cc index 90696a26329..3f69feb8013 100644 --- a/source/blender/nodes/intern/socket_usage_inference.cc +++ b/source/blender/nodes/intern/socket_usage_inference.cc @@ -438,7 +438,8 @@ struct SocketUsageInferencer { return; } if (!socket_decl->usage_inference_fn) { - all_socket_usages_.add_new(socket, true); + this->usage_task__with_dependent_sockets( + socket, socket->owner_node().output_sockets(), {}, socket.context); return; } InputSocketUsageParams params{ diff --git a/tests/files/node_group/socket_usage_inference.blend b/tests/files/node_group/socket_usage_inference.blend new file mode 100644 index 00000000000..9a91d5e35df --- /dev/null +++ b/tests/files/node_group/socket_usage_inference.blend @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:283e81209fb5aa84e41871c3237d4e8669d3e0ec8a71aafb39cc24324bb995be +size 540679 diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt index 0139dac2195..b0d7a51b470 100644 --- a/tests/python/CMakeLists.txt +++ b/tests/python/CMakeLists.txt @@ -606,6 +606,13 @@ if(TEST_SRC_DIR_EXISTS) --testdir "${TEST_SRC_DIR}/node_group" ) + add_blender_test( + bl_node_socket_usage_inference + --python ${CMAKE_CURRENT_LIST_DIR}/bl_node_socket_usage_inference.py + -- + --testdir "${TEST_SRC_DIR}/node_group" + ) + add_blender_test( bl_node_group_compat --python ${CMAKE_CURRENT_LIST_DIR}/bl_node_group_compat.py diff --git a/tests/python/bl_node_socket_usage_inference.py b/tests/python/bl_node_socket_usage_inference.py new file mode 100644 index 00000000000..1b55ffdaa05 --- /dev/null +++ b/tests/python/bl_node_socket_usage_inference.py @@ -0,0 +1,84 @@ +# SPDX-FileCopyrightText: 2025 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import pathlib +import sys +import tempfile +import bpy +import unittest + +args = None + + +class StructureTypeInferenceTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.testdir = args.testdir + + def setUp(self): + self.assertTrue(self.testdir.exists(), + "Test dir {0} should exist".format(self.testdir)) + + def load_testfile(self): + bpy.ops.wm.open_mainfile(filepath=str(self.testdir / "socket_usage_inference.blend")) + + def assertUsed(self, socket): + self.assertTrue(socket.is_icon_visible) + self.assertFalse(socket.is_inactive) + + def assertGrayedOut(self, socket): + self.assertTrue(socket.is_icon_visible) + self.assertTrue(socket.is_inactive) + + def assertHidden(self, socket): + self.assertFalse(socket.is_icon_visible) + + def test_geometry_nodes(self): + self.load_testfile() + tree = bpy.data.node_groups["Geometry Nodes"] + + node = tree.nodes["Math Group"] + self.assertUsed(node.inputs["A"]) + self.assertUsed(node.inputs["B"]) + + node = tree.nodes["Menu Switch Group"] + self.assertUsed(node.inputs["Menu"]) + self.assertUsed(node.inputs["A"]) + self.assertHidden(node.inputs["B"]) + + node = tree.nodes["Transform Matrix"] + self.assertUsed(node.inputs["Mode"]) + self.assertUsed(node.inputs["Geometry"]) + self.assertUsed(node.inputs["Transform"]) + self.assertHidden(node.inputs["Translation"]) + self.assertHidden(node.inputs["Rotation"]) + self.assertHidden(node.inputs["Scale"]) + + node = tree.nodes["Transform Components"] + self.assertUsed(node.inputs["Mode"]) + self.assertUsed(node.inputs["Geometry"]) + self.assertUsed(node.inputs["Translation"]) + self.assertUsed(node.inputs["Rotation"]) + self.assertUsed(node.inputs["Scale"]) + self.assertHidden(node.inputs["Transform"]) + + +def main(): + global args + import argparse + + if '--' in sys.argv: + argv = [sys.argv[0]] + sys.argv[sys.argv.index('--') + 1:] + else: + argv = sys.argv + + parser = argparse.ArgumentParser() + parser.add_argument('--testdir', required=True, type=pathlib.Path) + args, remaining = parser.parse_known_args(argv) + + unittest.main(argv=remaining) + + +if __name__ == "__main__": + main()