diff --git a/source/blender/nodes/NOD_geometry_nodes_log.hh b/source/blender/nodes/NOD_geometry_nodes_log.hh index 6d8414696c8..e8f040afaeb 100644 --- a/source/blender/nodes/NOD_geometry_nodes_log.hh +++ b/source/blender/nodes/NOD_geometry_nodes_log.hh @@ -304,6 +304,23 @@ class GeoTreeLog { void ensure_debug_messages(); ValueLog *find_socket_value_log(const bNodeSocket &query_socket); + [[nodiscard]] bool try_convert_primitive_socket_value(const GenericValueLog &value_log, + const CPPType &dst_type, + void *dst); + + template + std::optional find_primitive_socket_value(const bNodeSocket &query_socket) + { + if (auto *value_log = dynamic_cast( + this->find_socket_value_log(query_socket))) + { + T value; + if (this->try_convert_primitive_socket_value(*value_log, CPPType::get(), &value)) { + return value; + } + } + return std::nullopt; + } }; /** diff --git a/source/blender/nodes/intern/geometry_nodes_log.cc b/source/blender/nodes/intern/geometry_nodes_log.cc index eee7d973fea..d796ce35cee 100644 --- a/source/blender/nodes/intern/geometry_nodes_log.cc +++ b/source/blender/nodes/intern/geometry_nodes_log.cc @@ -9,6 +9,7 @@ #include "BKE_curves.hh" #include "BKE_node_runtime.hh" #include "BKE_node_socket_value.hh" +#include "BKE_type_conversions.hh" #include "BKE_volume.hh" #include "BKE_volume_openvdb.hh" @@ -484,6 +485,24 @@ ValueLog *GeoTreeLog::find_socket_value_log(const bNodeSocket &query_socket) return nullptr; } +bool GeoTreeLog::try_convert_primitive_socket_value(const GenericValueLog &value_log, + const CPPType &dst_type, + void *dst) +{ + const void *src_value = value_log.value.get(); + if (!src_value) { + return false; + } + const bke::DataTypeConversions &conversions = bke::get_implicit_type_conversions(); + const CPPType &src_type = *value_log.value.type(); + if (!conversions.is_convertible(src_type, dst_type) && src_type != dst_type) { + return false; + } + dst_type.destruct(dst); + conversions.convert_to_uninitialized(src_type, dst_type, src_value, dst); + return true; +} + GeoTreeLogger &GeoModifierLog::get_local_tree_logger(const ComputeContext &compute_context) { LocalData &local_data = data_per_thread_.local();