Refactor: Geometry Nodes: remove bNodeSocketType::geometry_nodes_cpp_type

This type was the same for every socket type supported by Geometry Nodes.
It's always `SocketValueVariant` now. Therefore, it was unnecessary to s
tore an explicit pointer to it.

Pull Request: https://projects.blender.org/blender/blender/pulls/144458
This commit is contained in:
Jacques Lucke
2025-08-12 20:09:52 +02:00
parent ce7759bae6
commit cea51d82be
4 changed files with 38 additions and 83 deletions

View File

@@ -205,8 +205,6 @@ struct bNodeSocketType {
const blender::CPPType *base_cpp_type = nullptr;
/* Get the value of this socket in a generic way. */
SocketGetCPPValueFunction get_base_cpp_value = nullptr;
/* Get geometry nodes cpp type. */
const blender::CPPType *geometry_nodes_cpp_type = nullptr;
/* Get geometry nodes cpp value. */
SocketGetGeometryNodesCPPValueFunction get_geometry_nodes_cpp_value = nullptr;
/* Default value for this socket type. */

View File

@@ -45,8 +45,7 @@ struct BundleItemValue {
};
/**
* A bundle is a map containing keys and their corresponding values. Values are stored as the type
* they have in Geometry Nodes (#bNodeSocketType::geometry_nodes_cpp_type).
* A bundle is a map containing keys and their corresponding values.
*
* The API also supports working with paths in nested bundles like `root/child/data`.
*/

View File

@@ -72,21 +72,6 @@ using bke::node_tree_reference_lifetimes::ReferenceLifetimesInfo;
using bke::node_tree_reference_lifetimes::ReferenceSetInfo;
using bke::node_tree_reference_lifetimes::ReferenceSetType;
static const CPPType *get_socket_cpp_type(const bke::bNodeSocketType &typeinfo)
{
const CPPType *type = typeinfo.geometry_nodes_cpp_type;
if (type == nullptr) {
return nullptr;
}
BLI_assert(type->has_special_member_functions);
return type;
}
static const CPPType *get_socket_cpp_type(const bNodeSocket &socket)
{
return get_socket_cpp_type(*socket.typeinfo);
}
/**
* Checks which sockets of the node are available and creates corresponding inputs/outputs on the
* lazy-function.
@@ -102,13 +87,16 @@ static void lazy_function_interface_from_node(const bNode &node,
if (!socket->is_available()) {
continue;
}
const CPPType *type = get_socket_cpp_type(*socket);
if (type == nullptr) {
if (!socket->typeinfo->geometry_nodes_default_value) {
continue;
}
const CPPType *type;
if (socket->is_multi_input() && !is_muted) {
type = &CPPType::get<GeoNodesMultiInput<SocketValueVariant>>();
}
else {
type = &CPPType::get<SocketValueVariant>();
}
r_lf_index_by_bsocket[socket->index_in_tree()] = r_inputs.append_and_get_index_as(
socket->name, *type, input_usage);
}
@@ -116,12 +104,11 @@ static void lazy_function_interface_from_node(const bNode &node,
if (!socket->is_available()) {
continue;
}
const CPPType *type = get_socket_cpp_type(*socket);
if (type == nullptr) {
if (!socket->typeinfo->geometry_nodes_default_value) {
continue;
}
r_lf_index_by_bsocket[socket->index_in_tree()] = r_outputs.append_and_get_index_as(
socket->name, *type);
socket->name, CPPType::get<SocketValueVariant>());
}
}
@@ -352,11 +339,11 @@ class LazyFunctionForMultiInput : public LazyFunction {
*/
class LazyFunctionForRerouteNode : public LazyFunction {
public:
LazyFunctionForRerouteNode(const CPPType &type)
LazyFunctionForRerouteNode()
{
debug_name_ = "Reroute";
inputs_.append({"Input", type});
outputs_.append({"Output", type});
inputs_.append({"Input", CPPType::get<SocketValueVariant>()});
outputs_.append({"Output", CPPType::get<SocketValueVariant>()});
}
void execute_impl(lf::Params &params, const lf::Context & /*context*/) const override
@@ -613,11 +600,11 @@ const LazyFunction *build_implicit_conversion_lazy_function(const bke::bNodeSock
const bke::bNodeSocketType &to_type,
ResourceScope &scope)
{
if (!from_type.geometry_nodes_cpp_type || !to_type.geometry_nodes_cpp_type) {
if (!from_type.geometry_nodes_default_value || !to_type.geometry_nodes_default_value) {
return nullptr;
}
if (from_type.type == to_type.type) {
return &scope.construct<LazyFunctionForRerouteNode>(*from_type.geometry_nodes_cpp_type);
return &scope.construct<LazyFunctionForRerouteNode>();
}
const bke::DataTypeConversions &conversions = bke::get_implicit_type_conversions();
const CPPType &from_base_type = *from_type.base_cpp_type;
@@ -979,14 +966,13 @@ class LazyFunctionForGizmoNode : public LazyFunction {
if (link->fromnode->is_dangling_reroute()) {
continue;
}
inputs_.append_and_get_index_as(gizmo_socket.identifier,
*gizmo_socket.typeinfo->geometry_nodes_cpp_type,
lf::ValueUsage::Maybe);
inputs_.append_and_get_index_as(
gizmo_socket.identifier, CPPType::get<SocketValueVariant>(), lf::ValueUsage::Maybe);
gizmo_links.append(link);
}
for (const bNodeSocket *socket : bnode.input_sockets().drop_front(1)) {
r_lf_index_by_bsocket[socket->index_in_tree()] = inputs_.append_and_get_index_as(
socket->identifier, *socket->typeinfo->geometry_nodes_cpp_type, lf::ValueUsage::Maybe);
socket->identifier, CPPType::get<SocketValueVariant>(), lf::ValueUsage::Maybe);
}
r_lf_index_by_bsocket[bnode.output_socket(0).index_in_tree()] =
outputs_.append_and_get_index_as("Transform", CPPType::get<SocketValueVariant>());
@@ -1647,7 +1633,7 @@ static bool ignore_zone_bsocket(const bNodeSocket &bsocket)
if (!bsocket.is_available()) {
return true;
}
if (!bsocket.typeinfo->geometry_nodes_cpp_type) {
if (!bsocket.typeinfo->geometry_nodes_default_value) {
/* These are typically extend sockets. */
return true;
}
@@ -1666,25 +1652,22 @@ void initialize_zone_wrapper(const bNodeTreeZone &zone,
continue;
}
zone_info.indices.inputs.main.append(r_inputs.append_and_get_index_as(
socket->name, *socket->typeinfo->geometry_nodes_cpp_type, lf::ValueUsage::Maybe));
socket->name, CPPType::get<SocketValueVariant>(), lf::ValueUsage::Maybe));
}
for (const bNodeLink *link : zone.border_links) {
zone_info.indices.inputs.border_links.append(
r_inputs.append_and_get_index_as(link->fromsock->name,
*link->tosock->typeinfo->geometry_nodes_cpp_type,
lf::ValueUsage::Maybe));
zone_info.indices.inputs.border_links.append(r_inputs.append_and_get_index_as(
link->fromsock->name, CPPType::get<SocketValueVariant>(), lf::ValueUsage::Maybe));
}
for (const bNodeSocket *socket : zone.output_node()->output_sockets()) {
if (ignore_zone_bsocket(*socket)) {
continue;
}
const CPPType *cpp_type = socket->typeinfo->geometry_nodes_cpp_type;
zone_info.indices.inputs.output_usages.append(
r_inputs.append_and_get_index_as("Usage", CPPType::get<bool>(), lf::ValueUsage::Maybe));
zone_info.indices.outputs.main.append(
r_outputs.append_and_get_index_as(socket->name, *cpp_type));
r_outputs.append_and_get_index_as(socket->name, CPPType::get<SocketValueVariant>()));
}
for ([[maybe_unused]] const bNodeSocket *socket : zone.input_node()->input_sockets()) {
@@ -2068,7 +2051,7 @@ struct GeometryNodesLazyFunctionBuilder {
if (zone.input_node() != nullptr) {
for (const bNodeSocket *bsocket : zone.input_node()->input_sockets().drop_back(1)) {
zone_info.indices.inputs.main.append(lf_zone_inputs.append_and_get_index(
&lf_graph.add_input(*bsocket->typeinfo->geometry_nodes_cpp_type, bsocket->name)));
&lf_graph.add_input(CPPType::get<SocketValueVariant>(), bsocket->name)));
zone_info.indices.outputs.input_usages.append(lf_zone_outputs.append_and_get_index(
&lf_graph.add_output(CPPType::get<bool>(), "Usage: " + StringRef(bsocket->name))));
}
@@ -2081,7 +2064,7 @@ struct GeometryNodesLazyFunctionBuilder {
for (const bNodeSocket *bsocket : zone.output_node()->output_sockets().drop_back(1)) {
zone_info.indices.outputs.main.append(lf_zone_outputs.append_and_get_index(
&lf_graph.add_output(*bsocket->typeinfo->geometry_nodes_cpp_type, bsocket->name)));
&lf_graph.add_output(CPPType::get<SocketValueVariant>(), bsocket->name)));
zone_info.indices.inputs.output_usages.append(lf_zone_inputs.append_and_get_index(
&lf_graph.add_input(CPPType::get<bool>(), "Usage: " + StringRef(bsocket->name))));
}
@@ -2239,8 +2222,8 @@ struct GeometryNodesLazyFunctionBuilder {
if (ignore_zone_bsocket(*bsocket)) {
continue;
}
lf::GraphInputSocket &lf_input = lf_body_graph.add_input(
*bsocket->typeinfo->geometry_nodes_cpp_type, bsocket->name);
lf::GraphInputSocket &lf_input = lf_body_graph.add_input(CPPType::get<SocketValueVariant>(),
bsocket->name);
lf::GraphOutputSocket &lf_input_usage = lf_body_graph.add_output(
CPPType::get<bool>(), "Usage: " + StringRef(bsocket->name));
body_fn.indices.inputs.main.append(lf_body_inputs.append_and_get_index(&lf_input));
@@ -2259,7 +2242,7 @@ struct GeometryNodesLazyFunctionBuilder {
continue;
}
lf::GraphOutputSocket &lf_output = lf_body_graph.add_output(
*bsocket->typeinfo->geometry_nodes_cpp_type, bsocket->name);
CPPType::get<SocketValueVariant>(), bsocket->name);
lf::GraphInputSocket &lf_output_usage = lf_body_graph.add_input(
CPPType::get<bool>(), "Usage: " + StringRef(bsocket->name));
graph_params.lf_inputs_by_bsocket.add(bsocket, &lf_output);
@@ -2344,7 +2327,7 @@ struct GeometryNodesLazyFunctionBuilder {
{
for (const bNodeLink *border_link : zone.border_links) {
r_indices.append(r_lf_graph_inputs.append_and_get_index(
&lf_graph.add_input(*border_link->tosock->typeinfo->geometry_nodes_cpp_type,
&lf_graph.add_input(CPPType::get<SocketValueVariant>(),
StringRef("Link from ") + border_link->fromsock->name)));
}
}
@@ -2829,9 +2812,8 @@ struct GeometryNodesLazyFunctionBuilder {
{
const Span<const bNodeTreeInterfaceSocket *> interface_inputs = btree_.interface_inputs();
for (const bNodeTreeInterfaceSocket *interface_input : interface_inputs) {
const bke::bNodeSocketType *typeinfo = interface_input->socket_typeinfo();
lf::GraphInputSocket &lf_socket = lf_graph.add_input(
*typeinfo->geometry_nodes_cpp_type, interface_input->name ? interface_input->name : "");
CPPType::get<SocketValueVariant>(), interface_input->name ? interface_input->name : "");
group_input_sockets_.append(&lf_socket);
}
}
@@ -2844,14 +2826,10 @@ struct GeometryNodesLazyFunctionBuilder {
{
for (const bNodeTreeInterfaceSocket *interface_output : btree_.interface_outputs()) {
const bke::bNodeSocketType *typeinfo = interface_output->socket_typeinfo();
const CPPType &type = *typeinfo->geometry_nodes_cpp_type;
lf::GraphOutputSocket &lf_socket = lf_graph.add_output(
type, interface_output->name ? interface_output->name : "");
const void *default_value = typeinfo->geometry_nodes_default_value;
if (default_value == nullptr) {
default_value = type.default_value();
}
lf_socket.set_default_value(default_value);
CPPType::get<SocketValueVariant>(),
interface_output->name ? interface_output->name : "");
lf_socket.set_default_value(typeinfo->geometry_nodes_default_value);
standard_group_output_sockets_.append(&lf_socket);
}
}
@@ -3002,12 +2980,11 @@ struct GeometryNodesLazyFunctionBuilder {
{
const bNodeSocket &input_bsocket = bnode.input_socket(0);
const bNodeSocket &output_bsocket = bnode.output_socket(0);
const CPPType *type = get_socket_cpp_type(input_bsocket);
if (type == nullptr) {
if (!input_bsocket.typeinfo->geometry_nodes_default_value) {
return;
}
auto &lazy_function = scope_.construct<LazyFunctionForRerouteNode>(*type);
auto &lazy_function = scope_.construct<LazyFunctionForRerouteNode>();
lf::Node &lf_node = graph_params.lf_graph.add_function(lazy_function);
lf::InputSocket &lf_input = lf_node.input(0);
@@ -3042,10 +3019,8 @@ struct GeometryNodesLazyFunctionBuilder {
for (const int i : btree_.interface_outputs().index_range()) {
const bNodeTreeInterfaceSocket &interface_output = *btree_.interface_outputs()[i];
const bNodeSocket &bsocket = bnode.input_socket(i);
const bke::bNodeSocketType *typeinfo = interface_output.socket_typeinfo();
const CPPType &type = *typeinfo->geometry_nodes_cpp_type;
lf::GraphOutputSocket &lf_socket = graph_params.lf_graph.add_output(
type, interface_output.name ? interface_output.name : "");
CPPType::get<SocketValueVariant>(), interface_output.name ? interface_output.name : "");
lf_graph_outputs.append(&lf_socket);
graph_params.lf_inputs_by_bsocket.add(&bsocket, &lf_socket);
mapping_->bsockets_by_lf_socket_map.add(&lf_socket, &bsocket);
@@ -3757,10 +3732,10 @@ struct GeometryNodesLazyFunctionBuilder {
const Vector<TypeWithLinks> types_with_links = this->group_link_targets_by_type(from_bsocket);
for (const TypeWithLinks &type_with_links : types_with_links) {
if (type_with_links.typeinfo == nullptr) {
if (!type_with_links.typeinfo) {
continue;
}
if (type_with_links.typeinfo->geometry_nodes_cpp_type == nullptr) {
if (!type_with_links.typeinfo->geometry_nodes_default_value) {
continue;
}
const bke::bNodeSocketType &to_typeinfo = *type_with_links.typeinfo;
@@ -4211,13 +4186,13 @@ const GeometryNodesLazyFunctionGraphInfo *ensure_geometry_nodes_lazy_function_gr
}
for (const bNodeTreeInterfaceSocket *interface_bsocket : btree.interface_inputs()) {
const bke::bNodeSocketType *typeinfo = interface_bsocket->socket_typeinfo();
if (!typeinfo || !typeinfo->geometry_nodes_cpp_type) {
if (!typeinfo || !typeinfo->geometry_nodes_default_value) {
return nullptr;
}
}
for (const bNodeTreeInterfaceSocket *interface_bsocket : btree.interface_outputs()) {
const bke::bNodeSocketType *typeinfo = interface_bsocket->socket_typeinfo();
if (!typeinfo || !typeinfo->geometry_nodes_cpp_type) {
if (!typeinfo || !typeinfo->geometry_nodes_default_value) {
return nullptr;
}
}

View File

@@ -968,7 +968,6 @@ static bke::bNodeSocketType *make_socket_type_bool()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(bool *)r_value = ((bNodeSocketValueBoolean *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
const bool value = ((bNodeSocketValueBoolean *)socket_value)->value;
return SocketValueVariant(value);
@@ -987,7 +986,6 @@ static bke::bNodeSocketType *make_socket_type_rotation()
const math::EulerXYZ euler(float3(typed_value.value_euler));
*static_cast<math::Quaternion *>(r_value) = math::to_quaternion(euler);
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
const auto &typed_value = *(bNodeSocketValueRotation *)socket_value;
const math::EulerXYZ euler(float3(typed_value.value_euler));
@@ -1006,7 +1004,6 @@ static bke::bNodeSocketType *make_socket_type_matrix()
socktype->get_base_cpp_value = [](const void * /*socket_value*/, void *r_value) {
*static_cast<float4x4 *>(r_value) = float4x4::identity();
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void * /*socket_value*/) {
return SocketValueVariant(float4x4::identity());
};
@@ -1022,7 +1019,6 @@ static bke::bNodeSocketType *make_socket_type_bundle()
socktype->get_base_cpp_value = [](const void * /*socket_value*/, void *r_value) {
new (r_value) nodes::BundlePtr();
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void * /*socket_value*/) {
return SocketValueVariant::From(nodes::BundlePtr());
};
@@ -1038,7 +1034,6 @@ static bke::bNodeSocketType *make_socket_type_closure()
socktype->get_base_cpp_value = [](const void * /*socket_value*/, void *r_value) {
new (r_value) nodes::ClosurePtr();
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void * /*socket_value*/) {
return SocketValueVariant::From(nodes::ClosurePtr());
};
@@ -1054,7 +1049,6 @@ static bke::bNodeSocketType *make_socket_type_float(PropertySubType subtype)
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(float *)r_value = ((bNodeSocketValueFloat *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
const float value = ((bNodeSocketValueFloat *)socket_value)->value;
return SocketValueVariant(value);
@@ -1071,7 +1065,6 @@ static bke::bNodeSocketType *make_socket_type_int(PropertySubType subtype)
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(int *)r_value = ((bNodeSocketValueInt *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
const int value = ((bNodeSocketValueInt *)socket_value)->value;
return SocketValueVariant(value);
@@ -1088,7 +1081,6 @@ static bke::bNodeSocketType *make_socket_type_vector(PropertySubType subtype, co
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(blender::float3 *)r_value = ((bNodeSocketValueVector *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
const blender::float3 value = ((bNodeSocketValueVector *)socket_value)->value;
return SocketValueVariant(value);
@@ -1105,7 +1097,6 @@ static bke::bNodeSocketType *make_socket_type_rgba()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(blender::ColorGeometry4f *)r_value = ((bNodeSocketValueRGBA *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
const blender::ColorGeometry4f value = ((bNodeSocketValueRGBA *)socket_value)->value;
return SocketValueVariant(value);
@@ -1122,7 +1113,6 @@ static bke::bNodeSocketType *make_socket_type_string(PropertySubType subtype)
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
new (r_value) std::string(((bNodeSocketValueString *)socket_value)->value);
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
std::string value = ((bNodeSocketValueString *)socket_value)->value;
return SocketValueVariant(value);
@@ -1139,7 +1129,6 @@ static bke::bNodeSocketType *make_socket_type_menu()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(int *)r_value = ((bNodeSocketValueMenu *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
const int value = ((bNodeSocketValueMenu *)socket_value)->value;
return SocketValueVariant(value);
@@ -1156,7 +1145,6 @@ static bke::bNodeSocketType *make_socket_type_object()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(Object **)r_value = ((bNodeSocketValueObject *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
Object *object = static_cast<const bNodeSocketValueObject *>(socket_value)->value;
return SocketValueVariant::From(object);
@@ -1174,7 +1162,6 @@ static bke::bNodeSocketType *make_socket_type_geometry()
socktype->get_base_cpp_value = [](const void * /*socket_value*/, void *r_value) {
new (r_value) blender::bke::GeometrySet();
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void * /*socket_value*/) {
return SocketValueVariant::From(bke::GeometrySet());
};
@@ -1190,7 +1177,6 @@ static bke::bNodeSocketType *make_socket_type_collection()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(Collection **)r_value = ((bNodeSocketValueCollection *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
Collection *collection = static_cast<const bNodeSocketValueCollection *>(socket_value)->value;
return SocketValueVariant::From(collection);
@@ -1208,7 +1194,6 @@ static bke::bNodeSocketType *make_socket_type_texture()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(Tex **)r_value = ((bNodeSocketValueTexture *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
Tex *texture = static_cast<const bNodeSocketValueTexture *>(socket_value)->value;
return SocketValueVariant::From(texture);
@@ -1225,7 +1210,6 @@ static bke::bNodeSocketType *make_socket_type_image()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(Image **)r_value = ((bNodeSocketValueImage *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
Image *image = static_cast<const bNodeSocketValueImage *>(socket_value)->value;
return SocketValueVariant::From(image);
@@ -1243,7 +1227,6 @@ static bke::bNodeSocketType *make_socket_type_material()
socktype->get_base_cpp_value = [](const void *socket_value, void *r_value) {
*(Material **)r_value = ((bNodeSocketValueMaterial *)socket_value)->value;
};
socktype->geometry_nodes_cpp_type = &blender::CPPType::get<SocketValueVariant>();
socktype->get_geometry_nodes_cpp_value = [](const void *socket_value) {
Material *material = static_cast<const bNodeSocketValueMaterial *>(socket_value)->value;
return SocketValueVariant::From(material);