From 79d37720de2ed3a42e822a8b11297f9a60bba00f Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Thu, 15 May 2025 08:29:41 +0200 Subject: [PATCH] Nodes: Add Factor and Percentage subtypes for vector sockets This patch adds support for the Factor and Percentage subtypes for vector sockets. This is needed by the compositor, since it has some node inputs that specify locations and sizes relative to image size, and having factor and percentage subtypes for those improves the UX quite a bit according to user feedback. Pull Request: https://projects.blender.org/blender/blender/pulls/138805 --- source/blender/blenkernel/BKE_node_tree_interface.hh | 5 +++++ source/blender/blenkernel/intern/node.cc | 12 ++++++++++++ source/blender/makesrna/intern/rna_node_socket.cc | 5 +++++ .../makesrna/intern/rna_node_tree_interface.cc | 4 +++- source/blender/nodes/intern/node_socket.cc | 2 ++ tests/python/bl_node_group_compat.py | 2 ++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/source/blender/blenkernel/BKE_node_tree_interface.hh b/source/blender/blenkernel/BKE_node_tree_interface.hh index 74b924ad1e4..c7f7d5863ec 100644 --- a/source/blender/blenkernel/BKE_node_tree_interface.hh +++ b/source/blender/blenkernel/BKE_node_tree_interface.hh @@ -147,6 +147,11 @@ static const bNodeSocketStaticTypeInfo node_socket_subtypes[] = { {"NodeSocketRotation", "NodeTreeInterfaceSocketRotation", SOCK_ROTATION, PROP_NONE}, {"NodeSocketMatrix", "NodeTreeInterfaceSocketMatrix", SOCK_MATRIX, PROP_NONE}, {"NodeSocketVector", "NodeTreeInterfaceSocketVector", SOCK_VECTOR, PROP_NONE}, + {"NodeSocketVectorFactor", "NodeTreeInterfaceSocketVectorFactor", SOCK_VECTOR, PROP_FACTOR}, + {"NodeSocketVectorPercentage", + "NodeTreeInterfaceSocketVectorPercentage", + SOCK_VECTOR, + PROP_PERCENTAGE}, {"NodeSocketVectorTranslation", "NodeTreeInterfaceSocketVectorTranslation", SOCK_VECTOR, diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 045bf069c30..f60c0ef5475 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -537,6 +537,10 @@ static StringRef get_legacy_socket_subtype_idname(StringRef idname, const void * const bNodeSocketValueVector &vector_data = *static_cast( socket_data); switch (vector_data.subtype) { + case PROP_FACTOR: + return "NodeSocketVectorFactor"; + case PROP_PERCENTAGE: + return "NodeSocketVectorPercentage"; case PROP_TRANSLATION: return "NodeSocketVectorTranslation"; case PROP_DIRECTION: @@ -2547,6 +2551,10 @@ std::optional node_static_socket_type(const int type, const int s return "NodeSocketMatrix"; case SOCK_VECTOR: switch (PropertySubType(subtype)) { + case PROP_FACTOR: + return "NodeSocketVectorFactor"; + case PROP_PERCENTAGE: + return "NodeSocketVectorPercentage"; case PROP_TRANSLATION: return "NodeSocketVectorTranslation"; case PROP_DIRECTION: @@ -2648,6 +2656,10 @@ std::optional node_static_socket_interface_type_new(const int typ return "NodeTreeInterfaceSocketMatrix"; case SOCK_VECTOR: switch (PropertySubType(subtype)) { + case PROP_FACTOR: + return "NodeTreeInterfaceSocketVectorFactor"; + case PROP_PERCENTAGE: + return "NodeTreeInterfaceSocketVectorPercentage"; case PROP_TRANSLATION: return "NodeTreeInterfaceSocketVectorTranslation"; case PROP_DIRECTION: diff --git a/source/blender/makesrna/intern/rna_node_socket.cc b/source/blender/makesrna/intern/rna_node_socket.cc index 620072b1704..ffc2343ca00 100644 --- a/source/blender/makesrna/intern/rna_node_socket.cc +++ b/source/blender/makesrna/intern/rna_node_socket.cc @@ -1811,6 +1811,11 @@ static const bNodeSocketStaticTypeInfo node_socket_subtypes[] = { {"NodeSocketRotation", "NodeTreeInterfaceSocketRotation", SOCK_ROTATION, PROP_NONE}, {"NodeSocketMatrix", "NodeTreeInterfaceSocketMatrix", SOCK_MATRIX, PROP_NONE}, {"NodeSocketVector", "NodeTreeInterfaceSocketVector", SOCK_VECTOR, PROP_NONE}, + {"NodeSocketVectorFactor", "NodeTreeInterfaceSocketVectorFactor", SOCK_VECTOR, PROP_FACTOR}, + {"NodeSocketVectorPercentage", + "NodeTreeInterfaceSocketVectorPercentage", + SOCK_VECTOR, + PROP_PERCENTAGE}, {"NodeSocketVectorTranslation", "NodeTreeInterfaceSocketVectorTranslation", SOCK_VECTOR, diff --git a/source/blender/makesrna/intern/rna_node_tree_interface.cc b/source/blender/makesrna/intern/rna_node_tree_interface.cc index 58684776322..4d9164205a7 100644 --- a/source/blender/makesrna/intern/rna_node_tree_interface.cc +++ b/source/blender/makesrna/intern/rna_node_tree_interface.cc @@ -774,7 +774,9 @@ void rna_NodeTreeInterfaceSocketInt_default_value_range( static const EnumPropertyItem *rna_NodeTreeInterfaceSocketVector_subtype_itemf( bContext * /*C*/, PointerRNA * /*ptr*/, PropertyRNA * /*prop*/, bool *r_free) { - return rna_subtype_filter_itemf({PROP_TRANSLATION, + return rna_subtype_filter_itemf({PROP_FACTOR, + PROP_PERCENTAGE, + PROP_TRANSLATION, PROP_DIRECTION, PROP_VELOCITY, PROP_ACCELERATION, diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc index ff35e597c1f..b597e979e18 100644 --- a/source/blender/nodes/intern/node_socket.cc +++ b/source/blender/nodes/intern/node_socket.cc @@ -1217,6 +1217,8 @@ void register_standard_node_socket_types() bke::node_register_socket_type(*make_socket_type_matrix()); bke::node_register_socket_type(*make_socket_type_vector(PROP_NONE)); + bke::node_register_socket_type(*make_socket_type_vector(PROP_FACTOR)); + bke::node_register_socket_type(*make_socket_type_vector(PROP_PERCENTAGE)); bke::node_register_socket_type(*make_socket_type_vector(PROP_TRANSLATION)); bke::node_register_socket_type(*make_socket_type_vector(PROP_DIRECTION)); bke::node_register_socket_type(*make_socket_type_vector(PROP_VELOCITY)); diff --git a/tests/python/bl_node_group_compat.py b/tests/python/bl_node_group_compat.py index 11188746b1c..6337655ee83 100644 --- a/tests/python/bl_node_group_compat.py +++ b/tests/python/bl_node_group_compat.py @@ -48,6 +48,8 @@ subtype_idname = { ("BOOLEAN", "NONE"): "NodeSocketBool", ("ROTATION", "NONE"): "NodeSocketRotation", ("VECTOR", "NONE"): "NodeSocketVector", + ("VECTOR", "FACTOR"): "NodeSocketVectorFactor", + ("VECTOR", "PERCENTAGE"): "NodeSocketVectorPercentage", ("VECTOR", "TRANSLATION"): "NodeSocketVectorTranslation", ("VECTOR", "DIRECTION"): "NodeSocketVectorDirection", ("VECTOR", "VELOCITY"): "NodeSocketVectorVelocity",