Blender V5.0
blender::bke::SocketValueVariant Class Reference

#include <BKE_node_socket_value.hh>

Public Member Functions

 SocketValueVariant ()=default
 SocketValueVariant (const SocketValueVariant &other)=default
 SocketValueVariant (SocketValueVariant &&other)=default
SocketValueVariantoperator= (const SocketValueVariant &other)=default
SocketValueVariantoperator= (SocketValueVariant &&other)=default
 ~SocketValueVariant ()=default
template<typename T, BLI_ENABLE_IF((std::is_trivial_v< std::decay_t< T > >|| is_same_any_v< std::decay_t< T >, std::string >))>
 SocketValueVariant (T &&value)
bool valid_for_socket (eNodeSocketDatatype socket_type) const
template<typename T>
T extract ()
template<typename T>
T get () const
template<typename T>
void set (T &&value)
bool is_context_dependent_field () const
bool is_volume_grid () const
bool is_single () const
bool is_list () const
void convert_to_single ()
GPointer get_single_ptr () const
GMutablePointer get_single_ptr ()
const void * get_single_ptr_raw () const
void store_single (eNodeSocketDatatype socket_type, const void *value)
void * allocate_single (eNodeSocketDatatype socket_type)

Static Public Member Functions

template<typename T>
static SocketValueVariantConstructIn (void *ptr, T &&value)
template<typename T>
static SocketValueVariant From (T &&value)

Friends

std::ostream & operator<< (std::ostream &stream, const SocketValueVariant &value_variant)

Detailed Description

SocketValueVariant is used by geometry nodes in the lazy-function evaluator to pass data between nodes. Specifically, it is the container type for the following socket types: bool, float, integer, vector, rotation, color and string.

The data passed through e.g. an integer socket can be a single value, a field or a grid (and in the lists and images). Each of those is stored differently, but this container can store them all.

A key requirement for this container is that it is type-erased, i.e. not all code that uses it has to include all the headers required to process the other storage types. This is achieved by using the Any type and by providing templated accessors that are implemented outside of a header.

Definition at line 34 of file BKE_node_socket_value.hh.

Constructor & Destructor Documentation

◆ SocketValueVariant() [1/4]

blender::bke::SocketValueVariant::SocketValueVariant ( )
default

Create an empty variant. This is not valid for any socket type yet.

Referenced by ConstructIn(), From(), get(), get_single_ptr(), operator<<, operator=(), operator=(), set(), SocketValueVariant(), and SocketValueVariant().

◆ SocketValueVariant() [2/4]

blender::bke::SocketValueVariant::SocketValueVariant ( const SocketValueVariant & other)
default

References SocketValueVariant().

◆ SocketValueVariant() [3/4]

blender::bke::SocketValueVariant::SocketValueVariant ( SocketValueVariant && other)
default

References SocketValueVariant().

◆ ~SocketValueVariant()

blender::bke::SocketValueVariant::~SocketValueVariant ( )
default

References blender::is_same_any_v, and T.

◆ SocketValueVariant() [4/4]

template<typename T, BLI_ENABLE_IF((std::is_trivial_v< std::decay_t< T > >|| is_same_any_v< std::decay_t< T >, std::string >))>
blender::bke::SocketValueVariant::SocketValueVariant ( T && value)
inlineexplicit

Create a variant based on the given value. This works for primitive types. For more complex types use set explicitly. Alternatively, one can use the From or ConstructIn utilities.

Definition at line 102 of file BKE_node_socket_value.hh.

References set(), and T.

Member Function Documentation

◆ allocate_single()

void * blender::bke::SocketValueVariant::allocate_single ( eNodeSocketDatatype socket_type)

◆ ConstructIn()

◆ convert_to_single()

void blender::bke::SocketValueVariant::convert_to_single ( )

Convert the stored value into a single value. For simple value access, this is not necessary, because get does the conversion implicitly. However, it is necessary if one wants to use get_single_ptr. Context-dependent fields or grids will just result in a fallback value.

The caller has to make sure that the stored value is a single value, field or grid.

Definition at line 386 of file node_socket_value.cc.

References allocate_single(), BLI_assert_unreachable, blender::CPPType::default_value(), blender::fn::evaluate_constant_field(), blender::bke::socket_type_to_geo_nodes_base_cpp_type(), and store_single().

Referenced by blender::nodes::execute_multi_function_on_value_variant__single(), blender::nodes::LazyFunctionForReduceForeachGeometryElement::handle_main_items_and_geometry(), blender::nodes::geo_eval_log::GeoTreeLogger::log_value(), blender::nodes::mix_baked_data_item(), blender::bke::bake::move_common_socket_value_to_bake_item(), and operator<<.

◆ extract()

◆ From()

◆ get()

template<typename T>
T blender::bke::SocketValueVariant::get ( ) const

Same as extract, but always leaves the variant unchanged. So this method can be called multiple times.

Definition at line 224 of file node_socket_value.cc.

References extract(), SocketValueVariant(), and T.

Referenced by blender::nodes::BundleItemValue::as(), blender::nodes::BundleItemValue::as_socket_value(), blender::ed::spreadsheet::data_source_from_geometry(), blender::nodes::LazyFunctionForEnableOutputSocketUsage::execute_impl(), blender::nodes::LazyFunctionForExtractingReferenceSet::execute_impl(), blender::nodes::LazyFunctionForIndexSwitchSocketUsage::execute_impl(), blender::nodes::LazyFunctionForSwitchSocketUsage::execute_impl(), blender::nodes::node_geo_enable_output_cc::LazyFunctionForEnableOutputNode::execute_impl(), blender::nodes::node_geo_index_switch_cc::LazyFunctionForIndexSwitchNode::execute_impl(), blender::nodes::node_geo_menu_switch_cc::LazyFunctionForMenuSwitchNode::execute_impl(), blender::nodes::node_geo_menu_switch_cc::LazyFunctionForMenuSwitchSocketUsage::execute_impl(), blender::nodes::node_geo_switch_cc::LazyFunctionForSwitchNode::execute_impl(), blender::nodes::node_geo_warning_cc::LazyFunctionForWarningNode::execute_impl(), blender::nodes::execute_multi_function_on_value_variant__list(), blender::nodes::find_output_attributes_to_store(), blender::nodes::GeoNodeExecParams::get_input(), blender::nodes::LazyFunctionForRepeatZone::initialize_execution_graph(), blender::nodes::geo_eval_log::GeoTreeLogger::log_value(), blender::bke::bake::move_common_socket_value_to_bake_item(), blender::bke::bake::move_socket_values_to_bake_items(), blender::nodes::inverse_eval::set_modifier_value(), blender::nodes::inverse_eval::set_socket_value(), blender::nodes::inverse_eval::set_value_node_value(), blender::nodes::node_geo_simulation_cc::sim_output_node::LazyFunctionForSimulationOutputNode::store_new_state(), blender::ed::view3d::geometry_nodes_gizmos::TransformGizmos::update_rotate_transform_and_target_property(), blender::ed::view3d::geometry_nodes_gizmos::TransformGizmos::update_scale_transform_and_target_property(), blender::ed::view3d::geometry_nodes_gizmos::DialGizmo::update_target_property(), blender::ed::view3d::geometry_nodes_gizmos::LinearGizmo::update_target_property(), and blender::ed::view3d::geometry_nodes_gizmos::TransformGizmos::update_translate_transform_and_target_property().

◆ get_single_ptr() [1/2]

GMutablePointer blender::bke::SocketValueVariant::get_single_ptr ( )

Definition at line 425 of file node_socket_value.cc.

References get_single_ptr(), ptr, and SocketValueVariant().

◆ get_single_ptr() [2/2]

◆ get_single_ptr_raw()

const void * blender::bke::SocketValueVariant::get_single_ptr_raw ( ) const
inline

Similar to get_single_ptr, but returns an untyped pointer. This can only be used if the caller knows for sure which type is contained. In that case, it can be a bit faster though, because the corresponding CPPType does not have to be looked up based on the socket type.

Definition at line 225 of file BKE_node_socket_value.hh.

References BLI_assert.

Referenced by blender::nodes::inverse_eval::convert_single_socket_value(), blender::nodes::execute_multi_function_on_value_variant__list(), blender::nodes::execute_multi_function_on_value_variant__single(), and blender::nodes::LazyFunctionForReduceForeachGeometryElement::handle_main_items_and_geometry().

◆ is_context_dependent_field()

◆ is_list()

◆ is_single()

◆ is_volume_grid()

◆ operator=() [1/2]

SocketValueVariant & blender::bke::SocketValueVariant::operator= ( const SocketValueVariant & other)
default

References SocketValueVariant().

◆ operator=() [2/2]

SocketValueVariant & blender::bke::SocketValueVariant::operator= ( SocketValueVariant && other)
default

References SocketValueVariant().

◆ set()

◆ store_single()

void blender::bke::SocketValueVariant::store_single ( eNodeSocketDatatype socket_type,
const void * value )

◆ valid_for_socket()

bool blender::bke::SocketValueVariant::valid_for_socket ( eNodeSocketDatatype socket_type) const
Returns
True if the stored value is valid for a specific socket type. This is mainly meant to be used by asserts.

Definition at line 493 of file node_socket_value.cc.

Referenced by blender::nodes::geo_eval_log::GeoTreeLogger::log_value().

◆ operator<<

std::ostream & operator<< ( std::ostream & stream,
const SocketValueVariant & value_variant )
friend

The documentation for this class was generated from the following files: