Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/intern/node_socket.cc
| /* SPDX-License-Identifier: GPL-2.0-or-later | /* SPDX-License-Identifier: GPL-2.0-or-later | ||||
| * Copyright 2007 Blender Foundation. All rights reserved. */ | * Copyright 2007 Blender Foundation. All rights reserved. */ | ||||
| /** \file | /** \file | ||||
| * \ingroup nodes | * \ingroup nodes | ||||
| */ | */ | ||||
| #include <climits> | #include <climits> | ||||
| #include "DNA_node_types.h" | #include "DNA_node_types.h" | ||||
| #include "BLI_color.hh" | #include "BLI_color.hh" | ||||
| #include "BLI_cpp_type_make.hh" | |||||
| #include "BLI_listbase.h" | #include "BLI_listbase.h" | ||||
| #include "BLI_math_vec_types.hh" | #include "BLI_math_vec_types.hh" | ||||
| #include "BLI_string.h" | #include "BLI_string.h" | ||||
| #include "BLI_utildefines.h" | #include "BLI_utildefines.h" | ||||
| #include "BKE_geometry_set.hh" | #include "BKE_geometry_set.hh" | ||||
| #include "BKE_lib_id.h" | #include "BKE_lib_id.h" | ||||
| #include "BKE_node.h" | #include "BKE_node.h" | ||||
| #include "DNA_collection_types.h" | #include "DNA_collection_types.h" | ||||
| #include "DNA_material_types.h" | #include "DNA_material_types.h" | ||||
| #include "RNA_access.h" | #include "RNA_access.h" | ||||
| #include "RNA_types.h" | #include "RNA_types.h" | ||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| #include "NOD_node_declaration.hh" | #include "NOD_node_declaration.hh" | ||||
| #include "NOD_socket.h" | #include "NOD_socket.h" | ||||
| #include "FN_cpp_type_make.hh" | |||||
| #include "FN_field.hh" | #include "FN_field.hh" | ||||
| using namespace blender; | using namespace blender; | ||||
| using blender::fn::ValueOrField; | using blender::fn::ValueOrField; | ||||
| using blender::nodes::SocketDeclarationPtr; | using blender::nodes::SocketDeclarationPtr; | ||||
| struct bNodeSocket *node_add_socket_from_template(struct bNodeTree *ntree, | struct bNodeSocket *node_add_socket_from_template(struct bNodeTree *ntree, | ||||
| struct bNode *node, | struct bNode *node, | ||||
| ▲ Show 20 Lines • Show All 636 Lines • ▼ Show 20 Lines | static bNodeSocketType *make_socket_type_virtual() | ||||
| stype->output_link_limit = 0xFFF; | stype->output_link_limit = 0xFFF; | ||||
| return stype; | return stype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_bool() | static bNodeSocketType *make_socket_type_bool() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_BOOLEAN, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_BOOLEAN, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<bool>(); | socktype->base_cpp_type = &blender::CPPType::get<bool>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(bool *)r_value = ((bNodeSocketValueBoolean *)socket.default_value)->value; | *(bool *)r_value = ((bNodeSocketValueBoolean *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = &blender::fn::CPPType::get<ValueOrField<bool>>(); | socktype->geometry_nodes_cpp_type = &blender::CPPType::get<ValueOrField<bool>>(); | ||||
| socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| bool value; | bool value; | ||||
| socket.typeinfo->get_base_cpp_value(socket, &value); | socket.typeinfo->get_base_cpp_value(socket, &value); | ||||
| new (r_value) ValueOrField<bool>(value); | new (r_value) ValueOrField<bool>(value); | ||||
| }; | }; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_float(PropertySubType subtype) | static bNodeSocketType *make_socket_type_float(PropertySubType subtype) | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_FLOAT, subtype); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_FLOAT, subtype); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<float>(); | socktype->base_cpp_type = &blender::CPPType::get<float>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(float *)r_value = ((bNodeSocketValueFloat *)socket.default_value)->value; | *(float *)r_value = ((bNodeSocketValueFloat *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = &blender::fn::CPPType::get<ValueOrField<float>>(); | socktype->geometry_nodes_cpp_type = &blender::CPPType::get<ValueOrField<float>>(); | ||||
| socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| float value; | float value; | ||||
| socket.typeinfo->get_base_cpp_value(socket, &value); | socket.typeinfo->get_base_cpp_value(socket, &value); | ||||
| new (r_value) ValueOrField<float>(value); | new (r_value) ValueOrField<float>(value); | ||||
| }; | }; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_int(PropertySubType subtype) | static bNodeSocketType *make_socket_type_int(PropertySubType subtype) | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_INT, subtype); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_INT, subtype); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<int>(); | socktype->base_cpp_type = &blender::CPPType::get<int>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(int *)r_value = ((bNodeSocketValueInt *)socket.default_value)->value; | *(int *)r_value = ((bNodeSocketValueInt *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = &blender::fn::CPPType::get<ValueOrField<int>>(); | socktype->geometry_nodes_cpp_type = &blender::CPPType::get<ValueOrField<int>>(); | ||||
| socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| int value; | int value; | ||||
| socket.typeinfo->get_base_cpp_value(socket, &value); | socket.typeinfo->get_base_cpp_value(socket, &value); | ||||
| new (r_value) ValueOrField<int>(value); | new (r_value) ValueOrField<int>(value); | ||||
| }; | }; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_vector(PropertySubType subtype) | static bNodeSocketType *make_socket_type_vector(PropertySubType subtype) | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_VECTOR, subtype); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_VECTOR, subtype); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<blender::float3>(); | socktype->base_cpp_type = &blender::CPPType::get<blender::float3>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(blender::float3 *)r_value = ((bNodeSocketValueVector *)socket.default_value)->value; | *(blender::float3 *)r_value = ((bNodeSocketValueVector *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = &blender::fn::CPPType::get<ValueOrField<blender::float3>>(); | socktype->geometry_nodes_cpp_type = &blender::CPPType::get<ValueOrField<blender::float3>>(); | ||||
| socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| blender::float3 value; | blender::float3 value; | ||||
| socket.typeinfo->get_base_cpp_value(socket, &value); | socket.typeinfo->get_base_cpp_value(socket, &value); | ||||
| new (r_value) ValueOrField<blender::float3>(value); | new (r_value) ValueOrField<blender::float3>(value); | ||||
| }; | }; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_rgba() | static bNodeSocketType *make_socket_type_rgba() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_RGBA, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_RGBA, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<blender::ColorGeometry4f>(); | socktype->base_cpp_type = &blender::CPPType::get<blender::ColorGeometry4f>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(blender::ColorGeometry4f *)r_value = ((bNodeSocketValueRGBA *)socket.default_value)->value; | *(blender::ColorGeometry4f *)r_value = ((bNodeSocketValueRGBA *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = | socktype->geometry_nodes_cpp_type = | ||||
| &blender::fn::CPPType::get<ValueOrField<blender::ColorGeometry4f>>(); | &blender::CPPType::get<ValueOrField<blender::ColorGeometry4f>>(); | ||||
| socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| blender::ColorGeometry4f value; | blender::ColorGeometry4f value; | ||||
| socket.typeinfo->get_base_cpp_value(socket, &value); | socket.typeinfo->get_base_cpp_value(socket, &value); | ||||
| new (r_value) ValueOrField<blender::ColorGeometry4f>(value); | new (r_value) ValueOrField<blender::ColorGeometry4f>(value); | ||||
| }; | }; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_string() | static bNodeSocketType *make_socket_type_string() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_STRING, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_STRING, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<std::string>(); | socktype->base_cpp_type = &blender::CPPType::get<std::string>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| new (r_value) std::string(((bNodeSocketValueString *)socket.default_value)->value); | new (r_value) std::string(((bNodeSocketValueString *)socket.default_value)->value); | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = &blender::fn::CPPType::get<ValueOrField<std::string>>(); | socktype->geometry_nodes_cpp_type = &blender::CPPType::get<ValueOrField<std::string>>(); | ||||
| socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_geometry_nodes_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| std::string value; | std::string value; | ||||
| value.~basic_string(); | value.~basic_string(); | ||||
| socket.typeinfo->get_base_cpp_value(socket, &value); | socket.typeinfo->get_base_cpp_value(socket, &value); | ||||
| new (r_value) ValueOrField<std::string>(value); | new (r_value) ValueOrField<std::string>(value); | ||||
| }; | }; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| MAKE_CPP_TYPE(Object, Object *, CPPTypeFlags::BasicType) | MAKE_CPP_TYPE(Object, Object *, CPPTypeFlags::BasicType) | ||||
| MAKE_CPP_TYPE(Collection, Collection *, CPPTypeFlags::BasicType) | MAKE_CPP_TYPE(Collection, Collection *, CPPTypeFlags::BasicType) | ||||
| MAKE_CPP_TYPE(Texture, Tex *, CPPTypeFlags::BasicType) | MAKE_CPP_TYPE(Texture, Tex *, CPPTypeFlags::BasicType) | ||||
| MAKE_CPP_TYPE(Image, Image *, CPPTypeFlags::BasicType) | MAKE_CPP_TYPE(Image, Image *, CPPTypeFlags::BasicType) | ||||
| MAKE_CPP_TYPE(Material, Material *, CPPTypeFlags::BasicType) | MAKE_CPP_TYPE(Material, Material *, CPPTypeFlags::BasicType) | ||||
| static bNodeSocketType *make_socket_type_object() | static bNodeSocketType *make_socket_type_object() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_OBJECT, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_OBJECT, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<Object *>(); | socktype->base_cpp_type = &blender::CPPType::get<Object *>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(Object **)r_value = ((bNodeSocketValueObject *)socket.default_value)->value; | *(Object **)r_value = ((bNodeSocketValueObject *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | ||||
| socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_geometry() | static bNodeSocketType *make_socket_type_geometry() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_GEOMETRY, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_GEOMETRY, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<GeometrySet>(); | socktype->base_cpp_type = &blender::CPPType::get<GeometrySet>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &UNUSED(socket), void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &UNUSED(socket), void *r_value) { | ||||
| new (r_value) GeometrySet(); | new (r_value) GeometrySet(); | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | ||||
| socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_collection() | static bNodeSocketType *make_socket_type_collection() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_COLLECTION, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_COLLECTION, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<Collection *>(); | socktype->base_cpp_type = &blender::CPPType::get<Collection *>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(Collection **)r_value = ((bNodeSocketValueCollection *)socket.default_value)->value; | *(Collection **)r_value = ((bNodeSocketValueCollection *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | ||||
| socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_texture() | static bNodeSocketType *make_socket_type_texture() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_TEXTURE, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_TEXTURE, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<Tex *>(); | socktype->base_cpp_type = &blender::CPPType::get<Tex *>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(Tex **)r_value = ((bNodeSocketValueTexture *)socket.default_value)->value; | *(Tex **)r_value = ((bNodeSocketValueTexture *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | ||||
| socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_image() | static bNodeSocketType *make_socket_type_image() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_IMAGE, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_IMAGE, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<Image *>(); | socktype->base_cpp_type = &blender::CPPType::get<Image *>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(Image **)r_value = ((bNodeSocketValueImage *)socket.default_value)->value; | *(Image **)r_value = ((bNodeSocketValueImage *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | ||||
| socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| static bNodeSocketType *make_socket_type_material() | static bNodeSocketType *make_socket_type_material() | ||||
| { | { | ||||
| bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATERIAL, PROP_NONE); | bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATERIAL, PROP_NONE); | ||||
| socktype->base_cpp_type = &blender::fn::CPPType::get<Material *>(); | socktype->base_cpp_type = &blender::CPPType::get<Material *>(); | ||||
| socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { | ||||
| *(Material **)r_value = ((bNodeSocketValueMaterial *)socket.default_value)->value; | *(Material **)r_value = ((bNodeSocketValueMaterial *)socket.default_value)->value; | ||||
| }; | }; | ||||
| socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | socktype->geometry_nodes_cpp_type = socktype->base_cpp_type; | ||||
| socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; | ||||
| return socktype; | return socktype; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 48 Lines • Show Last 20 Lines | |||||