20#define DNA_DEPRECATED_ALLOW
82#include "RNA_prototypes.hh"
122using blender::nodes::OutputFieldDependency;
150 ntree->
runtime = MEM_new<bNodeTreeRuntime>(__func__);
156 std::optional<Library *> ,
167 ntree_dst->
runtime = MEM_new<bNodeTreeRuntime>(__func__);
178 ntree_dst, *src_node, flag_subdata,
false, socket_map);
180 new_node->
runtime->index_in_tree = i;
197 for (
bNode *node : ntree_dst->all_nodes()) {
203 for (
bNode *node : ntree_dst->all_nodes()) {
225 if (ntree_src->
runtime->field_inferencing_interface) {
227 *ntree_src->
runtime->field_inferencing_interface);
229 if (ntree_src->
runtime->anonymous_attribute_inferencing) {
230 using namespace anonymous_attribute_inferencing;
232 std::make_unique<AnonymousAttributeInferencingResult>(
233 *ntree_src->
runtime->anonymous_attribute_inferencing);
234 for (FieldSource &field_source :
237 if (
auto *socket_field_source = std::get_if<SocketFieldSource>(&field_source.data)) {
238 socket_field_source->socket = socket_map.
lookup(socket_field_source->socket);
241 for (GeometrySource &geometry_source :
244 if (
auto *socket_geometry_source = std::get_if<SocketGeometrySource>(&geometry_source.data))
246 socket_geometry_source->socket = socket_map.
lookup(socket_geometry_source->socket);
281 if (ntree->
runtime->execdata) {
282 switch (ntree->
type) {
288 ntree->
runtime->execdata =
nullptr;
330 BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
384 BKE_lib_query_idpropertiesForeachIDLink_callback(prop, data);
408 for (
bNode *node : ntree->all_nodes()) {
426 function_callback(
id, &key,
static_cast<void **
>(&nodetree->
previews), 0, user_data);
430 for (
bNode *node : nodetree->all_nodes()) {
431 if (node->type == CMP_NODE_MOVIEDISTORTION) {
433 function_callback(
id, &key,
static_cast<void **
>(&node->storage), 0, user_data);
443 switch (ntree->
type) {
445 for (
bNode *node : ntree->all_nodes()) {
471 if (debug_relationship_assert) {
479namespace forward_compat {
503 if (stype ==
nullptr) {
507 bNodeSocket *sock = MEM_cnew<bNodeSocket>(__func__);
508 sock->
runtime = MEM_new<bNodeSocketRuntime>(__func__);
527 if (idname ==
"NodeSocketFloat") {
532 return "NodeSocketFloatUnsigned";
534 return "NodeSocketFloatPercentage";
536 return "NodeSocketFloatFactor";
538 return "NodeSocketFloatAngle";
540 return "NodeSocketFloatTime";
542 return "NodeSocketFloatTimeAbsolute";
544 return "NodeSocketFloatDistance";
546 return "NodeSocketFloatWavelength";
548 return "NodeSocketFloatColorTemperature";
550 return "NodeSocketFloatFrequency";
553 if (idname ==
"NodeSocketInt") {
557 return "NodeSocketIntUnsigned";
559 return "NodeSocketIntPercentage";
561 return "NodeSocketIntFactor";
564 if (idname ==
"NodeSocketVector") {
569 return "NodeSocketVectorTranslation";
571 return "NodeSocketVectorDirection";
573 return "NodeSocketVectorVelocity";
575 return "NodeSocketVectorAcceleration";
577 return "NodeSocketVectorEuler";
630 if (bNodeSocket *legacy_socket = make_legacy_socket(*socket, SOCK_IN)) {
631 BLI_addtail(&ntree->inputs_legacy, legacy_socket);
635 if (bNodeSocket *legacy_socket = make_legacy_socket(*socket, SOCK_OUT)) {
636 BLI_addtail(&ntree->outputs_legacy, legacy_socket);
765 for (
bNode *node : ntree->all_nodes()) {
766 if (ntree->
type ==
NTREE_SHADER && node->type == SH_NODE_BSDF_HAIR_PRINCIPLED) {
787 writer,
bNodePanelState, node->num_panel_states, node->panel_states_array);
806 CMP_NODE_HUECORRECT))
811 ELEM(node->type, TEX_NODE_CURVE_RGB, TEX_NODE_CURVE_TIME))
815 else if ((ntree->
type ==
NTREE_COMPOSIT) && (node->type == CMP_NODE_MOVIEDISTORTION)) {
838 ELEM(node->type, CMP_NODE_CRYPTOMATTE, CMP_NODE_CRYPTOMATTE_LEGACY))
847 else if (node->type == FN_NODE_INPUT_STRING) {
854 else if (node->type == GEO_NODE_CAPTURE_ATTRIBUTE) {
859 Span{storage.capture_items, storage.capture_items_num})
861 if (item.identifier == 0) {
864 storage.data_type_legacy = item.data_type;
869 nodes::CaptureAttributeItemsAccessor::blend_write(writer, *node);
876 if (node->type == CMP_NODE_OUTPUT_FILE) {
888 if (
ELEM(node->type, CMP_NODE_IMAGE, CMP_NODE_R_LAYERS)) {
894 if (node->type == GEO_NODE_SIMULATION_OUTPUT) {
895 nodes::SimulationItemsAccessor::blend_write(writer, *node);
897 if (node->type == GEO_NODE_REPEAT_OUTPUT) {
898 nodes::RepeatItemsAccessor::blend_write(writer, *node);
900 if (node->type == GEO_NODE_INDEX_SWITCH) {
901 nodes::IndexSwitchItemsAccessor::blend_write(writer, *node);
903 if (node->type == GEO_NODE_BAKE) {
904 nodes::BakeItemsAccessor::blend_write(writer, *node);
906 if (node->type == GEO_NODE_MENU_SWITCH) {
907 nodes::MenuSwitchItemsAccessor::blend_write(writer, *node);
909 if (node->type == GEO_NODE_FOREACH_GEOMETRY_ELEMENT_OUTPUT) {
910 nodes::ForeachGeometryElementInputItemsAccessor::blend_write(writer, *node);
911 nodes::ForeachGeometryElementGenerationItemsAccessor::blend_write(writer, *node);
912 nodes::ForeachGeometryElementMainItemsAccessor::blend_write(writer, *node);
922 forward_compat::write_legacy_sockets(writer, ntree);
939 ntree->
runtime->execdata =
nullptr;
945 forward_compat::construct_interface_as_legacy_sockets(ntree);
953 forward_compat::cleanup_legacy_sockets(ntree);
1001 sock->
runtime = MEM_new<bNodeSocketRuntime>(__func__);
1026 if (link->fromsock == sock || link->tosock == sock) {
1029 link->tosock->link =
nullptr;
1037 MEM_delete(sock->runtime);
1062 "Fixing root node tree '%s' owned by '%s' missing EMBEDDED tag, please consider "
1063 "re-saving your (startup) file",
1074 ntree->
runtime = MEM_new<bNodeTreeRuntime>(__func__);
1082 node->runtime = MEM_new<bNodeRuntime>(__func__);
1083 node->typeinfo =
nullptr;
1084 node->runtime->index_in_tree = i;
1088 if (node->identifier == 0 || ntree->
runtime->nodes_by_id.contains_as(node->identifier)) {
1092 ntree->
runtime->nodes_by_id.add_new(node);
1098 reader,
bNodePanelState, node->num_panel_states, &node->panel_states_array);
1103 if (node->type == CMP_NODE_MOVIEDISTORTION) {
1113 if (node->storage) {
1114 switch (node->type) {
1134 npd->
pd = dna::shallow_zero_initialize();
1151 iuser->
scene =
nullptr;
1164 iuser->
scene =
nullptr;
1178 nodes::SimulationItemsAccessor::blend_read_data(reader, *node);
1182 nodes::RepeatItemsAccessor::blend_read_data(reader, *node);
1186 nodes::ForeachGeometryElementInputItemsAccessor::blend_read_data(reader, *node);
1187 nodes::ForeachGeometryElementMainItemsAccessor::blend_read_data(reader, *node);
1188 nodes::ForeachGeometryElementGenerationItemsAccessor::blend_read_data(reader, *node);
1192 nodes::IndexSwitchItemsAccessor::blend_read_data(reader, *node);
1196 nodes::BakeItemsAccessor::blend_read_data(reader, *node);
1200 nodes::MenuSwitchItemsAccessor::blend_read_data(reader, *node);
1204 nodes::CaptureAttributeItemsAccessor::blend_read_data(reader, *node);
1228 if (node->type == CMP_NODE_OUTPUT_FILE) {
1298 if (!node->is_group()) {
1313 auto inputs = idprop::create_group(
"inputs");
1314 auto outputs = idprop::create_group(
"outputs");
1317 auto property = idprop::create(socket->name ? socket->name :
"", socket->socket_type);
1321 auto property = idprop::create(socket->name ? socket->name :
"", socket->socket_type);
1326 if (
node_tree.geometry_node_asset_traits) {
1327 auto property = idprop::create(
"geometry_node_asset_traits_flag",
1328 node_tree.geometry_node_asset_traits->flag);
1414 while (sockdef->
type != -1) {
1421 while (sockdef->
type != -1) {
1446 node->width = ntype->
width;
1447 node->height = ntype->
height;
1448 node->color[0] = node->color[1] = node->color[2] = 0.608;
1463 if (add_sockets_before_init) {
1472 ntree->
typeinfo->node_add_init(ntree, node);
1475 if (!add_sockets_before_init) {
1516 if (typeinfo && typeinfo->
storagename[0] && !node->storage) {
1522 node->typeinfo = typeinfo;
1565 const bool unregister)
1572 if (treetype &&
STREQ(ntree->idname, treetype->
idname)) {
1577 for (
bNode *node : ntree->all_nodes()) {
1578 if (nodetype &&
STREQ(node->idname, nodetype->
idname)) {
1584 if (socktype &&
STREQ(sock->idname, socktype->
idname)) {
1589 if (socktype &&
STREQ(sock->idname, socktype->
idname)) {
1602 for (
bNode *node : ntree->all_nodes()) {
1742 if (node->is_group()) {
1743 const ID *group_tree = node->id;
1744 if (group_tree ==
nullptr) {
1765 if (idname && idname[0]) {
1814 if (stype->
label[0] ==
'\0') {
1817 return stype->
label;
1833 const ListBase *sockets = (in_out ==
SOCK_IN) ? &node->inputs : &node->outputs;
1835 if (sock->identifier == identifier) {
1854 ListBase *sockets = (in_out ==
SOCK_IN) ? &node.inputs : &node.outputs;
1856 if (socket->is_available() && socket->name == name) {
1877 if (
STREQ(sock->identifier, identifier)) {
1889 const char *identifier,
1894 if (identifier && identifier[0] !=
'\0') {
1896 STRNCPY(auto_identifier, identifier);
1900 STRNCPY(auto_identifier, name);
1906 bNodeSocket *sock = MEM_cnew<bNodeSocket>(
"sock");
1907 sock->
runtime = MEM_new<bNodeSocketRuntime>(__func__);
1978 return default_value.
value !=
nullptr;
1983 return default_value.
value !=
nullptr;
1989 return default_value.
value !=
nullptr;
1995 return default_value.
value !=
nullptr;
2001 return default_value.
value !=
nullptr;
2033 if (sock->
type != socktype->
type) {
2088 CLOG_ERROR(&
LOG,
"static node socket type %d undefined", type);
2099 const char *identifier,
2132 return "NodeSocketFloatUnsigned";
2134 return "NodeSocketFloatPercentage";
2136 return "NodeSocketFloatFactor";
2138 return "NodeSocketFloatAngle";
2140 return "NodeSocketFloatTime";
2142 return "NodeSocketFloatTimeAbsolute";
2144 return "NodeSocketFloatDistance";
2146 return "NodeSocketFloatWavelength";
2148 return "NodeSocketFloatColorTemperature";
2150 return "NodeSocketFloatFrequency";
2153 return "NodeSocketFloat";
2158 return "NodeSocketIntUnsigned";
2160 return "NodeSocketIntPercentage";
2162 return "NodeSocketIntFactor";
2165 return "NodeSocketInt";
2168 return "NodeSocketBool";
2170 return "NodeSocketRotation";
2172 return "NodeSocketMatrix";
2176 return "NodeSocketVectorTranslation";
2178 return "NodeSocketVectorDirection";
2180 return "NodeSocketVectorVelocity";
2182 return "NodeSocketVectorAcceleration";
2184 return "NodeSocketVectorEuler";
2186 return "NodeSocketVectorXYZ";
2189 return "NodeSocketVector";
2192 return "NodeSocketColor";
2196 return "NodeSocketStringFilePath";
2198 return "NodeSocketString";
2201 return "NodeSocketShader";
2203 return "NodeSocketObject";
2205 return "NodeSocketImage";
2207 return "NodeSocketGeometry";
2209 return "NodeSocketCollection";
2211 return "NodeSocketTexture";
2213 return "NodeSocketMaterial";
2215 return "NodeSocketMenu";
2228 return "NodeTreeInterfaceSocketFloatUnsigned";
2230 return "NodeTreeInterfaceSocketFloatPercentage";
2232 return "NodeTreeInterfaceSocketFloatFactor";
2234 return "NodeTreeInterfaceSocketFloatAngle";
2236 return "NodeTreeInterfaceSocketFloatTime";
2238 return "NodeTreeInterfaceSocketFloatTimeAbsolute";
2240 return "NodeTreeInterfaceSocketFloatDistance";
2242 return "NodeTreeInterfaceSocketFloatWavelength";
2244 return "NodeTreeInterfaceSocketFloatColorTemperature";
2246 return "NodeTreeInterfaceSocketFloatFrequency";
2249 return "NodeTreeInterfaceSocketFloat";
2254 return "NodeTreeInterfaceSocketIntUnsigned";
2256 return "NodeTreeInterfaceSocketIntPercentage";
2258 return "NodeTreeInterfaceSocketIntFactor";
2261 return "NodeTreeInterfaceSocketInt";
2264 return "NodeTreeInterfaceSocketBool";
2266 return "NodeTreeInterfaceSocketRotation";
2268 return "NodeTreeInterfaceSocketMatrix";
2272 return "NodeTreeInterfaceSocketVectorTranslation";
2274 return "NodeTreeInterfaceSocketVectorDirection";
2276 return "NodeTreeInterfaceSocketVectorVelocity";
2278 return "NodeTreeInterfaceSocketVectorAcceleration";
2280 return "NodeTreeInterfaceSocketVectorEuler";
2282 return "NodeTreeInterfaceSocketVectorXYZ";
2285 return "NodeTreeInterfaceSocketVector";
2288 return "NodeTreeInterfaceSocketColor";
2292 return "NodeTreeInterfaceSocketVectorTranslation";
2294 return "NodeTreeInterfaceSocketString";
2297 return "NodeTreeInterfaceSocketShader";
2299 return "NodeTreeInterfaceSocketObject";
2301 return "NodeTreeInterfaceSocketImage";
2303 return "NodeTreeInterfaceSocketGeometry";
2305 return "NodeTreeInterfaceSocketCollection";
2307 return "NodeTreeInterfaceSocketTexture";
2309 return "NodeTreeInterfaceSocketMaterial";
2311 return "NodeTreeInterfaceSocketMenu";
2346 return "Collection";
2364 const char *identifier,
2370 CLOG_ERROR(&
LOG,
"static node socket type %d undefined", type);
2392 if (default_value_menu.enum_items) {
2394 default_value_menu.
enum_items->remove_user_and_delete_if_last();
2413 if (link->fromsock == sock || link->tosock == sock) {
2418 for (
const int64_t i : node->runtime->internal_links.index_range()) {
2419 const bNodeLink &link = node->runtime->internal_links[i];
2421 node->runtime->internal_links.remove_and_reorder(i);
2445 if (ntree->
runtime->topology_cache_mutex.is_cached()) {
2446 bNode *node = &sock->owner_node();
2461 for (
bNode *node : ntree->all_nodes()) {
2465 if (sock == tsock) {
2466 if (r_node !=
nullptr) {
2469 if (r_sockindex !=
nullptr) {
2482 while (parent_iter->
parent !=
nullptr) {
2483 parent_iter = parent_iter->
parent;
2493 for (
const bNode *child_iter = child; child_iter; child_iter = child_iter->
parent) {
2494 if (child_iter == parent) {
2502 const bNode *node_start,
2505 const bool reversed)
2515 if (link->fromnode != node_start) {
2520 if (link->tonode != node_start) {
2525 if (!
callback(link->fromnode, link->tonode, userdata, reversed)) {
2529 ntree, reversed ? link->fromnode : link->tonode,
callback, userdata, reversed);
2534 const bNode *node_start,
2537 const char recursion_mask)
2541 if (link ==
nullptr) {
2562 const bNode *node_start,
2565 const int recursion_lvl)
2573 const char recursion_mask = (1 << recursion_lvl);
2577 node->runtime->iter_flag &= ~recursion_mask;
2586 if (!
callback(node->parent, userdata)) {
2607 while (ntree->
runtime->nodes_by_id.contains_as(new_id) || new_id <= 0) {
2608 new_id = id_rng.get_int32();
2611 node->identifier = new_id;
2612 ntree->
runtime->nodes_by_id.add_new(node);
2613 node->runtime->index_in_tree = ntree->
runtime->nodes_by_id.index_range().last();
2614 BLI_assert(node->runtime->index_in_tree == ntree->
runtime->nodes_by_id.index_of(node));
2619 bNode *node = MEM_cnew<bNode>(
"new node");
2620 node->runtime = MEM_new<bNodeRuntime>(__func__);
2623 node->ui_order = ntree->all_nodes().size();
2625 STRNCPY(node->idname, idname);
2630 if (
ELEM(node->type,
2631 GEO_NODE_INPUT_SCENE_TIME,
2632 GEO_NODE_INPUT_ACTIVE_CAMERA,
2633 GEO_NODE_SELF_OBJECT,
2634 GEO_NODE_SIMULATION_INPUT))
2644 const char *idname =
nullptr;
2649 if (ntype->type != type) {
2653 const char *disabled_hint;
2654 if (ntype->poll && ntype->poll(ntype, ntree, &disabled_hint)) {
2669 sock_dst->
runtime = MEM_new<bNodeSocketRuntime>(__func__);
2670 if (sock_src->
prop) {
2683 if (default_value_menu.enum_items) {
2697 const bNode &node_src,
2699 const bool use_unique,
2703 *node_dst = node_src;
2705 node_dst->
runtime = MEM_new<bNodeRuntime>(__func__);
2721 socket_map.
add_new(src_socket, dst_socket);
2729 socket_map.
add_new(src_socket, dst_socket);
2732 if (node_src.
prop) {
2739 node_dst->
runtime->internal_links = node_src.
runtime->internal_links;
2741 dst_link.fromnode = node_dst;
2742 dst_link.tonode = node_dst;
2743 dst_link.fromsock = socket_map.
lookup(dst_link.fromsock);
2744 dst_link.tosock = socket_map.
lookup(dst_link.tosock);
2752 node_src.
typeinfo->copyfunc(dst_tree, node_dst, &node_src);
2764 node_dst->
typeinfo->copyfunc_api(&
ptr, &node_src);
2776 if (!socket.is_output()) {
2780 switch (node.type) {
2782 return &
reinterpret_cast<NodeInputBool *
>(node.storage)->
boolean;
2785 return &
static_cast<bNodeSocket *
>(node.outputs.first)
2786 ->default_value_typed<bNodeSocketValueFloat>()
2789 return &
reinterpret_cast<NodeInputInt *
>(node.storage)->integer;
2851 tree.ensure_topology_cache();
2853 bNode &dst_node = dst.owner_node();
2854 bNode &src_node = src.owner_node();
2861 if (src.is_multi_input()) {
2869 if (&src_type != &dst_type) {
2870 if (!convert.is_convertible(src_type, dst_type)) {
2877 if (!dst_value || !src_value) {
2881 convert.convert_to_uninitialized(src_type, dst_type, src_value, dst_value);
2905 if (
ELEM(socket, link->fromsock, link->tosock)) {
2917 BLI_assert(ntree->all_nodes().contains(fromnode));
2918 BLI_assert(ntree->all_nodes().contains(tonode));
2924 link = MEM_cnew<bNodeLink>(
"link");
2937 link = MEM_cnew<bNodeLink>(
"link");
2951 if (link !=
nullptr && link->
tosock->is_multi_input()) {
2977 const bool was_muted = link->is_muted();
2979 if (muted != was_muted) {
2987 if (link->fromsock == sock || link->tosock == sock) {
2995 return !(link->
fromsock->is_visible() && link->
tosock->is_visible());
3007 const int deleted_index)
3012 if (link->tosock != sock || link->multi_input_sort_id <= deleted_index) {
3015 link->multi_input_sort_id -= 1;
3022 for (
bNodeLink &link : node->runtime->internal_links) {
3023 link.tosock->link = &link;
3031 if (link->fromnode != node) {
3038 if (fromlink ==
nullptr) {
3039 if (link->tosock->is_multi_input()) {
3041 ntree, link->tosock, link->multi_input_sort_id);
3047 if (link->tosock->is_multi_input()) {
3050 if (link_to_compare->fromsock == fromlink->
fromsock &&
3051 link_to_compare->tosock == link->tosock)
3054 ntree, link_to_compare->tosock, link_to_compare->multi_input_sort_id);
3060 link->fromnode = fromlink->
fromnode;
3061 link->fromsock = fromlink->
fromsock;
3067 link->
flag &= ~NODE_LINK_VALID;
3077 for (
bNodeLink *link : duplicate_links_to_remove) {
3083 if (link->tonode == node) {
3092 for (
const bNode *node_iter = node; node_iter; node_iter = node_iter->
parent) {
3093 view_loc +=
float2(node_iter->locx, node_iter->locy);
3101 for (
const bNode *node_iter = node; node_iter; node_iter = node_iter->
parent) {
3102 loc -=
float2(node_iter->locx, node_iter->locy);
3114 node->parent = parent;
3118 node->locx = new_loc.x;
3119 node->locy = new_loc.y;
3131 node->parent =
nullptr;
3137 const bNode *to_node,
3146 offset_x = -(from_node->
typeinfo->width + 50);
3151 offset_x = to_node->
typeinfo->width + 50;
3157 float offset_y =
U.widget_unit * tot_sock_idx;
3172 offset_y -=
U.widget_unit * tot_sock_idx;
3174 from_node->
locx = to_node->
locx + offset_x;
3175 from_node->
locy = to_node->
locy - offset_y;
3181 if (socket->link !=
nullptr) {
3190 std::optional<Library *> owner_library,
3192 const bool is_embedded,
3200 if (is_embedded || bmain ==
nullptr) {
3204 "Embedded NTrees should never have a defined owner library here");
3214 *ntree_owner_ptr = ntree;
3282 preview = MEM_cnew<bNodePreview>(
"node preview");
3292 if (xsize == 0 || ysize == 0) {
3316 if (preview->
ibuf) {
3328 for (
bNode *node : ntree->all_nodes()) {
3332 node->runtime->preview_xsize = xsize;
3333 node->runtime->preview_ysize = ysize;
3339 if (node->is_group() && group !=
nullptr) {
3362 for (
bNode *node : ntree->all_nodes()) {
3370 if (node->is_group() && group !=
nullptr) {
3392 if (remove_old || !to_ntree->
previews) {
3432 if (link->fromnode == node) {
3433 lb = &node->outputs;
3435 else if (link->tonode == node) {
3441 if (link->tonode != node && link->tosock->is_multi_input()) {
3443 ntree, link->tosock, link->multi_input_sort_id);
3446 if (link->fromsock == sock || link->tosock == sock) {
3457 for (
bNode *node : ntree->all_nodes()) {
3458 if (node->parent == parent) {
3467 node_tree->runtime->nodes_by_id.clear();
3470 node_tree->runtime->nodes_by_id.add_new(node);
3471 node->runtime->index_in_tree = i;
3488 ntree->
runtime->execdata =
nullptr;
3492 if (node->typeinfo->freefunc) {
3493 node->typeinfo->freefunc(node);
3515 if (node->runtime->declaration) {
3518 if (node->runtime->declaration != node->typeinfo->static_declaration) {
3519 delete node->runtime->declaration;
3523 MEM_delete(node->runtime);
3552 bool node_has_id =
false;
3556 if (node->typeinfo->freefunc_api) {
3559 node->typeinfo->freefunc_api(&
ptr);
3581 SNPRINTF(prefix,
"nodes[\"%s\"]", propname_esc);
3584 if (bmain !=
nullptr) {
3592 ELEM(node->type, GEO_NODE_INPUT_SCENE_TIME, GEO_NODE_SELF_OBJECT, GEO_NODE_SIMULATION_INPUT))
3594 if (bmain !=
nullptr) {
3619 if (node->is_group() && ngroup !=
nullptr) {
3657 if (
ELEM(node->type, CMP_NODE_OUTPUT_FILE, GEO_NODE_VIEWER)) {
3672 const bool compositor_case = is_compositor && tnode_is_output && node_is_output;
3673 if (tnode->type == node->type || compositor_case) {
3677 tnode->flag &= ~NODE_DO_OUTPUT;
3698 tnode->flag &= ~NODE_DO_OUTPUT;
3714 switch (
GS(id->name)) {
3716 return &
reinterpret_cast<Material *
>(id)->nodetree;
3718 return &
reinterpret_cast<Light *
>(id)->nodetree;
3720 return &
reinterpret_cast<World *
>(id)->nodetree;
3722 return &
reinterpret_cast<Tex *
>(id)->nodetree;
3724 return &
reinterpret_cast<Scene *
>(id)->nodetree;
3735 return (nodetree !=
nullptr) ? *nodetree :
nullptr;
3745 node->flag &= ~flag;
3752 if (ntree ==
nullptr) {
3770 if (node->is_group() && group !=
nullptr) {
3780 while (node_src !=
nullptr) {
3781 node_local->
runtime->original = node_src;
3782 node_src = node_src->
next;
3783 node_local = node_local->
next;
3787 ntree->
typeinfo->localize(ltree, ntree);
3795 if (ntree && localtree) {
3796 if (ntree->
typeinfo->local_merge) {
3797 ntree->
typeinfo->local_merge(bmain, localtree, ntree);
3806 if (tree_to_search_in == tree_to_search_for) {
3810 tree_to_search_in->ensure_topology_cache();
3811 for (
const bNode *node_group : tree_to_search_in->group_nodes()) {
3812 const bNodeTree *sub_tree_search_in =
reinterpret_cast<const bNodeTree *
>(node_group->id);
3813 if (!sub_tree_search_in) {
3816 if (!already_passed.
add(sub_tree_search_in)) {
3830 if (tree_to_search_in == tree_to_search_for) {
3842 if (link->fromsock == sock || link->tosock == sock) {
3851 if (ntree ==
nullptr) {
3855 for (
bNode *node : ntree->all_nodes()) {
3865 bool changed =
false;
3876 sock->flag &= ~NODE_SELECT;
3880 sock->flag &= ~NODE_SELECT;
3887 if (ntree ==
nullptr) {
3891 for (
bNode *node : ntree->all_nodes()) {
3892 node->flag &= ~NODE_ACTIVE;
3905 for (
bNode *tnode : ntree->all_nodes()) {
3906 tnode->flag &= ~flags_to_set;
3908 node->flag |= flags_to_set;
3913 if (is_available == sock->is_available()) {
3917 sock->
flag &= ~SOCK_UNAVAIL;
3927 if (sock->is_multi_input()) {
3947 socket->runtime->declaration = &socket_decl;
3954 socket->runtime->declaration =
nullptr;
3960 BLI_assert(node->runtime->declaration !=
nullptr);
3961 if (node->runtime->declaration->skip_updating_sockets) {
3972 if (node->runtime->declaration !=
nullptr) {
3975 if (node->typeinfo->declare) {
3976 if (node->typeinfo->static_declaration) {
3977 if (!node->typeinfo->static_declaration->is_context_dependent) {
3978 node->runtime->declaration = node->typeinfo->static_declaration;
3983 if (node->typeinfo->declare) {
4003 *r_width = node->runtime->totr.xmax - node->runtime->totr.xmin;
4004 *r_height = node->runtime->totr.ymax - node->runtime->totr.ymin;
4014 *r_links = node->runtime->internal_links.data();
4015 *r_len = node->runtime->internal_links.size();
4031 while ((c = *
str++)) {
4064 return (value_a != value_b);
4160 "temporary node instance key list"));
4162 int num_untagged = 0;
4172 for (
int i = 0; i < num_untagged; i++) {
4184 result.
add(ntype->type);
4209 const std::string old_idname = node->idname;
4210 SNPRINTF(node->idname,
"Undefined[%s]", old_idname.c_str());
4244 if (
id ==
nullptr) {
4248 bool need_update =
false;
4252 for (
bNode *node : ntree->all_nodes()) {
4253 if (node->id ==
id) {
4271 if (node->label[0] !=
'\0') {
4274 else if (node->typeinfo->labelfunc) {
4275 node->typeinfo->labelfunc(ntree, node,
label, label_maxncpy);
4277 if (
label[0] !=
'\0') {
4287 if (sock->
runtime->declaration !=
nullptr) {
4290 return sock->
runtime->declaration->short_label.data();
4320 const char **r_disabled_hint)
4322 return node->typeinfo->poll(node->typeinfo, ntree, r_disabled_hint);
4334#define DefNode(Category, ID, DefFunc, EnumName, StructName, UIName, UIDesc) \
4336 STRNCPY(ntype->idname, #Category #StructName); \
4337 StructRNA *srna = RNA_struct_find(#Category #StructName); \
4338 BLI_assert(srna != nullptr); \
4339 ntype->rna_ext.srna = srna; \
4340 RNA_struct_blender_type_set(srna, ntype); \
4341 RNA_def_struct_ui_text(srna, UIName, UIDesc); \
4342 ntype->enum_name_legacy = EnumName; \
4343 STRNCPY(ntype->ui_description, UIDesc); \
4367 const char *enum_name,
4399 return std::nullopt;
4427 return std::nullopt;
4473 if (type.is<
float>()) {
4476 if (type.is<
int>()) {
4485 if (type.is<
bool>()) {
4494 if (type.is<std::string>()) {
4497 return std::nullopt;
4512 return std::nullopt;
4528 return std::nullopt;
4543 if (ntemp != data->ntemp) {
4544 if (
STREQ(ntemp->identifier, name)) {
4555 const char defname[],
4585 STRNCPY(ntemp->identifier, ntemp->name);
4592 ntemp->identifier[0] =
'\0';
4596 STRNCPY(ntemp->identifier, ntemp->name);
4604 ntype->
width = width;
4606 if (maxwidth <= minwidth) {
4633 const char *storagename,
4634 void (*freefunc)(
bNode *node),
4637 const bNode *src_node))
4668 if (nt->rna_ext.free) {
4669 nt->rna_ext.free(nt->rna_ext.data);
4680 if (st->ext_socket.free) {
4681 st->ext_socket.free(st->ext_socket.data);
4683 if (st->ext_interface.free) {
4684 st->ext_interface.free(st->ext_interface.data);
4695 if (nt->rna_ext.free) {
4696 nt->rna_ext.free(nt->rna_ext.data);
4727 else if (ntreeiter->
scene) {
4729 *r_id = &ntreeiter->
scene->
id;
4732 else if (ntreeiter->
mat) {
4734 *r_id = &ntreeiter->
mat->
id;
4737 else if (ntreeiter->
tex) {
4739 *r_id = &ntreeiter->
tex->
id;
4742 else if (ntreeiter->
light) {
4744 *r_id = &ntreeiter->
light->
id;
4747 else if (ntreeiter->
world) {
4749 *r_id = &ntreeiter->
world->
id;
4768 for (
bNode *node : ntree->all_nodes()) {
4769 if (node->type == CMP_NODE_R_LAYERS && node->id == &scene->id) {
4770 if (node->custom1 == layer_index) {
4773 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)
Main * CTX_data_main(const bContext *C)
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_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()
IDProperty * IDP_CopyProperty(const IDProperty *prop) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
void IDP_BlendWrite(BlendWriter *writer, const IDProperty *prop)
void IDP_FreeProperty_ex(IDProperty *prop, bool do_id_user)
@ IDTYPE_FLAGS_APPEND_IS_REUSABLE
void(*)(ID *id, const IDCacheKey *cache_key, void **cache_p, uint flags, void *user_data) IDTypeForeachCacheFunctionCallback
void BKE_libblock_free_data_py(ID *id)
@ LIB_ID_CREATE_NO_USER_REFCOUNT
@ LIB_ID_COPY_NO_ANIMDATA
void BKE_libblock_free_data(ID *id, bool do_id_user) ATTR_NONNULL()
void BKE_libblock_init_empty(ID *id) ATTR_NONNULL(1)
struct ID * BKE_id_copy_in_lib(Main *bmain, std::optional< Library * > owner_library, const ID *id, const ID *new_owner_id, ID **new_id_p, int flag)
ID * BKE_id_copy_ex(Main *bmain, const ID *id, ID **new_id_p, int flag)
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_TYPES_BEGIN(ntype)
#define NODE_CLASS_OUTPUT
#define SH_NODE_CURVE_FLOAT
#define GEO_NODE_MENU_SWITCH
constexpr int GROUP_NODE_DEFAULT_WIDTH
#define SH_NODE_TEX_IMAGE
#define NODE_CUSTOM_GROUP
#define CMP_NODE_CRYPTOMATTE
#define FN_NODE_INPUT_COLOR
#define FN_NODE_INPUT_VECTOR
#define SH_NODE_TEX_ENVIRONMENT
#define SH_NODE_CURVE_VEC
#define GEO_NODE_FOREACH_GEOMETRY_ELEMENT_OUTPUT
#define CMP_NODE_HUECORRECT
#define FN_NODE_INPUT_STRING
#define NODE_GROUP_OUTPUT
#define GEO_NODE_SIMULATION_OUTPUT
#define FN_NODE_INPUT_INT
#define FN_NODE_INPUT_BOOL
#define CMP_NODE_CRYPTOMATTE_LEGACY
constexpr int NODE_DEFAULT_MAX_WIDTH
#define CMP_NODE_OUTPUT_FILE
#define FOREACH_NODETREE_END
#define NODE_TREE_TYPES_BEGIN(ntype)
#define CMP_NODE_CURVE_RGB
#define NODE_SOCKET_TYPES_BEGIN(stype)
#define SH_NODE_TEX_POINTDENSITY
#define SH_NODE_CURVE_RGB
#define GEO_NODE_CAPTURE_ATTRIBUTE
#define NODE_INSTANCE_HASH_ITER(iter_, hash_)
#define FOREACH_NODETREE_BEGIN(bmain, _nodetree, _id)
#define TEX_NODE_CURVE_TIME
#define NODE_TREE_TYPES_END
#define GEO_NODE_REPEAT_OUTPUT
#define CMP_NODE_R_LAYERS
#define NODE_SOCKET_TYPES_END
#define CMP_NODE_CURVE_VEC
#define TEX_NODE_CURVE_RGB
#define GEO_NODE_INDEX_SWITCH
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_main(Main *bmain, NodeTreeUpdateExtraParams *params)
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_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)
bool BLI_ghash_haskey(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_clear(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
unsigned int BLI_ghashutil_strhash_p(const void *ptr)
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
GHashIterator * BLI_ghashIterator_new(GHash *gh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
void(* GHashValFreeFP)(void *val)
void * BLI_ghash_popkey(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp) ATTR_WARN_UNUSED_RESULT
unsigned int BLI_ghash_len(const GHash *gh) ATTR_WARN_UNUSED_RESULT
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
void BLI_ghash_insert(GHash *gh, void *key, void *val)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
void * BLI_findstring(const struct ListBase *listbase, const char *id, int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define LISTBASE_FOREACH(type, var, list)
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
#define LISTBASE_FOREACH_INDEX(type, var, list, index_var)
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1) ATTR_MALLOC
#define STRNCPY(dst, src)
#define SNPRINTF(dst, format,...)
char * BLI_strdup_null(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_MALLOC
size_t BLI_str_escape(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t dst_maxncpy) ATTR_NONNULL(1
#define STRNCPY_UTF8(dst, src)
size_t void BLI_uniquename_cb(UniquenameCheckCallback unique_check, void *arg, const char *defname, char delim, char *name, size_t name_maxncpy) ATTR_NONNULL(1
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 UNUSED_VARS_NDEBUG(...)
#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)
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)
#define ID_IS_LINKED(_id)
Object groups, one object can be in many groups at once.
@ NODE_INTERFACE_SOCKET_OUTPUT
@ NODE_INTERFACE_SOCKET_HIDE_IN_MODIFIER
@ NODE_INTERFACE_SOCKET_INPUT
@ NODE_INTERFACE_SOCKET_HIDE_VALUE
@ NODE_ACTIVE_PAINT_CANVAS
struct bNodeTree bNodeTree
@ CMP_NODE_GLARE_SIMPLE_STAR
ImBuf * IMB_dupImBuf(const ImBuf *ibuf1)
bool imb_addrectImBuf(ImBuf *ibuf, bool initialize_pixels=true)
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)
static const CPPType & get()
void destruct(void *ptr) const
void value_initialize(void *ptr) const
const Value & lookup(const Key &key) const
void add_new(const Key &key, const Value &value)
bool contains(const Key &key) const
constexpr bool is_empty() const
constexpr const char * data() const
void reserve(const int64_t n)
void add_new(const Key &key)
const Key & lookup_key_as(const ForwardKey &key) const
void append_non_duplicates(const T &value)
std::unique_ptr< anonymous_attribute_inferencing::AnonymousAttributeInferencingResult > anonymous_attribute_inferencing
NodeIDVectorSet nodes_by_id
std::unique_ptr< nodes::FieldInferencingInterface > field_inferencing_interface
local_group_size(16, 16) .push_constant(Type b
DEGForeachIDComponentCallback callback
draw_view push_constant(Type::INT, "radiance_src") .push_constant(Type capture_info_buf storage_buf(1, Qualifier::READ, "ObjectBounds", "bounds_buf[]") .push_constant(Type draw_view int
struct ImBuf * IMB_allocImBuf(unsigned int, unsigned int, unsigned char, unsigned int)
void IMB_freeImBuf(ImBuf *)
void *(* MEM_mallocN)(size_t len, const char *str)
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
void *(* MEM_dupallocN)(const void *vmemh)
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
static void construct_interface_as_legacy_sockets(bNodeTree *ntree)
static bNodeSocket * make_socket(bNodeTree *ntree, const eNodeSocketInOut in_out, const StringRef idname, const StringRef name, const StringRef identifier)
static void legacy_socket_interface_free(bNodeSocket *sock)
static void write_legacy_sockets(BlendWriter *writer, bNodeTree *ntree)
static void cleanup_legacy_sockets(bNodeTree *ntree)
static StringRef get_legacy_socket_subtype_idname(StringRef idname, const void *socket_data)
static void write_node_socket_interface(BlendWriter *writer, const bNodeSocket *sock)
T & get_item_as(bNodeTreeInterfaceItem &item)
int node_instance_hash_haskey(bNodeInstanceHash *hash, bNodeInstanceKey key)
void node_tree_set_output(bNodeTree *ntree)
bNodeSocket * node_find_enabled_input_socket(bNode &node, StringRef name)
void node_instance_hash_tag(bNodeInstanceHash *hash, void *value)
bool node_is_parent_and_child(const bNode *parent, const bNode *child)
bNodePreview * node_preview_copy(bNodePreview *preview)
int node_instance_hash_size(bNodeInstanceHash *hash)
bNodeTree * node_tree_copy_tree_ex(const bNodeTree *ntree, Main *bmain, bool do_id_user)
static void node_free_type(void *nodetype_v)
static bNodeSocket * make_socket(bNodeTree *ntree, bNode *, const int in_out, ListBase *lb, const char *idname, const char *identifier, const char *name)
void node_socket_declarations_update(bNode *node)
static bool socket_id_user_decrement(bNodeSocket *sock)
void node_instance_hash_insert(bNodeInstanceHash *hash, bNodeInstanceKey key, void *value)
static ID ** node_owner_pointer_get(ID *id, const bool debug_relationship_assert)
void node_modify_socket_type_static(bNodeTree *ntree, bNode *node, bNodeSocket *sock, int type, int subtype)
bNodeSocketType NodeSocketTypeUndefined
std::optional< eNodeSocketDatatype > geo_nodes_base_cpp_type_to_socket_type(const CPPType &type)
float2 node_to_view(const bNode *node, float2 loc)
void node_tree_remove_layer_n(bNodeTree *ntree, Scene *scene, int layer_index)
void node_attach_node(bNodeTree *ntree, bNode *node, bNode *parent)
void node_unlink_node(bNodeTree *ntree, bNode *node)
bool node_supports_active_flag(const bNode *node, int sub_active)
Does the given node supports the sub active flag.
void node_register_alias(bNodeType *nt, const char *alias)
void node_tree_blend_read_data(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree)
bool node_type_is_undefined(const bNode *node)
void node_set_active(bNodeTree *ntree, bNode *node)
static bool node_poll_default(const bNodeType *, const bNodeTree *, const char **)
void node_detach_node(bNodeTree *ntree, bNode *node)
static GHash * nodesockettypes_hash
const char * node_type_find_alias(const char *idname)
bool node_declaration_ensure_on_outdated_node(bNodeTree *ntree, bNode *node)
void node_tree_free_local_tree(bNodeTree *ntree)
bool node_socket_is_registered(const bNodeSocket *sock)
static void node_init(const bContext *C, bNodeTree *ntree, bNode *node)
bool node_link_is_hidden(const bNodeLink *link)
int node_instance_hash_remove(bNodeInstanceHash *hash, bNodeInstanceKey key, bNodeInstanceValueFP valfreefp)
static void ntree_set_typeinfo(bNodeTree *ntree, bNodeTreeType *typeinfo)
void * node_instance_hash_lookup(bNodeInstanceHash *hash, bNodeInstanceKey key)
const char * node_socket_sub_type_label(int subtype)
static void update_typeinfo(Main *bmain, const bContext *C, bNodeTreeType *treetype, bNodeType *nodetype, bNodeSocketType *socktype, const bool unregister)
static void socket_id_user_increment(bNodeSocket *sock)
void node_remove_socket_links(bNodeTree *ntree, bNodeSocket *sock)
void node_unregister_socket_type(bNodeSocketType *stype)
std::optional< VolumeGridType > socket_type_to_grid_type(eNodeSocketDatatype type)
bNodeTree * node_tree_copy_tree(Main *bmain, const bNodeTree *ntree)
bNodeTree * node_tree_add_in_lib(Main *bmain, Library *owner_library, const char *name, const char *idname)
static void node_preview_tag_used_recursive(bNodeInstanceHash *previews, bNodeTree *ntree, bNodeInstanceKey parent_key)
static bool ntree_contains_tree_exec(const bNodeTree *tree_to_search_in, const bNodeTree *tree_to_search_for, Set< const bNodeTree * > &already_passed)
static GHash * nodetypes_alias_hash
bool node_tree_iterator_step(NodeTreeIterStore *ntreeiter, bNodeTree **r_nodetree, ID **r_id)
static void update_socket_declarations(ListBase *sockets, Span< nodes::SocketDeclaration * > declarations)
static Set< int > get_known_node_types_set()
static void remove_unsupported_sockets(ListBase *sockets, ListBase *links)
bNodeTree * node_tree_localize(bNodeTree *ntree, ID *new_owner_id)
void node_tree_blend_write(BlendWriter *writer, bNodeTree *ntree)
bNode * node_add_static_node(const bContext *C, bNodeTree *ntree, int type)
static void node_foreach_path(ID *id, BPathForeachPathData *bpath_data)
static const CPPType * slow_socket_type_to_geo_nodes_base_cpp_type(const eNodeSocketDatatype type)
void node_remove_node(Main *bmain, bNodeTree *ntree, bNode *node, bool do_id_user)
void node_update_asset_metadata(bNodeTree &node_tree)
static bool is_node_socket_supported(const bNodeSocket *sock)
const DataTypeConversions & get_implicit_type_conversions()
bool node_preview_used(const bNode *node)
static bool unique_identifier_check(void *arg, const char *identifier)
void node_preview_free(bNodePreview *preview)
static void ntree_copy_data(Main *, std::optional< Library * >, ID *id_dst, const ID *id_src, const int flag)
void node_internal_relink(bNodeTree *ntree, bNode *node)
GHashIterator * node_type_get_iterator()
void node_position_relative(bNode *from_node, const bNode *to_node, const bNodeSocket *from_sock, const bNodeSocket *to_sock)
bNode * node_copy_with_mapping(bNodeTree *dst_tree, const bNode &node_src, int flag, bool use_unique, Map< const bNodeSocket *, bNodeSocket * > &new_socket_map)
void node_tree_set_type(const bContext *C, bNodeTree *ntree)
void node_link_set_mute(bNodeTree *ntree, bNodeLink *link, const bool muted)
bNode * node_copy(bNodeTree *dst_tree, const bNode &src_node, int flag, bool use_unique)
void node_tree_update_all_new(Main *main)
bNodeLink * node_add_link(bNodeTree *ntree, bNode *fromnode, bNodeSocket *fromsock, bNode *tonode, bNodeSocket *tosock)
void node_type_size_preset(bNodeType *ntype, eNodeSizePreset size)
void nodeLabel(const bNodeTree *ntree, const bNode *node, char *label, int maxlen)
bNodeSocket * node_add_static_socket(bNodeTree *ntree, bNode *node, eNodeSocketInOut in_out, int type, int subtype, const char *identifier, const char *name)
static void ntree_free_data(ID *id)
bool node_find_node_try(bNodeTree *ntree, bNodeSocket *sock, bNode **r_node, int *r_sockindex)
bNode * node_find_root_parent(bNode *node)
void node_tree_node_flag_set(const bNodeTree *ntree, int flag, bool enable)
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_instance_hash_remove_untagged(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp)
void node_chain_iterator_backwards(const bNodeTree *ntree, const bNode *node_start, bool(*callback)(bNode *, bNode *, void *), void *userdata, int recursion_lvl)
void node_chain_iterator(const bNodeTree *ntree, const bNode *node_start, bool(*callback)(bNode *, bNode *, void *, const bool), void *userdata, bool reversed)
void node_tree_type_free_link(const bNodeTreeType *nt)
static void ntree_init_data(ID *id)
void node_tree_local_merge(Main *bmain, bNodeTree *localtree, bNodeTree *ntree)
bNodeTree * node_tree_add_tree(Main *bmain, const char *name, const char *idname)
static void node_unlink_attached(bNodeTree *ntree, const bNode *parent)
BLI_INLINE void * node_instance_hash_iterator_get_value(bNodeInstanceHashIterator *iter)
bool node_instance_hash_tag_key(bNodeInstanceHash *hash, bNodeInstanceKey key)
bNode * node_get_active(bNodeTree *ntree)
bool node_is_static_socket_type(const bNodeSocketType *stype)
void node_tree_iterator_init(NodeTreeIterStore *ntreeiter, Main *bmain)
static bNodeInstanceKey node_hash_int_str(bNodeInstanceKey hash, const char *str)
const char * nodeSocketShortLabel(const bNodeSocket *sock)
void node_instance_hash_clear_tags(bNodeInstanceHash *hash)
std::optional< eNodeSocketDatatype > grid_type_to_socket_type(VolumeGridType type)
bNodeType * node_type_find(const char *idname)
void node_node_foreach_id(bNode *node, LibraryForeachIDData *data)
bNodeTreeType NodeTreeTypeUndefined
static bool can_read_node_type(const int type)
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)
bNode * node_add_node(const bContext *C, bNodeTree *ntree, const char *idname)
bNodeTree ** node_tree_ptr_from_id(ID *id)
void node_parents_iterator(bNode *node, bool(*callback)(bNode *, void *), void *userdata)
bool node_link_is_selected(const bNodeLink *link)
bNodeSocketType * node_socket_type_find(const char *idname)
void node_rebuild_id_vector(bNodeTree *node_tree)
void node_position_propagate(bNode *node)
const char * node_socket_type_label(const bNodeSocketType *stype)
static void reset_socket_declarations(ListBase *sockets)
void node_tree_type_add(bNodeTreeType *nt)
const bNodeInstanceKey NODE_INSTANCE_KEY_BASE
std::optional< eNodeSocketDatatype > custom_data_type_to_socket_type(eCustomDataType type)
bNodeTree * node_tree_add_tree_embedded(Main *bmain, ID *owner_id, const char *name, const char *idname)
void node_preview_remove_unused(bNodeTree *ntree)
void node_instance_hash_clear(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp)
bNodeType NodeTypeUndefined
static void node_foreach_id(ID *id, LibraryForeachIDData *data)
void node_type_socket_templates(bNodeType *ntype, bNodeSocketTemplate *inputs, bNodeSocketTemplate *outputs)
bNodeInstanceKey node_instance_key(bNodeInstanceKey parent_key, const bNodeTree *ntree, const bNode *node)
void node_remove_socket(bNodeTree *ntree, bNode *node, bNodeSocket *sock)
void node_find_node(bNodeTree *ntree, bNodeSocket *sock, bNode **r_node, int *r_sockindex)
static void ntree_blend_read_data(BlendDataReader *reader, ID *id)
void node_register_socket_type(bNodeSocketType *stype)
void node_remove_link(bNodeTree *ntree, bNodeLink *link)
static void node_socket_copy(bNodeSocket *sock_dst, const bNodeSocket *sock_src, const int flag)
const char * node_static_socket_type(int type, int subtype)
void node_preview_merge_tree(bNodeTree *to_ntree, bNodeTree *from_ntree, bool remove_old)
void node_tree_free_tree(bNodeTree *ntree)
void node_set_socket_availability(bNodeTree *ntree, bNodeSocket *sock, bool is_available)
void node_type_size(bNodeType *ntype, int width, int minwidth, int maxwidth)
static bool node_poll_instance_default(const bNode *node, const bNodeTree *ntree, const char **r_disabled_hint)
GHashIterator * node_tree_type_get_iterator()
bNodeSocket * node_find_enabled_output_socket(bNode &node, StringRef name)
bNodeSocket * node_add_socket(bNodeTree *ntree, bNode *node, eNodeSocketInOut in_out, const char *idname, const char *identifier, const char *name)
const CPPType * socket_type_to_geo_nodes_base_cpp_type(eNodeSocketDatatype type)
static bNodeTree * node_tree_add_tree_do(Main *bmain, std::optional< Library * > owner_library, ID *owner_id, const bool is_embedded, const char *name, const char *idname)
static void node_tree_asset_pre_save(void *asset_ptr, AssetMetaData *)
static void iter_backwards_ex(const bNodeTree *ntree, const bNode *node_start, bool(*callback)(bNode *, bNode *, void *), void *userdata, const char recursion_mask)
void node_type_storage(bNodeType *ntype, const char *storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
static GHash * nodetypes_hash
void node_tree_free_local_node(bNodeTree *ntree, bNode *node)
BLI_INLINE bNodeInstanceKey node_instance_hash_iterator_get_key(bNodeInstanceHashIterator *iter)
bool node_set_selected(bNode *node, bool select)
void node_preview_init_tree(bNodeTree *ntree, int xsize, int ysize)
static void node_free_socket_type(void *socktype_v)
static uint node_instance_hash_key(const void *key)
void node_internal_links(bNode *node, bNodeLink **r_links, int *r_len)
void node_clear_active(bNodeTree *ntree)
static void node_replace_undefined_types(bNode *node)
bNodeSocket * node_find_enabled_socket(bNode &node, eNodeSocketInOut in_out, StringRef name)
const char * node_static_socket_label(int type, int subtype)
void node_unregister_type(bNodeType *ntype)
static void node_type_base_defaults(bNodeType *ntype)
void node_tag_update_id(bNode *node)
void node_register_type(bNodeType *ntype)
static void node_preview_init_tree_recursive(bNodeInstanceHash *previews, bNodeTree *ntree, bNodeInstanceKey parent_key, const int xsize, const int ysize)
void * node_instance_hash_pop(bNodeInstanceHash *hash, bNodeInstanceKey key)
static void free_localized_node_groups(bNodeTree *ntree)
bool node_tree_contains_tree(const bNodeTree *tree_to_search_in, const bNodeTree *tree_to_search_for)
int node_socket_link_limit(const bNodeSocket *sock)
void node_instance_hash_free(bNodeInstanceHash *hash, bNodeInstanceValueFP valfreefp)
const char * nodeSocketLabel(const bNodeSocket *sock)
static void library_foreach_node_socket(bNodeSocket *sock, LibraryForeachIDData *data)
static void * socket_value_storage(bNodeSocket &socket)
bNodePreview * node_preview_verify(bNodeInstanceHash *previews, bNodeInstanceKey key, int xsize, int ysize, bool create)
void(*)(void *value) bNodeInstanceValueFP
static void ntree_blend_write(BlendWriter *writer, ID *id, const void *id_address)
GHashIterator * node_socket_type_get_iterator()
bool node_declaration_ensure(bNodeTree *ntree, bNode *node)
bNodeTreeType * node_tree_type_find(const char *idname)
void node_unique_id(bNodeTree *ntree, bNode *node)
void node_type_base(bNodeType *ntype, int type, const char *name, short nclass)
int node_count_socket_links(const bNodeTree *ntree, const bNodeSocket *sock)
static void * node_static_value_storage_for(bNode &node, const bNodeSocket &socket)
void node_free_node(bNodeTree *tree, bNode *node)
void node_type_base_custom(bNodeType *ntype, const char *idname, const char *name, const char *enum_name, short nclass)
static void node_add_sockets_from_type(bNodeTree *ntree, bNode *node, bNodeType *ntype)
const bNodeInstanceKey NODE_INSTANCE_KEY_NONE
static bool unique_socket_template_identifier_check(void *arg, const char *name)
static void ntree_free_type(void *treetype_v)
bNodeInstanceHash * node_instance_hash_new(const char *info)
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)
void node_remove_socket_ex(bNodeTree *ntree, bNode *node, bNodeSocket *sock, bool do_id_user)
const char * node_static_socket_interface_type_new(int type, int subtype)
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)
static bool node_instance_hash_key_cmp(const void *a, const void *b)
float2 node_from_view(const bNode *node, float2 view_loc)
bNodeSocket * node_find_socket(bNode *node, eNodeSocketInOut in_out, StringRef identifier)
static void node_socket_free(bNodeSocket *sock, const bool do_id_user)
void node_dimensions_get(const bNode *node, float *r_width, float *r_height)
static void node_socket_set_typeinfo(bNodeTree *ntree, bNodeSocket *sock, bNodeSocketType *typeinfo)
bNode * node_find_node_by_name(bNodeTree *ntree, const char *name)
void node_tree_free_embedded_tree(bNodeTree *ntree)
static void write_node_socket(BlendWriter *writer, const bNodeSocket *sock)
bool node_tree_is_registered(const bNodeTree *ntree)
std::optional< eCustomDataType > socket_type_to_custom_data_type(eNodeSocketDatatype type)
void node_modify_socket_type(bNodeTree *ntree, bNode *node, bNodeSocket *sock, const char *idname)
static GHash * nodetreetypes_hash
void node_unique_name(bNodeTree *ntree, bNode *node)
static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock)
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)
VecBase< float, 2 > float2
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)
void node_socket_copy_default_value_data(eNodeSocketDatatype datatype, void *to, const void *from)
static blender::bke::bNodeSocketTemplate outputs[]
static blender::bke::bNodeSocketTemplate inputs[]
bool RNA_struct_is_a(const StructRNA *type, const StructRNA *srna)
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(ID *id, StructRNA *type, void *data)
const EnumPropertyItem rna_enum_property_subtype_items[]
struct bNodeTree * nodetree
unsigned int id_session_uid
ImBufByteBuffer byte_buffer
struct bNodeTree * nodetree
struct bNodeTree * nodetree
NodeCryptomatte_Runtime runtime
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct bNodeTree * nodetree
struct Collection * value
bNodeSocketRuntimeHandle * runtime
bNodeSocketTypeHandle * typeinfo
char * default_attribute_name
char * default_attribute_name
bNodeTreeRuntimeHandle * runtime
struct GeometryNodeAssetTraits * geometry_node_asset_traits
struct PreviewImage * preview
bNestedNodeRef * nested_node_refs
NodeInstanceHashHandle * previews
int default_group_node_width
bNodeTreeTypeHandle * typeinfo
bNodeTreeInterface tree_interface
bNodeTypeHandle * typeinfo
bNodePanelState * panel_states_array
bNodeRuntimeHandle * runtime
FreestyleLineStyle * linestyle
bNodeSocketTemplate * list
bNodeSocketTemplate * ntemp
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)
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)