From ef741bc6ff16850100f10e13ec9ef8bd334357ea Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Fri, 19 Jan 2024 11:19:22 +0100 Subject: [PATCH] Fix: crash when adding bake item to already baked node This was caused by the introduction of the generic `SocketValueVariant` type. Now it's not enough to simply default-construct the value anymore, but it has to be constructed with the correct type. --- .../blenkernel/intern/bake_items_socket.cc | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/source/blender/blenkernel/intern/bake_items_socket.cc b/source/blender/blenkernel/intern/bake_items_socket.cc index 945a4beea1f..204e4f0814f 100644 --- a/source/blender/blenkernel/intern/bake_items_socket.cc +++ b/source/blender/blenkernel/intern/bake_items_socket.cc @@ -11,15 +11,6 @@ namespace blender::bke::bake { -static const CPPType &get_socket_cpp_type(const eNodeSocketDatatype socket_type) -{ - const char *socket_idname = nodeStaticSocketType(socket_type, 0); - const bNodeSocketType *typeinfo = nodeSocketTypeFind(socket_idname); - BLI_assert(typeinfo); - BLI_assert(typeinfo->geometry_nodes_cpp_type); - return *typeinfo->geometry_nodes_cpp_type; -} - Array> move_socket_values_to_bake_items(const Span socket_values, const BakeSocketConfig &config) { @@ -201,6 +192,14 @@ static void rename_attributes(const Span geometries, } } +static void default_initialize_socket_value(const eNodeSocketDatatype socket_type, void *r_value) +{ + const char *socket_idname = nodeStaticSocketType(socket_type, 0); + const bNodeSocketType *typeinfo = nodeSocketTypeFind(socket_idname); + typeinfo->geometry_nodes_cpp_type->copy_construct(typeinfo->geometry_nodes_default_cpp_value, + r_value); +} + void move_bake_items_to_socket_values( const Span bake_items, const BakeSocketConfig &config, @@ -214,11 +213,10 @@ void move_bake_items_to_socket_values( for (const int i : bake_items.index_range()) { const eNodeSocketDatatype socket_type = config.types[i]; - const CPPType &type = get_socket_cpp_type(socket_type); BakeItem *bake_item = bake_items[i]; void *r_socket_value = r_socket_values[i]; if (bake_item == nullptr) { - type.value_initialize(r_socket_value); + default_initialize_socket_value(socket_type, r_socket_value); continue; } if (!copy_bake_item_to_socket_value( @@ -228,7 +226,7 @@ void move_bake_items_to_socket_values( attribute_map, r_socket_value)) { - type.value_initialize(r_socket_value); + default_initialize_socket_value(socket_type, r_socket_value); continue; } if (socket_type == SOCK_GEOMETRY) { @@ -253,11 +251,10 @@ void copy_bake_items_to_socket_values( for (const int i : bake_items.index_range()) { const eNodeSocketDatatype socket_type = config.types[i]; - const CPPType &type = get_socket_cpp_type(socket_type); const BakeItem *bake_item = bake_items[i]; void *r_socket_value = r_socket_values[i]; if (bake_item == nullptr) { - type.value_initialize(r_socket_value); + default_initialize_socket_value(socket_type, r_socket_value); continue; } if (!copy_bake_item_to_socket_value( @@ -267,7 +264,7 @@ void copy_bake_items_to_socket_values( attribute_map, r_socket_value)) { - type.value_initialize(r_socket_value); + default_initialize_socket_value(socket_type, r_socket_value); continue; } if (socket_type == SOCK_GEOMETRY) {