19#define DNA_DEPRECATED_ALLOW
81#include "RNA_prototypes.hh"
141 ntree->
runtime = MEM_new<bNodeTreeRuntime>(__func__);
147 std::optional<Library *> ,
158 ntree_dst->
runtime = MEM_new<bNodeTreeRuntime>(__func__);
169 ntree_dst, *src_node, flag_subdata, src_node->name, src_node->identifier, socket_map);
170 new_node->
runtime->index_in_tree =
i;
187 for (
bNode *node : ntree_dst->all_nodes()) {
193 for (
bNode *node : ntree_dst->all_nodes()) {
200 for (
const auto &item : ntree_src->
runtime->previews.items()) {
201 dst_runtime.
previews.add_new(item.key, item.value);
205 if (ntree_src->
runtime->field_inferencing_interface) {
207 *ntree_src->
runtime->field_inferencing_interface);
209 if (ntree_src->
runtime->structure_type_interface) {
211 *ntree_src->
runtime->structure_type_interface);
213 if (ntree_src->
runtime->reference_lifetimes_info) {
216 *ntree_src->
runtime->reference_lifetimes_info);
218 if (
ELEM(reference_set.type,
219 ReferenceSetType::LocalReferenceSet,
220 ReferenceSetType::ClosureInputReferenceSet,
221 ReferenceSetType::ClosureOutputData))
223 reference_set.socket = socket_map.
lookup(reference_set.socket);
225 for (
auto &socket : reference_set.potential_data_origins) {
226 socket = socket_map.
lookup(socket);
261 if (ntree->
runtime->execdata) {
262 switch (ntree->
type) {
268 ntree->
runtime->execdata =
nullptr;
307 BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
363 BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
368 BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
392 for (
bNode *node : ntree->all_nodes()) {
398 if (ntree->
runtime->geometry_nodes_eval_dependencies) {
399 for (
ID *&id_ref : ntree->
runtime->geometry_nodes_eval_dependencies->ids.values()) {
414 for (
bNode *node : nodetree->all_nodes()) {
417 function_callback(
id, &key, (&node->storage), 0, user_data);
427 switch (ntree->
type) {
429 for (
bNode *node : ntree->all_nodes()) {
446 ntree->ensure_topology_cache();
447 for (
bNode *node : ntree->all_nodes()) {
448 for (
bNodeSocket *socket : node->input_sockets()) {
454 socket->default_value);
461 bpath_data, socket_value->
value,
sizeof(socket_value->
value));
475 ntree->ensure_topology_cache();
476 ntree->ensure_interface_cache();
478 for (
bNode *node : ntree->all_nodes()) {
487 for (
bNodeSocket *socket : node->input_sockets()) {
488 if (socket->type ==
SOCK_RGBA && socket->default_value) {
493 else if (socket->type ==
SOCK_VECTOR && socket->default_value &&
494 (
STREQ(socket->name,
"Subsurface Radius") ||
495 STREQ(socket->name,
"Subsurface Radius Scale") ||
497 STREQ(socket->name,
"Radius"))))
508 for (
bNodeSocket *socket : node->output_sockets()) {
509 if (socket->type ==
SOCK_RGBA && socket->default_value) {
518 fn.single(input_color_storage->
color);
528 if (typeinfo && typeinfo->
type ==
SOCK_RGBA && socket->socket_data) {
535 if (typeinfo && typeinfo->
type ==
SOCK_RGBA && socket->socket_data) {
551 if (debug_relationship_assert) {
563 for (
bNode *node : ntree.all_nodes()) {
564 node->locx_legacy = node->location[0];
565 node->locy_legacy = node->location[1];
567 node->locx_legacy -= parent->location[0];
568 node->locy_legacy -= parent->location[1];
575 switch (ntree.
type) {
577 for (
bNode *node : ntree.all_nodes()) {
653 *node,
SOCK_IN,
"Boundary Smooth");
655 storage.boundary_smooth =
667 else if (node->is_type(
"FunctionNodeMatchString")) {
675 for (
bNode *node : ntree.all_nodes()) {
677 auto &storage = *
static_cast<NodeBlurData *
>(node->storage);
698 auto &storage = *
static_cast<NodeTonemap *
>(node->storage);
703 auto &storage = *
static_cast<NodeLensDist *
>(node->storage);
713 auto &storage = *
static_cast<NodeDenoise *
>(node->storage);
722 storage.interpolation =
725 storage.extension_x =
728 storage.extension_y =
734 storage.interpolation =
737 storage.extension_x =
740 storage.extension_y =
746 storage.interpolation =
749 storage.extension_x =
752 storage.extension_y =
756 auto &storage = *
static_cast<NodeMapUVData *
>(node->storage);
758 storage.interpolation =
761 storage.extension_x =
764 storage.extension_y =
773 auto &storage = *
static_cast<NodeScaleData *
>(node->storage);
775 storage.interpolation =
778 storage.extension_x =
781 storage.extension_y =
787 storage.interpolation =
790 storage.extension_x =
793 storage.extension_y =
799 storage.interpolation =
802 storage.extension_x =
805 storage.extension_y =
829 *node,
SOCK_IN,
"Feather Falloff");
830 storage.feather_falloff =
842 auto &storage = *
static_cast<NodeGlare *
>(node->storage);
849 auto &storage = *
static_cast<NodeSetAlpha *
>(node->storage);
854 auto &storage = *
static_cast<NodeChroma *
>(node->storage);
911 *node,
SOCK_IN,
"YCbCr Limit Channel");
927 auto &storage = *
static_cast<NodeChroma *
>(node->storage);
946 node->custom2 = bool(
950 *node,
SOCK_IN,
"Only Inside Outer");
951 node->custom1 = bool(
1050 switch (ndg->type) {
1052 ndg->angle = ndg->streaks;
1055 ndg->angle = ndg->star_45;
1067 Span{storage.capture_items, storage.capture_items_num})
1069 if (item.identifier == 0) {
1072 storage.data_type_legacy = item.data_type;
1082 if (
ELEM(item.socket_type,
1150 for (
bNode *node : ntree->all_nodes()) {
1156 node->custom1 =
data->parametrization;
1164 if (node->system_properties) {
1175 writer,
bNodePanelState, node->num_panel_states, node->panel_states_array);
1177 if (node->storage) {
1209 ntree->
runtime->execdata =
nullptr;
1356template<
typename T,
typename T_404>
1362 T_404 *orig_data =
static_cast<T_404 *
>(*raw_data);
1363 *raw_data =
nullptr;
1367 copy_fn(*final_data, *orig_data);
1368 *dest_data = final_data;
1463 dest.subtype = src.subtype;
1464 dest.value = src.value;
1477 dest.subtype = src.subtype;
1509 dest.subtype = src.subtype;
1510 dest.value = src.value;
1523 dest.subtype = src.subtype;
1524 STRNCPY(dest.value, src.value);
1543 dest.value = src.value;
1554 dest.value = src.value;
1574 dest.value = src.value;
1585 copy_v3_v3(dest.value_euler, src.value_euler);
1595 dest.value = src.value;
1677 sock->
runtime = MEM_new<bNodeSocketRuntime>(__func__);
1690 if (link->fromsock == sock || link->tosock == sock) {
1693 link->tosock->link =
nullptr;
1701 MEM_delete(sock->runtime);
1768 iuser->
scene =
nullptr;
1781 iuser->
scene =
nullptr;
1798 map.
add(
"GeometryNodeEvaluateClosure",
"NodeEvaluateClosure");
1799 map.
add(
"GeometryNodeClosureInput",
"NodeClosureInput");
1800 map.
add(
"GeometryNodeClosureOutput",
"NodeClosureOutput");
1801 map.
add(
"GeometryNodeCombineBundle",
"NodeCombineBundle");
1802 map.
add(
"GeometryNodeSeparateBundle",
"NodeSeparateBundle");
1830 "Fixing root node tree '%s' owned by '%s' missing EMBEDDED tag, please consider "
1831 "re-saving your (startup) file",
1842 ntree->
runtime = MEM_new<bNodeTreeRuntime>(__func__);
1851 node->runtime = MEM_new<bNodeRuntime>(__func__);
1852 node->typeinfo =
nullptr;
1853 node->runtime->index_in_tree =
i;
1857 if (node->identifier == 0 || ntree->
runtime->nodes_by_id.contains_as(node->identifier)) {
1861 ntree->
runtime->nodes_by_id.add_new(node);
1867 reader,
bNodePanelState, node->num_panel_states, &node->panel_states_array);
1949 if (!node->is_group()) {
1966 node_tree.ensure_interface_cache();
1968 auto *prop =
idprop::create(socket->name ? socket->name :
"", socket->socket_type).release();
1974 auto *prop =
idprop::create(socket->name ? socket->name :
"", socket->socket_type).release();
1982 auto property =
idprop::create(
"geometry_node_asset_traits_flag",
2070 while (sockdef->
type != -1) {
2077 while (sockdef->
type != -1) {
2119 if (add_sockets_before_init) {
2137 ntree->
typeinfo->node_add_init(ntree, node);
2140 if (!add_sockets_before_init) {
2221 const bool unregister)
2233 for (
bNode *node : ntree->all_nodes()) {
2258 for (
bNode *node : ntree.all_nodes()) {
2517 if (stype.
label[0] ==
'\0') {
2538 if (sock->identifier == identifier) {
2559 if (socket->is_available() && socket->name ==
name) {
2586 if (identifier[0] !=
'\0') {
2592 name.copy_utf8_truncated(auto_identifier);
2598 if (sock->identifier == check_name) {
2607 sizeof(auto_identifier));
2610 sock->
runtime = MEM_new<bNodeSocketRuntime>(__func__);
2616 name.copy_utf8_truncated(sock->
name);
2683 return default_value.
value !=
nullptr;
2688 return default_value.
value !=
nullptr;
2694 return default_value.
value !=
nullptr;
2700 return default_value.
value !=
nullptr;
2706 return default_value.
value !=
nullptr;
2796 if (!idname.has_value()) {
2797 CLOG_ERROR(&
LOG,
"static node socket type %d undefined", type);
2837 const std::optional<int> dimensions)
2845 return "NodeSocketFloatUnsigned";
2847 return "NodeSocketFloatPercentage";
2849 return "NodeSocketFloatFactor";
2851 return "NodeSocketFloatAngle";
2853 return "NodeSocketFloatTime";
2855 return "NodeSocketFloatTimeAbsolute";
2857 return "NodeSocketFloatDistance";
2859 return "NodeSocketFloatWavelength";
2861 return "NodeSocketFloatColorTemperature";
2863 return "NodeSocketFloatFrequency";
2866 return "NodeSocketFloat";
2871 return "NodeSocketIntUnsigned";
2873 return "NodeSocketIntPercentage";
2875 return "NodeSocketIntFactor";
2878 return "NodeSocketInt";
2881 return "NodeSocketBool";
2883 return "NodeSocketRotation";
2885 return "NodeSocketMatrix";
2887 if (!dimensions.has_value() || dimensions.value() == 3) {
2890 return "NodeSocketVectorFactor";
2892 return "NodeSocketVectorPercentage";
2894 return "NodeSocketVectorTranslation";
2896 return "NodeSocketVectorDirection";
2898 return "NodeSocketVectorVelocity";
2900 return "NodeSocketVectorAcceleration";
2902 return "NodeSocketVectorEuler";
2904 return "NodeSocketVectorXYZ";
2907 return "NodeSocketVector";
2910 else if (dimensions.value() == 2) {
2913 return "NodeSocketVectorFactor2D";
2915 return "NodeSocketVectorPercentage2D";
2917 return "NodeSocketVectorTranslation2D";
2919 return "NodeSocketVectorDirection2D";
2921 return "NodeSocketVectorVelocity2D";
2923 return "NodeSocketVectorAcceleration2D";
2925 return "NodeSocketVectorEuler2D";
2927 return "NodeSocketVectorXYZ2D";
2930 return "NodeSocketVector2D";
2933 else if (dimensions.value() == 4) {
2936 return "NodeSocketVectorFactor4D";
2938 return "NodeSocketVectorPercentage4D";
2940 return "NodeSocketVectorTranslation4D";
2942 return "NodeSocketVectorDirection4D";
2944 return "NodeSocketVectorVelocity4D";
2946 return "NodeSocketVectorAcceleration4D";
2948 return "NodeSocketVectorEuler4D";
2950 return "NodeSocketVectorXYZ4D";
2953 return "NodeSocketVector4D";
2958 return "NodeSocketVector";
2961 return "NodeSocketColor";
2965 return "NodeSocketStringFilePath";
2967 return "NodeSocketString";
2970 return "NodeSocketShader";
2972 return "NodeSocketObject";
2974 return "NodeSocketImage";
2976 return "NodeSocketGeometry";
2978 return "NodeSocketCollection";
2980 return "NodeSocketTexture";
2982 return "NodeSocketMaterial";
2984 return "NodeSocketMenu";
2986 return "NodeSocketBundle";
2988 return "NodeSocketClosure";
2992 return std::nullopt;
2996 const int type,
const int subtype,
const std::optional<int> dimensions)
3002 return "NodeTreeInterfaceSocketFloatUnsigned";
3004 return "NodeTreeInterfaceSocketFloatPercentage";
3006 return "NodeTreeInterfaceSocketFloatFactor";
3008 return "NodeTreeInterfaceSocketFloatAngle";
3010 return "NodeTreeInterfaceSocketFloatTime";
3012 return "NodeTreeInterfaceSocketFloatTimeAbsolute";
3014 return "NodeTreeInterfaceSocketFloatDistance";
3016 return "NodeTreeInterfaceSocketFloatWavelength";
3018 return "NodeTreeInterfaceSocketFloatColorTemperature";
3020 return "NodeTreeInterfaceSocketFloatFrequency";
3023 return "NodeTreeInterfaceSocketFloat";
3028 return "NodeTreeInterfaceSocketIntUnsigned";
3030 return "NodeTreeInterfaceSocketIntPercentage";
3032 return "NodeTreeInterfaceSocketIntFactor";
3035 return "NodeTreeInterfaceSocketInt";
3038 return "NodeTreeInterfaceSocketBool";
3040 return "NodeTreeInterfaceSocketRotation";
3042 return "NodeTreeInterfaceSocketMatrix";
3044 if (!dimensions.has_value() || dimensions.value() == 3) {
3047 return "NodeTreeInterfaceSocketVectorFactor";
3049 return "NodeTreeInterfaceSocketVectorPercentage";
3051 return "NodeTreeInterfaceSocketVectorTranslation";
3053 return "NodeTreeInterfaceSocketVectorDirection";
3055 return "NodeTreeInterfaceSocketVectorVelocity";
3057 return "NodeTreeInterfaceSocketVectorAcceleration";
3059 return "NodeTreeInterfaceSocketVectorEuler";
3061 return "NodeTreeInterfaceSocketVectorXYZ";
3064 return "NodeTreeInterfaceSocketVector";
3067 else if (dimensions.value() == 2) {
3070 return "NodeTreeInterfaceSocketVectorFactor2D";
3072 return "NodeTreeInterfaceSocketVectorPercentage2D";
3074 return "NodeTreeInterfaceSocketVectorTranslation2D";
3076 return "NodeTreeInterfaceSocketVectorDirection2D";
3078 return "NodeTreeInterfaceSocketVectorVelocity2D";
3080 return "NodeTreeInterfaceSocketVectorAcceleration2D";
3082 return "NodeTreeInterfaceSocketVectorEuler2D";
3084 return "NodeTreeInterfaceSocketVectorXYZ2D";
3087 return "NodeTreeInterfaceSocketVector2D";
3090 else if (dimensions.value() == 4) {
3093 return "NodeTreeInterfaceSocketVectorFactor4D";
3095 return "NodeTreeInterfaceSocketVectorPercentage4D";
3097 return "NodeTreeInterfaceSocketVectorTranslation4D";
3099 return "NodeTreeInterfaceSocketVectorDirection4D";
3101 return "NodeTreeInterfaceSocketVectorVelocity4D";
3103 return "NodeTreeInterfaceSocketVectorAcceleration4D";
3105 return "NodeTreeInterfaceSocketVectorEuler4D";
3107 return "NodeTreeInterfaceSocketVectorXYZ4D";
3110 return "NodeTreeInterfaceSocketVector4D";
3115 return "NodeTreeInterfaceSocketVector";
3118 return "NodeTreeInterfaceSocketColor";
3122 return "NodeTreeInterfaceSocketStringFilePath";
3124 return "NodeTreeInterfaceSocketString";
3127 return "NodeTreeInterfaceSocketShader";
3129 return "NodeTreeInterfaceSocketObject";
3131 return "NodeTreeInterfaceSocketImage";
3133 return "NodeTreeInterfaceSocketGeometry";
3135 return "NodeTreeInterfaceSocketCollection";
3137 return "NodeTreeInterfaceSocketTexture";
3139 return "NodeTreeInterfaceSocketMaterial";
3141 return "NodeTreeInterfaceSocketMenu";
3143 return "NodeTreeInterfaceSocketBundle";
3145 return "NodeTreeInterfaceSocketClosure";
3149 return std::nullopt;
3180 return "Collection";
3194 return std::nullopt;
3207 if (!idname.has_value()) {
3208 CLOG_ERROR(&
LOG,
"static node socket type %d undefined", type);
3230 if (default_value_menu.enum_items) {
3232 default_value_menu.enum_items->remove_user_and_delete_if_last();
3251 if (link->fromsock == &sock || link->tosock == &sock) {
3259 node.
runtime->internal_links.remove_and_reorder(
i);
3277 return reinterpret_cast<bNode *
>(
3283 ntree.ensure_topology_cache();
3284 return socket.owner_node();
3289 ntree.ensure_topology_cache();
3290 return socket.owner_node();
3295 for (
bNode *node : ntree.all_nodes()) {
3298 if (socket_iter == &socket) {
3309 ntree.ensure_interface_cache();
3311 if (
input->identifier == identifier) {
3320 bNode *parent_iter = &node;
3321 while (parent_iter->
parent !=
nullptr) {
3322 parent_iter = parent_iter->
parent;
3324 if (!parent_iter->is_frame()) {
3332 for (
const bNode *child_iter = &child; child_iter; child_iter = child_iter->
parent) {
3333 if (child_iter == &parent) {
3341 const bNode *node_start,
3342 bool (*callback)(
bNode *,
bNode *,
void *,
const bool),
3344 const bool reversed)
3354 if (link->fromnode != node_start) {
3359 if (link->tonode != node_start) {
3364 if (!callback(link->fromnode, link->tonode, userdata, reversed)) {
3368 ntree, reversed ? link->fromnode : link->tonode, callback, userdata, reversed);
3376 const char recursion_mask)
3380 stack.
push(node_start);
3387 if (link ==
nullptr) {
3408 if (zone_type->output_type == node->
type_legacy) {
3409 if (
bNode *zone_input_node =
const_cast<bNode *
>(
3410 zone_type->get_corresponding_input(*ntree, *node)))
3412 if (callback(zone_input_node, node, userdata)) {
3413 zone_stack.
push(zone_input_node);
3425 const int recursion_lvl)
3433 const char recursion_mask = (1 << recursion_lvl);
3437 node->runtime->iter_flag &= ~recursion_mask;
3446 if (!callback(node->
parent, userdata)) {
3467 while (ntree.
runtime->nodes_by_id.contains_as(new_id) || new_id <= 0) {
3472 ntree.
runtime->nodes_by_id.add_new(&node);
3473 node.
runtime->index_in_tree = ntree.
runtime->nodes_by_id.index_range().last();
3480 std::optional<int> unique_identifier)
3483 node->
runtime = MEM_new<bNodeRuntime>(__func__);
3485 if (unique_identifier) {
3487 ntree.
runtime->nodes_by_id.add_new(node);
3492 node->
ui_order = ntree.all_nodes().size();
3502 std::optional<StringRefNull> idname;
3507 if (ntype->type_legacy != type) {
3511 const char *disabled_hint;
3512 if (ntype->poll && ntype->poll(ntype, &ntree, &disabled_hint)) {
3513 idname = ntype->idname;
3526 sock_dst->
runtime = MEM_new<bNodeSocketRuntime>(__func__);
3527 if (sock_src->
prop) {
3540 if (default_value_menu.enum_items) {
3542 default_value_menu.enum_items->add_user();
3554 const bNode &node_src,
3556 const std::optional<StringRefNull> dst_unique_name,
3557 const std::optional<int> dst_unique_identifier,
3559 const bool allow_duplicate_names)
3562 *node_dst = node_src;
3563 node_dst->
runtime = MEM_new<bNodeRuntime>(__func__);
3564 if (dst_unique_name) {
3568 else if (dst_tree) {
3569 if (!allow_duplicate_names) {
3573 if (dst_unique_identifier) {
3574 node_dst->
identifier = *dst_unique_identifier;
3576 dst_tree->
runtime->nodes_by_id.add_new(node_dst);
3579 else if (dst_tree) {
3593 socket_map.
add_new(src_socket, dst_socket);
3601 socket_map.
add_new(src_socket, dst_socket);
3604 if (node_src.
prop) {
3614 node_dst->
runtime->internal_links = node_src.
runtime->internal_links;
3617 dst_link.
tonode = node_dst;
3627 node_src.
typeinfo->copyfunc(dst_tree, node_dst, &node_src);
3638 reinterpret_cast<ID *
>(dst_tree), &RNA_Node, node_dst);
3640 node_dst->
typeinfo->copyfunc_api(&
ptr, &node_src);
3652 if (!socket.is_output()) {
3662 ->default_value_typed<bNodeSocketValueFloat>()
3729 tree.ensure_topology_cache();
3731 bNode &dst_node = dst.owner_node();
3732 bNode &src_node = src.owner_node();
3736 if (src.is_multi_input()) {
3740 if (dst_node.is_reroute() || src_node.is_reroute()) {
3747 if (&src_type != &dst_type) {
3748 if (!convert.is_convertible(src_type, dst_type)) {
3755 dst_node.is_type(
"FunctionNodeInputString"))
3770 convert.convert_to_uninitialized(src_type, dst_type, src_value, dst_buffer);
3772 if (dst_node.is_type(
"ShaderNodeCombineXYZ")) {
3773 const float3 &src_value = *
static_cast<float3 *
>(dst_buffer);
3803 if (
ELEM(socket, link->fromsock, link->tosock)) {
3813 BLI_assert(ntree.all_nodes().contains(&fromnode));
3814 BLI_assert(ntree.all_nodes().contains(&tonode));
3834 link->
tonode = &fromnode;
3835 link->
tosock = &fromsock;
3840 if (link !=
nullptr && link->
tosock->is_multi_input()) {
3866 const bool was_muted = link.is_muted();
3868 if (muted != was_muted) {
3876 if (link->fromsock == &sock || link->tosock == &sock) {
3884 return !(link.
fromsock->is_visible() && link.
tosock->is_visible());
3896 const int deleted_index)
3901 if (link->tosock != sock || link->multi_input_sort_id <= deleted_index) {
3904 link->multi_input_sort_id -= 1;
3927 if (fromlink ==
nullptr) {
3928 if (link->
tosock->is_multi_input()) {
3936 if (link->
tosock->is_multi_input()) {
3939 if (link_to_compare->fromsock == fromlink->
fromsock &&
3940 link_to_compare->tosock == link->
tosock)
3943 &ntree, link_to_compare->tosock, link_to_compare->multi_input_sort_id);
3966 for (
bNodeLink *link : duplicate_links_to_remove) {
3972 if (link->
tonode == &node) {
3996 const bNode &to_node,
4005 offset_x = -(from_node.
typeinfo->width + 50);
4010 offset_x = to_node.
typeinfo->width + 50;
4016 float offset_y =
U.widget_unit * tot_sock_idx;
4031 offset_y -=
U.widget_unit * tot_sock_idx;
4040 if (socket->link !=
nullptr) {
4049 std::optional<Library *> owner_library,
4051 const bool is_embedded,
4059 if (is_embedded || bmain ==
nullptr) {
4063 "Embedded NTrees should never have a defined owner library here");
4073 *ntree_owner_ptr = ntree;
4152 if (xsize == 0 || ysize == 0) {
4174 this->
ibuf = other.ibuf;
4175 other.ibuf =
nullptr;
4191 for (
bNode *node : ntree->all_nodes()) {
4199 if (node->is_group() && group !=
nullptr) {
4216 for (
bNode *node : ntree->all_nodes()) {
4223 if (node->is_group()) {
4242 if (remove_old || to_ntree->
runtime->previews.is_empty()) {
4243 to_ntree->
runtime->previews.clear();
4244 to_ntree->
runtime->previews = std::move(from_ntree->
runtime->previews);
4248 for (
const auto &item : from_ntree->
runtime->previews.items()) {
4249 to_ntree->
runtime->previews.add(item.key, std::move(item.value));
4251 from_ntree->
runtime->previews.clear();
4259 if (link->fromnode == &node) {
4262 else if (link->tonode == &node) {
4268 if (link->tonode != &node && link->tosock->is_multi_input()) {
4270 &ntree, link->tosock, link->multi_input_sort_id);
4273 if (link->fromsock == sock || link->tosock == sock) {
4284 for (
bNode *node : ntree->all_nodes()) {
4285 if (node->
parent == parent) {
4294 node_tree.
runtime->nodes_by_id.clear();
4297 node_tree.
runtime->nodes_by_id.add_new(node);
4310 const bool was_last = ntree->
runtime->nodes_by_id.as_span().last() == &node;
4314 ntree->
runtime->nodes_by_id.pop();
4324 ntree->
runtime->execdata =
nullptr;
4356 if (node.
runtime->declaration) {
4360 delete node.
runtime->declaration;
4387 Main *bmain,
bNodeTree &ntree,
bNode &node,
const bool do_id_user,
const bool remove_animation)
4414 if (remove_animation) {
4422 if (bmain !=
nullptr) {
4448 if (node->is_group() && ngroup !=
nullptr) {
4477 if (node->is_type(
"CompositorNodeOutputFile")) {
4480 const bool node_is_output = node->is_type(
"CompositorNodeViewer") ||
4481 node->is_type(
"GeometryNodeViewer");
4492 const bool tnode_is_output = tnode->is_type(
"CompositorNodeViewer") ||
4493 tnode->is_type(
"GeometryNodeViewer");
4494 const bool viewer_case = (is_compositor || is_geometry) && tnode_is_output &&
4496 const bool has_same_shortcut = viewer_case && node != tnode &&
4500 if (tnode->type_legacy == node->
type_legacy || viewer_case) {
4508 if (has_same_shortcut) {
4514 if (
output == 0 && !is_geometry) {
4520 if (node->is_group_output()) {
4523 if (!tnode->is_group_output()) {
4549 switch (
GS(
id->name)) {
4551 return &
reinterpret_cast<Material *
>(
id)->nodetree;
4553 return &
reinterpret_cast<Light *
>(
id)->nodetree;
4555 return &
reinterpret_cast<World *
>(
id)->nodetree;
4557 return &
reinterpret_cast<Tex *
>(
id)->nodetree;
4560 return &
reinterpret_cast<Scene *
>(
id)->nodetree;
4571 return (nodetree !=
nullptr) ? *nodetree :
nullptr;
4576 for (
bNode *node : ntree.all_nodes()) {
4588 if (ntree ==
nullptr) {
4606 if (node->is_group() && group !=
nullptr) {
4616 while (node_src !=
nullptr) {
4617 node_local->
runtime->original = node_src;
4618 node_src = node_src->
next;
4619 node_local = node_local->
next;
4623 ntree->
typeinfo->localize(ltree, ntree);
4631 if (ntree && localtree) {
4632 if (ntree->
typeinfo->local_merge) {
4633 ntree->
typeinfo->local_merge(bmain, localtree, ntree);
4642 if (&tree_to_search_in == &tree_to_search_for) {
4646 tree_to_search_in.ensure_topology_cache();
4647 for (
const bNode *node_group : tree_to_search_in.group_nodes()) {
4648 const bNodeTree *sub_tree_search_in =
reinterpret_cast<const bNodeTree *
>(node_group->id);
4649 if (!sub_tree_search_in) {
4652 if (!already_passed.
add(sub_tree_search_in)) {
4666 if (&tree_to_search_in == &tree_to_search_for) {
4678 if (link->fromsock == &sock || link->tosock == &sock) {
4687 for (
bNode *node : ntree.all_nodes()) {
4697 bool changed =
false;
4719 for (
bNode *node : ntree.all_nodes()) {
4733 for (
bNode *tnode : ntree.all_nodes()) {
4734 tnode->flag &= ~flags_to_set;
4736 node.
flag |= flags_to_set;
4741 if (is_available == sock.is_available()) {
4755 if (sock.is_multi_input()) {
4775 socket->runtime->declaration = &socket_decl;
4782 socket->runtime->declaration =
nullptr;
4789 if (node->
runtime->declaration->skip_updating_sockets) {
4800 if (node.
runtime->declaration !=
nullptr) {
4804 if (node.
typeinfo->static_declaration) {
4805 if (!node.
typeinfo->static_declaration->is_context_dependent) {
4840 *r_links = node.
runtime->internal_links.data();
4841 *r_len = node.
runtime->internal_links.size();
4857 while ((c = *
str++)) {
4885 result.add(ntype->type_legacy);
4912 const std::string old_idname = node->
idname;
4928 for (
bNode *node : ntree->all_nodes()) {
4947 if (
id ==
nullptr) {
4951 bool need_update =
false;
4955 for (
bNode *node : ntree->all_nodes()) {
4956 if (node->
id ==
id) {
4972 if (node.
label[0] !=
'\0') {
4979 return label_buffer;
4987 if (sock.
runtime->declaration !=
nullptr) {
4990 return sock.
runtime->declaration->short_label.data();
4993 return std::nullopt;
5004 if (sock.
runtime->declaration ==
nullptr) {
5008 const std::optional<std::string> &translation_context =
5009 sock.
runtime->declaration->translation_context;
5012 if (!translation_context.has_value()) {
5016 return translation_context->c_str();
5021 const int nclass = node.
typeinfo->ui_class ==
nullptr ? node.
typeinfo->nclass :
5081 const char **r_disabled_hint)
5088 static std::atomic<int> next_legacy_type = []() {
5094 const int new_type = next_legacy_type.fetch_add(1);
5095 BLI_assert(new_type <= std::numeric_limits<int16_t>::max());
5101 ntype.
idname = std::move(idname);
5103 if (!legacy_type.has_value()) {
5164 return std::nullopt;
5192 return std::nullopt;
5243 if (type.
is<
float>()) {
5246 if (type.
is<
int>()) {
5255 if (type.
is<
bool>()) {
5267 if (type.
is<std::string>()) {
5282 if (type.
is<
Tex *>()) {
5295 return std::nullopt;
5310 return std::nullopt;
5326 return std::nullopt;
5332 const char defname[],
5338 if (ntemp_iter != ntemp) {
5339 if (ntemp_iter->identifier == check_name) {
5363 ntemp->identifier[0] =
'\0';
5367 STRNCPY(ntemp->identifier, ntemp->name);
5374 ntemp->identifier[0] =
'\0';
5378 STRNCPY(ntemp->identifier, ntemp->name);
5386 ntype.
width = width;
5388 if (maxwidth <= minwidth) {
5415 const std::optional<StringRefNull> storagename,
5416 void (*freefunc)(
bNode *node),
5419 const bNode *src_node))
5437 if (nt->rna_ext.free) {
5438 nt->rna_ext.free(nt->rna_ext.data);
5445 if (st->ext_socket.free) {
5446 st->ext_socket.free(st->ext_socket.data);
5448 if (st->ext_interface.free) {
5449 st->ext_interface.free(st->ext_interface.data);
5456 if (nt->rna_ext.free) {
5457 nt->rna_ext.free(nt->rna_ext.data);
5480 *r_nodetree = &node_tree;
5481 *r_id = &node_tree.
id;
5485 if (ntreeiter->
scene) {
5488 *r_nodetree =
reinterpret_cast<bNodeTree *
>(ntreeiter->
scene->nodetree);
5489 *r_id = &ntreeiter->
scene->
id;
5493 if (ntreeiter->
mat) {
5495 *r_id = &ntreeiter->
mat->
id;
5499 if (ntreeiter->
tex) {
5501 *r_id = &ntreeiter->
tex->
id;
5505 if (ntreeiter->
light) {
5507 *r_id = &ntreeiter->
light->
id;
5511 if (ntreeiter->
world) {
5513 *r_id = &ntreeiter->
world->
id;
5531 for (
bNode *node : ntree->all_nodes()) {
5533 if (node->
custom1 == layer_index) {
5536 else if (node->
custom1 > layer_index) {
void BKE_animdata_free(ID *id, bool do_id_user)
bool BKE_animdata_fix_paths_remove(struct ID *id, const char *prefix)
void BKE_asset_metadata_idprop_ensure(AssetMetaData *asset_data, IDProperty *prop)
bool BKE_bpath_foreach_path_fixed_process(BPathForeachPathData *bpath_data, char *path, size_t path_maxncpy)
void BKE_colorband_foreach_working_space_color(ColorBand *coba, const IDTypeForeachColorFunctionCallback &fn)
void IDP_foreach_property(IDProperty *id_property_root, int type_filter, blender::FunctionRef< void(IDProperty *id_property)> callback)
#define IDP_BlendDataRead(reader, prop)
void IDP_FreeProperty(IDProperty *prop)
void IDP_FreePropertyContent_ex(IDProperty *prop, bool do_id_user)
bool IDP_AddToGroup(IDProperty *group, IDProperty *prop) ATTR_NONNULL()
IDProperty * IDP_CopyProperty_ex(const IDProperty *prop, int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_BlendWrite(BlendWriter *writer, const IDProperty *prop)
void(*)(ID *id, const IDCacheKey *cache_key, void **cache_p, uint flags, void *user_data) IDTypeForeachCacheFunctionCallback
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, std::optional< const ID * > new_owner_id, ID **new_id_p, int flag)
void BKE_libblock_free_data_py(ID *id)
void BKE_libblock_free_runtime_data(ID *id)
void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL()
void BKE_libblock_init_empty(ID *id) ATTR_NONNULL(1)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
@ LIB_ID_COPY_NO_ANIMDATA
void * BKE_libblock_alloc_in_lib(Main *bmain, std::optional< Library * > owner_library, short type, const char *name, int flag) ATTR_WARN_UNUSED_RESULT
void BKE_id_blend_write(BlendWriter *writer, ID *id)
#define BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL(data_, func_call_)
#define BKE_LIB_FOREACHID_PROCESS_IDSUPER(data_, id_super_, cb_flag_)
@ IDWALK_CB_READFILE_IGNORE
#define BKE_LIB_FOREACHID_PROCESS_ID(data_, id_, cb_flag_)
#define NODE_CLASS_OUTPUT
#define NODE_CLASS_INTERFACE
constexpr int GROUP_NODE_DEFAULT_WIDTH
#define NODE_CUSTOM_GROUP
#define NODE_CLASS_CONVERTER
#define NODE_LEGACY_TYPE_GENERATION_START
#define NODE_CLASS_PATTERN
#define NODE_CLASS_GEOMETRY
#define NODE_CLASS_DISTORT
constexpr int NODE_DEFAULT_MAX_WIDTH
#define FOREACH_NODETREE_END
#define NODE_CLASS_OP_VECTOR
#define NODE_CLASS_LAYOUT
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
#define NODE_CLASS_OP_COLOR
#define NODE_CLASS_OP_FILTER
#define NODE_CLASS_ATTRIBUTE
#define NODE_CLASS_TEXTURE
#define NODE_CLASS_SHADER
#define NODE_CLASS_SCRIPT
#define GEO_NODE_MERGE_BY_DISTANCE
#define GEO_NODE_TRIANGULATE
#define CMP_NODE_PREMULKEY
#define GEO_NODE_SUBDIVISION_SURFACE
#define SH_NODE_CURVE_FLOAT
#define CMP_NODE_COLOR_SPILL
#define CMP_NODE_CORNERPIN
#define GEO_NODE_MESH_TO_VOLUME
#define CMP_NODE_MASK_ELLIPSE
#define CMP_NODE_DISPLACE
#define SH_NODE_TEX_IMAGE
#define CMP_NODE_CRYPTOMATTE
#define CMP_NODE_TRANSLATE
#define GEO_NODE_UV_PACK_ISLANDS
#define CMP_NODE_MOVIEDISTORTION
#define SH_NODE_SUBSURFACE_SCATTERING
#define CMP_NODE_COLORBALANCE
#define GEO_NODE_REMOVE_ATTRIBUTE
#define GEO_NODE_UV_UNWRAP
#define FN_NODE_INPUT_COLOR
#define CMP_NODE_KUWAHARA
#define FN_NODE_INPUT_VECTOR
#define SH_NODE_TEX_ENVIRONMENT
#define SH_NODE_NORMAL_MAP
#define SH_NODE_CURVE_VEC
#define CMP_NODE_HUECORRECT
#define GEO_NODE_TRANSFORM_GEOMETRY
#define CMP_NODE_TRANSFORM
#define CMP_NODE_DILATEERODE
#define CMP_NODE_LENSDIST
#define GEO_NODE_SAMPLE_GRID
#define FN_NODE_INPUT_INT
#define GEO_NODE_FILLET_CURVE
#define FN_NODE_INPUT_BOOL
#define CMP_NODE_CRYPTOMATTE_LEGACY
#define CMP_NODE_TRACKPOS
#define CMP_NODE_OUTPUT_FILE
#define CMP_NODE_SETALPHA
#define SH_NODE_BSDF_HAIR_PRINCIPLED
#define CMP_NODE_CURVE_RGB
#define CMP_NODE_DOUBLEEDGEMASK
#define GEO_NODE_RESAMPLE_CURVE
#define CMP_NODE_STABILIZE2D
#define SH_NODE_VECTOR_DISPLACEMENT
#define GEO_NODE_SCALE_ELEMENTS
#define SH_NODE_CURVE_RGB
#define GEO_NODE_CAPTURE_ATTRIBUTE
#define CMP_NODE_MASK_BOX
#define GEO_NODE_FILL_CURVE
#define TEX_NODE_CURVE_TIME
#define GEO_NODE_POINTS_TO_VOLUME
#define CMP_NODE_R_LAYERS
#define GEO_NODE_DISTRIBUTE_POINTS_IN_VOLUME
#define CMP_NODE_DIST_MATTE
#define CMP_NODE_VIEW_LEVELS
#define CMP_NODE_CURVE_VEC_DEPRECATED
#define TEX_NODE_VALTORGB
#define GEO_NODE_VOLUME_TO_MESH
#define GEO_NODE_SET_CURVE_NORMAL
#define TEX_NODE_CURVE_RGB
#define CMP_NODE_CHANNEL_MATTE
void BKE_ntree_update_tag_node_new(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_socket_type(bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_node_internal_link(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_all(bNodeTree *ntree)
void BKE_ntree_update_tag_link_changed(bNodeTree *ntree)
void BKE_ntree_update_tag_socket_new(bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_socket_removed(bNodeTree *ntree)
void BKE_ntree_update_tag_missing_runtime_data(bNodeTree *ntree)
void BKE_ntree_update_tag_link_removed(bNodeTree *ntree)
void BKE_ntree_update_tag_socket_availability(bNodeTree *ntree, bNodeSocket *socket)
void BKE_ntree_update_tag_node_type(bNodeTree *ntree, bNode *node)
void BKE_ntree_update(Main &bmain, std::optional< blender::Span< bNodeTree * > > modified_trees=std::nullopt, const NodeTreeUpdateExtraParams ¶ms={})
void BKE_ntree_update_tag_node_removed(bNodeTree *ntree)
void BKE_ntree_update_tag_node_property(bNodeTree *ntree, bNode *node)
void BKE_ntree_update_tag_link_added(bNodeTree *ntree, bNodeLink *link)
void BKE_ntree_update_tag_link_mute(bNodeTree *ntree, bNodeLink *link)
void BKE_ntree_update_tag_parent_change(bNodeTree *ntree, bNode *node)
void BKE_previewimg_blend_write(BlendWriter *writer, const PreviewImage *prv)
void BKE_previewimg_free(PreviewImage **prv)
void BKE_previewimg_blend_read(BlendDataReader *reader, PreviewImage *prv)
void BKE_previewimg_id_copy(ID *new_id, const ID *old_id)
@ VOLUME_GRID_VECTOR_FLOAT
#define BLI_assert_unreachable()
#define BLI_assert_msg(a, msg)
#define BUFFER_FOR_CPP_TYPE_VALUE(type, variable_name)
unsigned int BLI_ghashutil_strhash_p(const void *ptr)
int BLI_findindex(const ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(ListBase *lb)
void * BLI_findstring(const ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
void void BLI_freelistN(ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
#define LISTBASE_FOREACH_BACKWARD_MUTABLE(type, var, list)
void BLI_remlink(ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_listbase_count(const ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v3_v3(float r[3], const float a[3])
char * BLI_strdup_null(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_MALLOC
char * STRNCPY(char(&dst)[N], const char *src)
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define SNPRINTF_UTF8(dst, format,...)
#define STRNCPY_UTF8(dst, src)
size_t void BLI_uniquename_cb(blender::FunctionRef< bool(blender::StringRefNull)> unique_check, const char *defname, char delim, char *name, size_t name_maxncpy) ATTR_NONNULL(2
void BLI_uniquename(const struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t name_maxncpy) ATTR_NONNULL(1
Platform independent time functions.
double BLI_time_now_seconds(void)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define BLO_read_data_address(reader, ptr_p)
int BLO_read_fileversion_get(BlendDataReader *reader)
void BLO_write_struct_by_name(BlendWriter *writer, const char *struct_name, const void *data_ptr)
#define BLO_write_id_struct(writer, struct_name, id_address, id)
#define BLO_write_struct(writer, struct_name, data_ptr)
void * BLO_read_struct_by_name_array(BlendDataReader *reader, const char *struct_name, int64_t items_num, const void *old_address)
bool BLO_read_lib_is_undo(BlendLibReader *reader)
void BLO_read_string(BlendDataReader *reader, char **ptr_p)
void BLO_write_string(BlendWriter *writer, const char *data_ptr)
#define BLO_write_struct_array(writer, struct_name, array_size, data_ptr)
#define BLO_read_struct_list(reader, struct_name, list)
#define BLO_read_struct_array(reader, struct_name, array_size, ptr_p)
#define BLO_read_struct(reader, struct_name, ptr_p)
bool BLO_write_is_undo(BlendWriter *writer)
#define BLT_I18NCONTEXT_ID_NODETREE
#define CLOG_ERROR(clg_ref,...)
#define CLOG_WARN(clg_ref,...)
void DEG_relations_tag_update(Main *bmain)
Object groups, one object can be in many groups at once.
@ NODE_ACTIVE_PAINT_CANVAS
@ NODE_VIEWER_SHORTCUT_NONE
CMPNodeChannelMatteColorSpace
@ CMP_NODE_CHANNEL_MATTE_CS_YUV
@ CMP_NODE_CHANNEL_MATTE_CS_RGB
@ CMP_NODE_CHANNEL_MATTE_CS_HSV
@ CMP_NODE_CHANNEL_MATTE_CS_YCC
struct bNodeSocket bNodeSocket
struct RuntimeNodeEnumItemsHandle RuntimeNodeEnumItemsHandle
@ CMP_NODE_GLARE_SIMPLE_STAR
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
bool IMB_alloc_byte_pixels(ImBuf *ibuf, bool initialize_pixels=true)
void IMB_freeImBuf(ImBuf *ibuf)
ImBuf * IMB_allocImBuf(unsigned int x, unsigned int y, unsigned char planes, unsigned int flags)
void IMB_rect_size_set(ImBuf *ibuf, const uint size[2])
Read Guarded memory(de)allocation.
void ntreeShaderEndExecTree(struct bNodeTreeExec *exec)
void ntreeTexEndExecTree(struct bNodeTreeExec *exec)
BMesh const char void * data
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
static const CPPType & get()
void move_assign(void *src, void *dst) const
void destruct(void *ptr) const
void value_initialize(void *ptr) const
const Value * lookup_ptr(const Key &key) const
bool add(const Key &key, const Value &value)
const Value & lookup(const Key &key) const
Value & lookup_or_add_cb(const Key &key, const CreateValueF &create_value)
const Value * lookup_ptr_as(const ForwardKey &key) const
void add_new(const Key &key, const Value &value)
static RandomNumberGenerator from_random_seed()
void add_destruct_call(Func func)
bool contains(const Key &key) const
void push(const T &value)
constexpr bool is_empty() const
void copy_utf8_truncated(char *dst, int64_t dst_size) const
constexpr const char * c_str() const
const Key & lookup_key_as(const ForwardKey &key) const
void reserve(const int64_t n)
void append_non_duplicates(const T &value)
std::unique_ptr< node_tree_reference_lifetimes::ReferenceLifetimesInfo > reference_lifetimes_info
std::unique_ptr< nodes::StructureTypeInterface > structure_type_interface
Map< bNodeInstanceKey, bNodePreview > previews
NodeIDVectorSet nodes_by_id
std::unique_ptr< nodes::FieldInferencingInterface > field_inferencing_interface
float length(VecOp< float, D >) RET
void * MEM_mallocN(size_t len, const char *str)
void * MEM_callocN(size_t len, const char *str)
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void * MEM_dupallocN(const void *vmemh)
size_t(* MEM_allocN_len)(const void *vmemh)
void MEM_freeN(void *vmemh)
static void write_legacy_properties(bNodeTree &ntree)
static void update_node_location_legacy(bNodeTree &ntree)
std::unique_ptr< IDProperty, IDPropertyDeleter > create(StringRef prop_name, int32_t value, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_INT, set its name and value.
std::unique_ptr< IDProperty, IDPropertyDeleter > create_group(StringRef prop_name, eIDPropertyFlag flags={})
Allocate a new IDProperty of type IDP_GROUP.
struct blender::bke::versioning_internal::bNodeSocketValueBoolean_404 bNodeSocketValueBoolean_404
struct blender::bke::versioning_internal::bNodeSocketValueFloat_404 bNodeSocketValueFloat_404
struct blender::bke::versioning_internal::bNodeSocketValueRotation_404 bNodeSocketValueRotation_404
struct blender::bke::versioning_internal::bNodeSocketValueString_404 bNodeSocketValueString_404
struct blender::bke::versioning_internal::bNodeSocketValueVector_404 bNodeSocketValueVector_404
struct blender::bke::versioning_internal::bNodeSocketValueCollection_404 bNodeSocketValueCollection_404
struct blender::bke::versioning_internal::bNodeSocketValueTexture_404 bNodeSocketValueTexture_404
struct blender::bke::versioning_internal::bNodeSocketValueRGBA_404 bNodeSocketValueRGBA_404
struct blender::bke::versioning_internal::bNodeSocketValueMenu_404 bNodeSocketValueMenu_404
struct blender::bke::versioning_internal::bNodeSocketValueInt_404 bNodeSocketValueInt_404
struct blender::bke::versioning_internal::bNodeSocketValueImage_404 bNodeSocketValueImage_404
constexpr int MIN_BLENDFILE_VERSION_FOR_MODERN_NODE_SOCKET_DEFAULT_VALUE_READING
struct blender::bke::versioning_internal::bNodeSocketValueObject_404 bNodeSocketValueObject_404
static void direct_link_node_socket_legacy_data_version_do(void **dest_data, void **raw_data, blender::FunctionRef< void(T &dest, T_404 &source)> copy_fn)
struct blender::bke::versioning_internal::bNodeSocketValueMaterial_404 bNodeSocketValueMaterial_404
void node_unregister_socket_type(bNodeSocketType &stype)
bNode * node_find_node_by_name(bNodeTree &ntree, StringRefNull name)
bNodeSocket * node_find_enabled_input_socket(bNode &node, StringRef name)
void node_position_propagate(bNode &node)
void node_chain_iterator_backwards(const bNodeTree *ntree, bNode *node_start, bool(*callback)(bNode *, bNode *, void *), void *userdata, int recursion_lvl)
NodeColorTag node_color_tag(const bNode &node)
static void node_free_type(void *nodetype_v)
void node_socket_declarations_update(bNode *node)
static void node_preview_init_tree_recursive(Map< bNodeInstanceKey, bNodePreview > &previews, bNodeTree *ntree, bNodeInstanceKey parent_key, const int xsize, const int ysize)
void node_tree_free_local_node(bNodeTree &ntree, bNode &node)
static bool socket_id_user_decrement(bNodeSocket *sock)
void node_tree_set_output(bNodeTree &ntree)
static ID ** node_owner_pointer_get(ID *id, const bool debug_relationship_assert)
const bNodeZoneType * zone_type_by_node_type(const int node_type)
void node_modify_socket_type_static(bNodeTree *ntree, bNode *node, bNodeSocket *sock, int type, int subtype)
StringRefNull node_type_find_alias(StringRefNull alias)
bNodeSocketType NodeSocketTypeUndefined
std::string node_label(const bNodeTree &ntree, const bNode &node)
std::optional< eNodeSocketDatatype > geo_nodes_base_cpp_type_to_socket_type(const CPPType &type)
void node_tree_remove_layer_n(bNodeTree *ntree, Scene *scene, int layer_index)
bool node_is_parent_and_child(const bNode &parent, const bNode &child)
void node_attach_node(bNodeTree &ntree, bNode &node, bNode &parent)
void node_tree_blend_read_data(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree)
static void node_foreach_working_space_color(ID *id, const IDTypeForeachColorFunctionCallback &fn)
static bool node_poll_default(const bNodeType *, const bNodeTree *, const char **)
const bNodeTreeInterfaceSocket * node_find_interface_input_by_identifier(const bNodeTree &ntree, StringRef identifier)
void node_register_alias(bNodeType &nt, StringRef alias)
bool node_tree_is_registered(const bNodeTree &ntree)
static void node_init(const bContext *C, bNodeTree *ntree, bNode *node)
static void node_type_base_defaults(bNodeType &ntype)
static void direct_link_node_socket_default_value(BlendDataReader *reader, bNodeSocket *sock)
bNodeTreeType * node_tree_type_find(StringRef idname)
static void ntree_set_typeinfo(bNodeTree *ntree, bNodeTreeType *typeinfo)
void node_unlink_node(bNodeTree &ntree, bNode &node)
void node_tree_free_tree(bNodeTree &ntree)
Span< bNodeSocketType * > node_socket_types_get()
void node_tag_update_id(bNode &node)
static void socket_id_user_increment(bNodeSocket *sock)
bNodeTree * node_tree_add_tree_embedded(Main *bmain, ID *owner_id, StringRefNull name, StringRefNull idname)
std::optional< VolumeGridType > socket_type_to_grid_type(eNodeSocketDatatype type)
bNodeTree * node_tree_copy_tree(Main *bmain, const bNodeTree &ntree)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
void node_remove_node(Main *bmain, bNodeTree &ntree, bNode &node, bool do_id_user, bool remove_animation=true)
bool node_socket_is_registered(const bNodeSocket &sock)
bool node_tree_iterator_step(NodeTreeIterStore *ntreeiter, bNodeTree **r_nodetree, ID **r_id)
static void update_socket_declarations(ListBase *sockets, Span< nodes::SocketDeclaration * > declarations)
void node_internal_links(bNode &node, bNodeLink **r_links, int *r_len)
bNode * node_add_node(const bContext *C, bNodeTree &ntree, StringRef idname, std::optional< int > unique_identifier=std::nullopt)
static Set< int > get_known_node_types_set()
static void remove_unsupported_sockets(ListBase *sockets, ListBase *links)
bNode * node_get_active(bNodeTree &ntree)
static void defer_free_tree_type(bNodeTreeType *tree_type)
void node_tree_blend_write(BlendWriter *writer, bNodeTree *ntree)
static void node_foreach_path(ID *id, BPathForeachPathData *bpath_data)
bool node_link_is_selected(const bNodeLink &link)
static const CPPType * slow_socket_type_to_geo_nodes_base_cpp_type(const eNodeSocketDatatype type)
static void collect_used_previews(Map< bNodeInstanceKey, bNodePreview > &previews, bNodeTree *ntree, bNodeInstanceKey parent_key, Set< bNodeInstanceKey > &used)
void node_remove_socket(bNodeTree &ntree, bNode &node, bNodeSocket &sock)
void node_update_asset_metadata(bNodeTree &node_tree)
static bool is_node_socket_supported(const bNodeSocket *sock)
const DataTypeConversions & get_implicit_type_conversions()
static void defer_free_node_type(bNodeType *ntype)
static void ntree_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *id_src, const int flag)
static auto & get_socket_type_map()
static void node_blend_write_storage(BlendWriter *writer, bNodeTree *ntree, bNode *node)
void node_unique_id(bNodeTree &ntree, bNode &node)
void node_type_size(bNodeType &ntype, int width, int minwidth, int maxwidth)
void node_register_type(bNodeType &ntype)
std::optional< StringRefNull > node_socket_short_label(const bNodeSocket &sock)
static void ntree_free_data(ID *id)
static void adjust_multi_input_indices_after_removed_link(bNodeTree *ntree, const bNodeSocket *sock, const int deleted_index)
static void ntree_blend_read_after_liblink(BlendLibReader *reader, ID *id)
void node_set_socket_availability(bNodeTree &ntree, bNodeSocket &sock, bool is_available)
const char * node_socket_translation_context(const bNodeSocket &sock)
void node_remove_link(bNodeTree *ntree, bNodeLink &link)
void node_chain_iterator(const bNodeTree *ntree, const bNode *node_start, bool(*callback)(bNode *, bNode *, void *, const bool), void *userdata, bool reversed)
static bool ntree_contains_tree_exec(const bNodeTree &tree_to_search_in, const bNodeTree &tree_to_search_for, Set< const bNodeTree * > &already_passed)
Span< bNodeType * > node_types_get()
static bool can_read_node_type(const bNode &node)
std::optional< StringRefNull > node_static_socket_interface_type_new(int type, int subtype, std::optional< int > dimensions=std::nullopt)
static void ntree_init_data(ID *id)
void node_tree_local_merge(Main *bmain, bNodeTree *localtree, bNodeTree *ntree)
void node_tree_set_type(bNodeTree &ntree)
bool node_declaration_ensure_on_outdated_node(bNodeTree &ntree, bNode &node)
static void direct_link_node_socket_storage(BlendDataReader *reader, const bNode *node, bNodeSocket *sock)
static bNodeSocket * make_socket(bNodeTree *ntree, bNode *, const int in_out, ListBase *lb, const StringRefNull idname, const StringRefNull identifier, const StringRefNull name)
void node_tree_type_add(bNodeTreeType &nt)
void node_tree_update_all_new(Main &main)
void node_type_base(bNodeType &ntype, std::string idname, std::optional< int16_t > legacy_type=std::nullopt)
bNodePreview * node_preview_verify(Map< bNodeInstanceKey, bNodePreview > &previews, bNodeInstanceKey key, int xsize, int ysize, bool create)
void node_tree_iterator_init(NodeTreeIterStore *ntreeiter, Main *bmain)
static bNodeInstanceKey node_hash_int_str(bNodeInstanceKey hash, const char *str)
static int16_t get_next_auto_legacy_type()
std::optional< eNodeSocketDatatype > grid_type_to_socket_type(VolumeGridType type)
void node_node_foreach_id(bNode *node, LibraryForeachIDData *data)
bNodeTreeType NodeTreeTypeUndefined
static void node_set_typeinfo(const bContext *C, bNodeTree *ntree, bNode *node, bNodeType *typeinfo)
static void node_tree_asset_on_clear_asset(void *asset_ptr, AssetMetaData *asset_data)
bNodeTree ** node_tree_ptr_from_id(ID *id)
bNodeTree * node_tree_localize(bNodeTree *ntree, std::optional< ID * > new_owner_id)
void node_parents_iterator(bNode *node, bool(*callback)(bNode *, void *), void *userdata)
void node_unlink_attached(bNodeTree *ntree, const bNode *parent)
int node_count_socket_links(const bNodeTree &ntree, const bNodeSocket &sock)
void node_internal_relink(bNodeTree &ntree, bNode &node)
static void reset_socket_declarations(ListBase *sockets)
bNode * node_find_node_try(bNodeTree &ntree, bNodeSocket &socket)
static void direct_link_node_socket(BlendDataReader *reader, const bNode *node, bNodeSocket *sock)
const bNodeInstanceKey NODE_INSTANCE_KEY_BASE
std::optional< eNodeSocketDatatype > custom_data_type_to_socket_type(eCustomDataType type)
void node_free_node(bNodeTree *tree, bNode &node)
void node_preview_remove_unused(bNodeTree *ntree)
bool node_preview_used(const bNode &node)
bNodeType NodeTypeUndefined
static void node_foreach_id(ID *id, LibraryForeachIDData *data)
void node_tree_type_free_link(const bNodeTreeType &nt)
void node_type_socket_templates(bNodeType *ntype, bNodeSocketTemplate *inputs, bNodeSocketTemplate *outputs)
bNodeInstanceKey node_instance_key(bNodeInstanceKey parent_key, const bNodeTree *ntree, const bNode *node)
static void ntree_blend_read_data(BlendDataReader *reader, ID *id)
static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src, const int flag)
static void node_update_idname_from_experimental(bNode &node)
void node_register_socket_type(bNodeSocketType &stype)
void node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, bool remove_old)
static auto & get_node_tree_type_map()
static bool node_poll_instance_default(const bNode *node, const bNodeTree *ntree, const char **r_disabled_hint)
bNodeSocket * node_find_enabled_output_socket(bNode &node, StringRef name)
const CPPType * socket_type_to_geo_nodes_base_cpp_type(eNodeSocketDatatype type)
void node_position_relative(bNode &from_node, const bNode &to_node, const bNodeSocket *from_sock, const bNodeSocket &to_sock)
bool node_set_selected(bNode &node, bool select)
bNodeSocket * node_add_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out, StringRefNull idname, StringRefNull identifier, StringRefNull name)
bNode & node_find_node(bNodeTree &ntree, bNodeSocket &socket)
static void node_tree_asset_pre_save(void *asset_ptr, AssetMetaData *)
static auto & get_node_type_alias_map()
bool node_tree_contains_tree(const bNodeTree &tree_to_search_in, const bNodeTree &tree_to_search_for)
void node_detach_node(bNodeTree &ntree, bNode &node)
void node_preview_init_tree(bNodeTree *ntree, int xsize, int ysize)
static void node_free_socket_type(void *socktype_v)
void node_rebuild_id_vector(bNodeTree &node_tree)
bNodeSocketType * node_socket_type_find(StringRef idname)
bNode * node_add_static_node(const bContext *C, bNodeTree &ntree, int type)
bNodeTree * node_tree_copy_tree_ex(const bNodeTree &ntree, Main *bmain, bool do_id_user)
bool node_supports_active_flag(const bNode &node, int sub_activity)
Does the given node supports the sub active flag.
bNodeLink & node_add_link(bNodeTree &ntree, bNode &fromnode, bNodeSocket &fromsock, bNode &tonode, bNodeSocket &tosock)
static void node_replace_undefined_types(bNode *node)
bNodeSocket * node_find_enabled_socket(bNode &node, eNodeSocketInOut in_out, StringRef name)
static void node_blend_read_data_storage(BlendDataReader *reader, bNodeTree *ntree, bNode *node)
bNodeTree * node_tree_add_tree(Main *bmain, StringRef name, StringRef idname)
bNodeSocketType * node_socket_type_find_static(int type, int subtype=0)
static void free_localized_node_groups(bNodeTree *ntree)
void node_link_set_mute(bNodeTree &ntree, bNodeLink &link, const bool muted)
StringRefNull node_socket_type_label(const bNodeSocketType &stype)
static bNodeTree * node_tree_add_tree_do(Main *bmain, std::optional< Library * > owner_library, ID *owner_id, const bool is_embedded, const StringRef name, const StringRef idname)
Span< bNodeTreeType * > node_tree_types_get()
bNodeSocket * node_add_static_socket(bNodeTree &ntree, bNode &node, eNodeSocketInOut in_out, int type, int subtype, StringRefNull identifier, StringRefNull name)
static void library_foreach_node_socket(bNodeSocket *sock, LibraryForeachIDData *data)
static void * socket_value_storage(bNodeSocket &socket)
void node_remove_socket_ex(bNodeTree &ntree, bNode &node, bNodeSocket &sock, bool do_id_user)
static void iter_backwards_ex(const bNodeTree *ntree, bNode *node_start, bool(*callback)(bNode *, bNode *, void *), void *userdata, const char recursion_mask)
static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_address)
void node_unregister_type(bNodeType &ntype)
void node_modify_socket_type(bNodeTree &ntree, bNode &node, bNodeSocket &sock, StringRefNull idname)
bNode * node_copy_with_mapping(bNodeTree *dst_tree, const bNode &node_src, int flag, std::optional< StringRefNull > dst_unique_name, std::optional< int > dst_unique_identifier, Map< const bNodeSocket *, bNodeSocket * > &new_socket_map, bool allow_duplicate_names=false)
static void * node_static_value_storage_for(bNode &node, const bNodeSocket &socket)
std::optional< StringRefNull > node_static_socket_label(int type, int subtype)
std::optional< StringRefNull > node_static_socket_type(int type, int subtype, std::optional< int > dimensions=std::nullopt)
static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype)
void node_remove_socket_links(bNodeTree &ntree, bNodeSocket &sock)
const bNodeInstanceKey NODE_INSTANCE_KEY_NONE
bool node_declaration_ensure(bNodeTree &ntree, bNode &node)
void node_set_active(bNodeTree &ntree, bNode &node)
float2 node_dimensions_get(const bNode &node)
bNodeTree * node_tree_add_in_lib(Main *bmain, Library *owner_library, StringRefNull name, StringRefNull idname)
static void update_typeinfo(Main *bmain, bNodeTreeType *treetype, bNodeType *nodetype, bNodeSocketType *socktype, const bool unregister)
bNodeType * node_type_find(StringRef idname)
static void ntree_free_type(void *treetype_v)
static int node_count_links(const bNodeTree *ntree, const bNodeSocket *socket)
static void unique_socket_template_identifier(bNodeSocketTemplate *list, bNodeSocketTemplate *ntemp, const char defname[], const char delim)
static void write_node_socket_default_value(BlendWriter *writer, const bNodeSocket *sock)
static void node_foreach_cache(ID *id, IDTypeForeachCacheFunctionCallback function_callback, void *user_data)
static void node_tree_asset_on_mark_asset(void *asset_ptr, AssetMetaData *asset_data)
void node_socket_move_default_value(Main &bmain, bNodeTree &tree, bNodeSocket &src, bNodeSocket &dst)
bNodeTree * node_tree_from_id(ID *id)
void node_tree_update_all_users(Main *main, ID *id)
int node_socket_link_limit(const bNodeSocket &sock)
void node_clear_active(bNodeTree &ntree)
StringRefNull node_socket_sub_type_label(int subtype)
bNode * node_find_root_parent(bNode &node)
static void node_socket_free(bNodeSocket *sock, const bool do_id_user)
StringRefNull node_socket_label(const bNodeSocket &sock)
static void node_socket_set_typeinfo(bNodeTree *ntree, bNodeSocket *sock, bNodeSocketType *typeinfo)
void node_tree_free_embedded_tree(bNodeTree *ntree)
void node_type_storage(bNodeType &ntype, std::optional< StringRefNull > storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
static void write_node_socket(BlendWriter *writer, const bNodeSocket *sock)
std::optional< eCustomDataType > socket_type_to_custom_data_type(eNodeSocketDatatype type)
static void defer_free_socket_type(bNodeSocketType *stype)
void node_type_size_preset(bNodeType &ntype, eNodeSizePreset size)
void node_unique_name(bNodeTree &ntree, bNode &node)
bool node_is_static_socket_type(const bNodeSocketType &stype)
static auto & get_node_type_map()
bool node_link_is_hidden(const bNodeLink &link)
void node_type_base_custom(bNodeType &ntype, StringRefNull idname, StringRefNull name, StringRefNull enum_name, short nclass)
void node_tree_node_flag_set(bNodeTree &ntree, int flag, bool enable)
QuaternionBase< float > Quaternion
QuaternionBase< T > normalize_and_get_length(const QuaternionBase< T > &q, T &out_length)
ImplicitSharingPtr< Bundle > BundlePtr
void update_node_declaration_and_sockets(bNodeTree &ntree, bNode &node)
void build_node_declaration(const bke::bNodeType &typeinfo, NodeDeclaration &r_declaration, const bNodeTree *ntree, const bNode *node)
ImplicitSharingPtr< Closure > ClosurePtr
MatBase< float, 4, 4 > float4x4
VecBase< float, 2 > float2
VectorSet< T, InlineBufferCapacity, DefaultProbingStrategy, CustomIDHash< T, GetIDFn >, CustomIDEqual< T, GetIDFn > > CustomIDVectorSet
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
void uninitialized_copy_n(const T *src, int64_t n, T *dst)
static AssetTypeInfo AssetType_NT
void node_socket_init_default_value(bNodeSocket *sock)
bNodeSocket * node_add_socket_from_template(bNodeTree *ntree, bNode *node, bke::bNodeSocketTemplate *stemp, eNodeSocketInOut in_out)
void node_verify_sockets(bNodeTree *ntree, bNode *node, bool do_id_user)
static blender::bke::bNodeSocketTemplate outputs[]
static blender::bke::bNodeSocketTemplate inputs[]
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
StructRNA * RNA_struct_find(const char *identifier)
void RNA_struct_blender_type_set(StructRNA *srna, void *blender_type)
const char * RNA_struct_ui_name(const StructRNA *type)
bool RNA_enum_name(const EnumPropertyItem *item, const int value, const char **r_name)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
void RNA_def_struct_ui_text(StructRNA *srna, const char *name, const char *description)
const EnumPropertyItem rna_enum_property_subtype_items[]
struct bNodeTree * nodetree
unsigned int id_session_uid
struct AssetMetaData * asset_data
ImBufByteBuffer byte_buffer
struct bNodeTree * nodetree
struct bNodeTree * nodetree
NodeCryptomatte_Runtime runtime
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct Collection * value
bNodeSocketRuntimeHandle * runtime
bNodeSocketTypeHandle * typeinfo
char * default_attribute_name
bNodeTreeRuntimeHandle * runtime
struct GeometryNodeAssetTraits * geometry_node_asset_traits
struct PreviewImage * preview
bNestedNodeRef * nested_node_refs
int default_group_node_width
bNodeTreeTypeHandle * typeinfo
bNodeTreeInterface tree_interface
bNodeTypeHandle * typeinfo
bNodePanelState * panel_states_array
IDProperty * system_properties
bNodeRuntimeHandle * runtime
StringRef operator()(const T *value) const
FreestyleLineStyle * linestyle
Compact definition of a node socket.
void(* free_self)(bNodeSocketType *stype)
bool use_link_limits_of_type
const blender::CPPType * base_cpp_type
blender::nodes::NodeDeclaration * static_declaration
void(* copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node)
NodeBlendWriteFunction blend_write_storage_content
std::string ui_description
NodeBlendDataReadFunction blend_data_read_storage_content
void(* freefunc)(bNode *node)
void(* initfunc)(bNodeTree *ntree, bNode *node)
bool(* poll_instance)(const bNode *node, const bNodeTree *nodetree, const char **r_disabled_hint)
bNodeSocketTemplate * inputs
bNodeSocketTemplate * outputs
const char * enum_name_legacy
bool(* poll)(const bNodeType *ntype, const bNodeTree *nodetree, const char **r_disabled_hint)
NodeDeclareFunction declare
void(* free_self)(bNodeType *ntype)
void(* initfunc_api)(const bContext *C, PointerRNA *ptr)