diff options
author | Jacques Lucke <jacques@blender.org> | 2021-08-02 11:34:50 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2021-08-02 11:34:50 +0300 |
commit | de91cdd930614d5396ca4691b37cc0502481ead7 (patch) | |
tree | 9259a0b5976ff6f3441a56d20dd4fd7599d6dc53 /source/blender | |
parent | 48722e8971133dbe14ecc6825a2451637df77eab (diff) |
Cleanup: separate base and geometry nodes specific socket cpp type
This simplifies changing how geometry nodes handles different socket types
without affecting other systems.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_node.h | 13 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes.cc | 8 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes_evaluator.cc | 15 | ||||
-rw-r--r-- | source/blender/nodes/NOD_type_callbacks.hh | 2 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_geometry_exec.cc | 4 | ||||
-rw-r--r-- | source/blender/nodes/intern/node_socket.cc | 68 | ||||
-rw-r--r-- | source/blender/nodes/intern/type_callbacks.cc | 27 |
7 files changed, 80 insertions, 57 deletions
diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index cecb3118038..a1bc6fa505b 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -125,6 +125,9 @@ using NodeExpandInMFNetworkFunction = void (*)(blender::nodes::NodeMFNetworkBuil using NodeGeometryExecFunction = void (*)(blender::nodes::GeoNodeExecParams params); using SocketGetCPPTypeFunction = const blender::fn::CPPType *(*)(); using SocketGetCPPValueFunction = void (*)(const struct bNodeSocket &socket, void *r_value); +using SocketGetGeometryNodesCPPTypeFunction = const blender::fn::CPPType *(*)(); +using SocketGetGeometryNodesCPPValueFunction = void (*)(const struct bNodeSocket &socket, + void *r_value); using SocketExpandInMFNetworkFunction = void (*)(blender::nodes::SocketMFNetworkBuilder &builder); #else @@ -132,6 +135,8 @@ typedef void *NodeExpandInMFNetworkFunction; typedef void *SocketExpandInMFNetworkFunction; typedef void *NodeGeometryExecFunction; typedef void *SocketGetCPPTypeFunction; +typedef void *SocketGetGeometryNodesCPPTypeFunction; +typedef void *SocketGetGeometryNodesCPPValueFunction; typedef void *SocketGetCPPValueFunction; #endif @@ -194,9 +199,13 @@ typedef struct bNodeSocketType { /* Expands the socket into a multi-function node that outputs the socket value. */ SocketExpandInMFNetworkFunction expand_in_mf_network; /* Return the CPPType of this socket. */ - SocketGetCPPTypeFunction get_cpp_type; + SocketGetCPPTypeFunction get_base_cpp_type; /* Get the value of this socket in a generic way. */ - SocketGetCPPValueFunction get_cpp_value; + SocketGetCPPValueFunction get_base_cpp_value; + /* Get geometry nodes cpp type. */ + SocketGetGeometryNodesCPPTypeFunction get_geometry_nodes_cpp_type; + /* Get geometry nodes cpp value. */ + SocketGetGeometryNodesCPPValueFunction get_geometry_nodes_cpp_value; } bNodeSocketType; typedef void *(*NodeInitExecFunction)(struct bNodeExecContext *context, diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 5fa11ffdd10..3853b345c14 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -721,17 +721,17 @@ static void initialize_group_input(NodesModifierData &nmd, return; } if (nmd.settings.properties == nullptr) { - blender::nodes::socket_cpp_value_get(socket, r_value); + socket.typeinfo->get_geometry_nodes_cpp_value(socket, r_value); return; } const IDProperty *property = IDP_GetPropertyFromGroup(nmd.settings.properties, socket.identifier); if (property == nullptr) { - blender::nodes::socket_cpp_value_get(socket, r_value); + socket.typeinfo->get_geometry_nodes_cpp_value(socket, r_value); return; } if (!property_type->is_correct_type(*property)) { - blender::nodes::socket_cpp_value_get(socket, r_value); + socket.typeinfo->get_geometry_nodes_cpp_value(socket, r_value); return; } property_type->init_cpp_value(*property, r_value); @@ -883,7 +883,7 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree, /* Initialize remaining group inputs. */ for (const OutputSocketRef *socket : remaining_input_sockets) { - const CPPType &cpp_type = *blender::nodes::socket_cpp_type_get(*socket->typeinfo()); + const CPPType &cpp_type = *socket->typeinfo()->get_geometry_nodes_cpp_type(); void *value_in = allocator.allocate(cpp_type.size(), cpp_type.alignment()); initialize_group_input(*nmd, *socket->bsocket(), cpp_type, value_in); group_inputs.add_new({root_context, socket}, {cpp_type, value_in}); diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc index e652eb8353d..2157092d639 100644 --- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc +++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc @@ -294,7 +294,11 @@ class LockedNode : NonCopyable, NonMovable { static const CPPType *get_socket_cpp_type(const SocketRef &socket) { - const CPPType *type = nodes::socket_cpp_type_get(*socket.typeinfo()); + const bNodeSocketType *typeinfo = socket.typeinfo(); + if (typeinfo->get_geometry_nodes_cpp_type == nullptr) { + return nullptr; + } + const CPPType *type = typeinfo->get_geometry_nodes_cpp_type(); if (type == nullptr) { return nullptr; } @@ -310,6 +314,12 @@ static const CPPType *get_socket_cpp_type(const DSocket socket) return get_socket_cpp_type(*socket.socket_ref()); } +static void get_socket_value(const SocketRef &socket, void *r_value) +{ + const bNodeSocketType *typeinfo = socket.typeinfo(); + typeinfo->get_geometry_nodes_cpp_value(*socket.bsocket(), r_value); +} + static bool node_supports_laziness(const DNode node) { return node->typeinfo()->geometry_node_execute_supports_laziness; @@ -1363,10 +1373,9 @@ class GeometryNodesEvaluator { { LinearAllocator<> &allocator = local_allocators_.local(); - bNodeSocket *bsocket = socket->bsocket(); const CPPType &type = *get_socket_cpp_type(socket); void *buffer = allocator.allocate(type.size(), type.alignment()); - blender::nodes::socket_cpp_value_get(*bsocket, buffer); + get_socket_value(*socket.socket_ref(), buffer); if (type == required_type) { return {type, buffer}; diff --git a/source/blender/nodes/NOD_type_callbacks.hh b/source/blender/nodes/NOD_type_callbacks.hh index d1a4bd3ad7a..2be78f929db 100644 --- a/source/blender/nodes/NOD_type_callbacks.hh +++ b/source/blender/nodes/NOD_type_callbacks.hh @@ -27,10 +27,8 @@ namespace blender::nodes { using fn::CPPType; using fn::MFDataType; -const CPPType *socket_cpp_type_get(const bNodeSocketType &stype); std::optional<MFDataType> socket_mf_type_get(const bNodeSocketType &stype); bool socket_is_mf_data_socket(const bNodeSocketType &stype); -bool socket_cpp_value_get(const bNodeSocket &socket, void *r_value); void socket_expand_in_mf_network(SocketMFNetworkBuilder &builder); } // namespace blender::nodes diff --git a/source/blender/nodes/intern/node_geometry_exec.cc b/source/blender/nodes/intern/node_geometry_exec.cc index bfd1ad02d36..ffa20579acc 100644 --- a/source/blender/nodes/intern/node_geometry_exec.cc +++ b/source/blender/nodes/intern/node_geometry_exec.cc @@ -218,7 +218,7 @@ void GeoNodeExecParams::check_input_access(StringRef identifier, BLI_assert_unreachable(); } else if (requested_type != nullptr) { - const CPPType &expected_type = *socket_cpp_type_get(*found_socket->typeinfo); + const CPPType &expected_type = *found_socket->typeinfo->get_geometry_nodes_cpp_type(); if (*requested_type != expected_type) { std::cout << "The requested type '" << requested_type->name() << "' is incorrect. Expected '" << expected_type.name() << "'.\n"; @@ -258,7 +258,7 @@ void GeoNodeExecParams::check_output_access(StringRef identifier, const CPPType BLI_assert_unreachable(); } else { - const CPPType &expected_type = *socket_cpp_type_get(*found_socket->typeinfo); + const CPPType &expected_type = *found_socket->typeinfo->get_geometry_nodes_cpp_type(); if (value_type != expected_type) { std::cout << "The value type '" << value_type.name() << "' is incorrect. Expected '" << expected_type.name() << "'.\n"; diff --git a/source/blender/nodes/intern/node_socket.cc b/source/blender/nodes/intern/node_socket.cc index 8fdad0bb242..4be3fd2468b 100644 --- a/source/blender/nodes/intern/node_socket.cc +++ b/source/blender/nodes/intern/node_socket.cc @@ -607,60 +607,74 @@ static bNodeSocketType *make_socket_type_virtual() static bNodeSocketType *make_socket_type_bool() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_BOOLEAN, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<bool>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<bool>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(bool *)r_value = ((bNodeSocketValueBoolean *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_float(PropertySubType subtype) { bNodeSocketType *socktype = make_standard_socket_type(SOCK_FLOAT, subtype); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<float>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<float>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(float *)r_value = ((bNodeSocketValueFloat *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_int(PropertySubType subtype) { bNodeSocketType *socktype = make_standard_socket_type(SOCK_INT, subtype); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<int>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<int>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(int *)r_value = ((bNodeSocketValueInt *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_vector(PropertySubType subtype) { bNodeSocketType *socktype = make_standard_socket_type(SOCK_VECTOR, subtype); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<blender::float3>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<blender::float3>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(blender::float3 *)r_value = ((bNodeSocketValueVector *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_rgba() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_RGBA, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<blender::ColorGeometry4f>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { + return &blender::fn::CPPType::get<blender::ColorGeometry4f>(); + }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(blender::ColorGeometry4f *)r_value = ((bNodeSocketValueRGBA *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_string() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_STRING, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<std::string>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<std::string>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { new (r_value) std::string(((bNodeSocketValueString *)socket.default_value)->value); }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } @@ -672,50 +686,60 @@ MAKE_CPP_TYPE(Material, Material *, CPPTypeFlags::BasicType) static bNodeSocketType *make_socket_type_object() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_OBJECT, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<Object *>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<Object *>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(Object **)r_value = ((bNodeSocketValueObject *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_geometry() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_GEOMETRY, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<GeometrySet>(); }; - socktype->get_cpp_value = [](const bNodeSocket &UNUSED(socket), void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<GeometrySet>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &UNUSED(socket), void *r_value) { new (r_value) GeometrySet(); }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_collection() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_COLLECTION, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<Collection *>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<Collection *>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(Collection **)r_value = ((bNodeSocketValueCollection *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_texture() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_TEXTURE, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<Tex *>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<Tex *>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(Tex **)r_value = ((bNodeSocketValueTexture *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } static bNodeSocketType *make_socket_type_material() { bNodeSocketType *socktype = make_standard_socket_type(SOCK_MATERIAL, PROP_NONE); - socktype->get_cpp_type = []() { return &blender::fn::CPPType::get<Material *>(); }; - socktype->get_cpp_value = [](const bNodeSocket &socket, void *r_value) { + socktype->get_base_cpp_type = []() { return &blender::fn::CPPType::get<Material *>(); }; + socktype->get_base_cpp_value = [](const bNodeSocket &socket, void *r_value) { *(Material **)r_value = ((bNodeSocketValueMaterial *)socket.default_value)->value; }; + socktype->get_geometry_nodes_cpp_type = socktype->get_base_cpp_type; + socktype->get_geometry_nodes_cpp_value = socktype->get_base_cpp_value; return socktype; } diff --git a/source/blender/nodes/intern/type_callbacks.cc b/source/blender/nodes/intern/type_callbacks.cc index 5160432aea5..881a02c92e9 100644 --- a/source/blender/nodes/intern/type_callbacks.cc +++ b/source/blender/nodes/intern/type_callbacks.cc @@ -19,17 +19,9 @@ namespace blender::nodes { -const CPPType *socket_cpp_type_get(const bNodeSocketType &stype) -{ - if (stype.get_cpp_type != nullptr) { - return stype.get_cpp_type(); - } - return nullptr; -} - std::optional<MFDataType> socket_mf_type_get(const bNodeSocketType &stype) { - const CPPType *cpp_type = socket_cpp_type_get(stype); + const CPPType *cpp_type = stype.get_base_cpp_type ? stype.get_base_cpp_type() : nullptr; if (cpp_type != nullptr) { return MFDataType::ForSingle(*cpp_type); } @@ -41,32 +33,23 @@ bool socket_is_mf_data_socket(const bNodeSocketType &stype) if (!socket_mf_type_get(stype).has_value()) { return false; } - if (stype.expand_in_mf_network == nullptr && stype.get_cpp_value == nullptr) { + if (stype.expand_in_mf_network == nullptr && stype.get_base_cpp_value == nullptr) { return false; } return true; } -bool socket_cpp_value_get(const bNodeSocket &socket, void *r_value) -{ - if (socket.typeinfo->get_cpp_value != nullptr) { - socket.typeinfo->get_cpp_value(socket, r_value); - return true; - } - return false; -} - void socket_expand_in_mf_network(SocketMFNetworkBuilder &builder) { bNodeSocket &socket = builder.bsocket(); if (socket.typeinfo->expand_in_mf_network != nullptr) { socket.typeinfo->expand_in_mf_network(builder); } - else if (socket.typeinfo->get_cpp_value != nullptr) { - const CPPType &type = *socket_cpp_type_get(*socket.typeinfo); + else if (socket.typeinfo->get_base_cpp_value != nullptr) { + const CPPType &type = *socket.typeinfo->get_base_cpp_type(); void *buffer = builder.resource_scope().linear_allocator().allocate(type.size(), type.alignment()); - socket.typeinfo->get_cpp_value(socket, buffer); + socket.typeinfo->get_base_cpp_value(socket, buffer); builder.set_constant_value(type, buffer); } else { |