Fix #116477: Node group sockets with subtypes have broken idnames

Loading pre-4.0.20 node groups with sockets using subtypes causes
broken socket identifiers. This is because the node tree interface now
expects sockets to use the base identifiers ("NodeSocketFloat" instead
of "NodeSocketFloatFactor" etc.).

To correct this the conversion code now replaces socket idnames that
include a subtype suffix with their base names. This fix is also applied
to files between versions 4.0.20 and 4.1.10, where the socket types
may have been converted incorrectly.

Pull Request: https://projects.blender.org/blender/blender/pulls/117133
This commit is contained in:
Lukas Tönne
2024-01-16 15:32:33 +01:00
parent ccd85adabb
commit 83d3ba8a58
4 changed files with 154 additions and 11 deletions

View File

@@ -14,7 +14,25 @@ import bpy
args = None
type_info = {
base_idname = {
"VALUE": "NodeSocketFloat",
"INT": "NodeSocketInt",
"BOOLEAN": "NodeSocketBool",
"ROTATION": "NodeSocketRotation",
"VECTOR": "NodeSocketVector",
"RGBA": "NodeSocketColor",
"STRING": "NodeSocketString",
"SHADER": "NodeSocketShader",
"OBJECT": "NodeSocketObject",
"IMAGE": "NodeSocketImage",
"GEOMETRY": "NodeSocketGeometry",
"COLLECTION": "NodeSocketCollection",
"TEXTURE": "NodeSocketTexture",
"MATERIAL": "NodeSocketMaterial",
}
subtype_idname = {
("VALUE", "NONE"): "NodeSocketFloat",
("VALUE", "UNSIGNED"): "NodeSocketFloatUnsigned",
("VALUE", "PERCENTAGE"): "NodeSocketFloatPercentage",
@@ -63,8 +81,12 @@ class SocketSpec():
external_links: int = 1
@property
def idname(self):
return type_info[(self.type, self.subtype)]
def base_idname(self):
return base_idname[self.type]
@property
def subtype_idname(self):
return subtype_idname[(self.type, self.subtype)]
class AbstractNodeGroupInterfaceTest(unittest.TestCase):
@@ -95,7 +117,7 @@ class AbstractNodeGroupInterfaceTest(unittest.TestCase):
# Examine the interface item.
self.assertEqual(item.name, spec.name)
self.assertEqual(item.bl_socket_idname, spec.idname)
self.assertEqual(item.bl_socket_idname, spec.base_idname)
self.assertEqual(item.identifier, spec.identifier)
# Types that have subtypes.
@@ -134,7 +156,7 @@ class AbstractNodeGroupInterfaceTest(unittest.TestCase):
socket = next(s for s in node.inputs if s.identifier == spec.identifier)
self.assertIsNotNone(socket, f"Could not find socket for group input identifier {spec.identifier}")
self.assertEqual(socket.name, spec.name)
self.assertEqual(socket.bl_idname, spec.idname)
self.assertEqual(socket.bl_idname, spec.subtype_idname)
self.assertEqual(socket.type, spec.type)
self.assertEqual(socket.hide_value, spec.hide_value)
if test_links:
@@ -147,7 +169,7 @@ class AbstractNodeGroupInterfaceTest(unittest.TestCase):
self.assertIsNotNone(
socket, f"Could not find group input socket for group input identifier {spec.identifier}")
self.assertEqual(socket.name, spec.name)
self.assertEqual(socket.bl_idname, spec.idname)
self.assertEqual(socket.bl_idname, spec.subtype_idname)
self.assertEqual(socket.type, spec.type)
self.assertEqual(socket.hide_value, spec.hide_value)
if test_links:
@@ -158,7 +180,7 @@ class AbstractNodeGroupInterfaceTest(unittest.TestCase):
socket = next(s for s in node.outputs if s.identifier == spec.identifier)
self.assertIsNotNone(socket, f"Could not find socket for group output identifier {spec.identifier}")
self.assertEqual(socket.name, spec.name)
self.assertEqual(socket.bl_idname, spec.idname)
self.assertEqual(socket.bl_idname, spec.subtype_idname)
self.assertEqual(socket.type, spec.type)
self.assertEqual(socket.hide_value, spec.hide_value)
if test_links:
@@ -171,7 +193,7 @@ class AbstractNodeGroupInterfaceTest(unittest.TestCase):
self.assertIsNotNone(
socket, f"Could not find group output socket for group output identifier {spec.identifier}")
self.assertEqual(socket.name, spec.name)
self.assertEqual(socket.bl_idname, spec.idname)
self.assertEqual(socket.bl_idname, spec.subtype_idname)
self.assertEqual(socket.type, spec.type)
self.assertEqual(socket.hide_value, spec.hide_value)
if test_links: