Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/node.cc
| Show First 20 Lines • Show All 136 Lines • ▼ Show 20 Lines | |||||
| static void ntree_init_data(ID *id) | static void ntree_init_data(ID *id) | ||||
| { | { | ||||
| bNodeTree *ntree = (bNodeTree *)id; | bNodeTree *ntree = (bNodeTree *)id; | ||||
| ntree_set_typeinfo(ntree, nullptr); | ntree_set_typeinfo(ntree, nullptr); | ||||
| } | } | ||||
| static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag) | static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag) | ||||
| { | { | ||||
| std::cout << "Copy node tree, dst: " << id_dst << " src: " << id_src << "\n"; | |||||
| bNodeTree *ntree_dst = (bNodeTree *)id_dst; | bNodeTree *ntree_dst = (bNodeTree *)id_dst; | ||||
| const bNodeTree *ntree_src = (const bNodeTree *)id_src; | const bNodeTree *ntree_src = (const bNodeTree *)id_src; | ||||
| /* We never handle usercount here for own data. */ | /* We never handle usercount here for own data. */ | ||||
| const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT; | const int flag_subdata = flag | LIB_ID_CREATE_NO_USER_REFCOUNT; | ||||
| /* in case a running nodetree is copied */ | /* in case a running nodetree is copied */ | ||||
| ntree_dst->execdata = nullptr; | ntree_dst->execdata = nullptr; | ||||
| ▲ Show 20 Lines • Show All 87 Lines • ▼ Show 20 Lines | static void ntree_copy_data(Main *UNUSED(bmain), ID *id_dst, const ID *id_src, const int flag) | ||||
| } | } | ||||
| BLI_ghash_free(new_pointers, nullptr, nullptr); | BLI_ghash_free(new_pointers, nullptr, nullptr); | ||||
| /* node tree will generate its own interface type */ | /* node tree will generate its own interface type */ | ||||
| ntree_dst->interface_type = nullptr; | ntree_dst->interface_type = nullptr; | ||||
| if (ntree_src->field_inferencing_interface) { | if (ntree_src->field_inferencing_interface) { | ||||
| std::cout << "Copying interface from " << ntree_src << " to " << ntree_dst << "\n"; | |||||
| ntree_dst->field_inferencing_interface = node_field_inferencing_interface_copy( | ntree_dst->field_inferencing_interface = node_field_inferencing_interface_copy( | ||||
| *ntree_src->field_inferencing_interface); | *ntree_src->field_inferencing_interface); | ||||
| } | } | ||||
| } | } | ||||
| static void ntree_free_data(ID *id) | static void ntree_free_data(ID *id) | ||||
| { | { | ||||
| std::cout << "Free node tree: " << id << "\n"; | |||||
| bNodeTree *ntree = (bNodeTree *)id; | bNodeTree *ntree = (bNodeTree *)id; | ||||
| /* XXX hack! node trees should not store execution graphs at all. | /* XXX hack! node trees should not store execution graphs at all. | ||||
| * This should be removed when old tree types no longer require it. | * This should be removed when old tree types no longer require it. | ||||
| * Currently the execution data for texture nodes remains in the tree | * Currently the execution data for texture nodes remains in the tree | ||||
| * after execution, until the node tree is updated or freed. | * after execution, until the node tree is updated or freed. | ||||
| */ | */ | ||||
| if (ntree->execdata) { | if (ntree->execdata) { | ||||
| Show All 26 Lines | LISTBASE_FOREACH_MUTABLE (bNodeSocket *, sock, &ntree->inputs) { | ||||
| MEM_freeN(sock); | MEM_freeN(sock); | ||||
| } | } | ||||
| LISTBASE_FOREACH_MUTABLE (bNodeSocket *, sock, &ntree->outputs) { | LISTBASE_FOREACH_MUTABLE (bNodeSocket *, sock, &ntree->outputs) { | ||||
| node_socket_interface_free(ntree, sock, false); | node_socket_interface_free(ntree, sock, false); | ||||
| MEM_freeN(sock); | MEM_freeN(sock); | ||||
| } | } | ||||
| node_field_inferencing_interface_free(ntree->field_inferencing_interface); | node_field_inferencing_interface_free(ntree->field_inferencing_interface); | ||||
| ntree->field_inferencing_interface = (FieldInferencingInterfaceHandle *)0xFFFFFFFFf; | |||||
| /* free preview hash */ | /* free preview hash */ | ||||
| if (ntree->previews) { | if (ntree->previews) { | ||||
| BKE_node_instance_hash_free(ntree->previews, (bNodeInstanceValueFP)BKE_node_preview_free); | BKE_node_instance_hash_free(ntree->previews, (bNodeInstanceValueFP)BKE_node_preview_free); | ||||
| } | } | ||||
| if (ntree->id.tag & LIB_TAG_LOCALIZED) { | if (ntree->id.tag & LIB_TAG_LOCALIZED) { | ||||
| BKE_libblock_free_data(&ntree->id, true); | BKE_libblock_free_data(&ntree->id, true); | ||||
| ▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | if (nodetree->type == NTREE_COMPOSIT) { | ||||
| LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) { | LISTBASE_FOREACH (bNode *, node, &nodetree->nodes) { | ||||
| if (node->type == CMP_NODE_MOVIEDISTORTION) { | if (node->type == CMP_NODE_MOVIEDISTORTION) { | ||||
| key.offset_in_ID = (size_t)BLI_ghashutil_strhash_p(node->name); | key.offset_in_ID = (size_t)BLI_ghashutil_strhash_p(node->name); | ||||
| key.cache_v = node->storage; | key.cache_v = node->storage; | ||||
| function_callback(id, &key, (void **)&node->storage, 0, user_data); | function_callback(id, &key, (void **)&node->storage, 0, user_data); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (nodetree->type == NTREE_GEOMETRY) { | |||||
| key.offset_in_ID = offsetof(bNodeTree, field_inferencing_interface); | |||||
| key.cache_v = nodetree->field_inferencing_interface; | |||||
| std::cout << " KEY: {" << key.id_session_uuid << ", " << key.offset_in_ID << ", " | |||||
| << key.cache_v << "}" | |||||
| << "\n"; | |||||
| std::cout << " node tree: " << nodetree << "\n"; | |||||
| std::cout << " field interface before: " << nodetree->field_inferencing_interface << "\n"; | |||||
| function_callback(id, &key, (void **)&nodetree->field_inferencing_interface, 0, user_data); | |||||
| std::cout << " field interface after: " << nodetree->field_inferencing_interface << "\n"; | |||||
| } | |||||
| } | } | ||||
| static ID *node_owner_get(Main *bmain, ID *id) | static ID *node_owner_get(Main *bmain, ID *id) | ||||
| { | { | ||||
| if ((id->flag & LIB_EMBEDDED_DATA) == 0) { | if ((id->flag & LIB_EMBEDDED_DATA) == 0) { | ||||
| return id; | return id; | ||||
| } | } | ||||
| /* TODO: Sort this NO_MAIN or not for embedded node trees. See T86119. */ | /* TODO: Sort this NO_MAIN or not for embedded node trees. See T86119. */ | ||||
| ▲ Show 20 Lines • Show All 91 Lines • ▼ Show 20 Lines | static void write_node_socket_interface(BlendWriter *writer, bNodeSocket *sock) | ||||
| } | } | ||||
| write_node_socket_default_value(writer, sock); | write_node_socket_default_value(writer, sock); | ||||
| } | } | ||||
| /* this is only direct data, tree itself should have been written */ | /* this is only direct data, tree itself should have been written */ | ||||
| void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree) | void ntreeBlendWrite(BlendWriter *writer, bNodeTree *ntree) | ||||
| { | { | ||||
| std::cout << "Write node tree: " << ntree << "\n"; | |||||
| BKE_id_blend_write(writer, &ntree->id); | BKE_id_blend_write(writer, &ntree->id); | ||||
| /* for link_list() speed, we write per list */ | /* for link_list() speed, we write per list */ | ||||
| if (ntree->adt) { | if (ntree->adt) { | ||||
| BKE_animdata_blend_write(writer, ntree->adt); | BKE_animdata_blend_write(writer, ntree->adt); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 143 Lines • ▼ Show 20 Lines | static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock) | ||||
| BLO_read_data_address(reader, &sock->default_value); | BLO_read_data_address(reader, &sock->default_value); | ||||
| sock->total_inputs = 0; /* Clear runtime data set before drawing. */ | sock->total_inputs = 0; /* Clear runtime data set before drawing. */ | ||||
| sock->cache = nullptr; | sock->cache = nullptr; | ||||
| } | } | ||||
| /* ntree itself has been read! */ | /* ntree itself has been read! */ | ||||
| void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) | void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) | ||||
| { | { | ||||
| std::cout << "Read node tree: " << ntree << "\n"; | |||||
| /* NOTE: writing and reading goes in sync, for speed. */ | /* NOTE: writing and reading goes in sync, for speed. */ | ||||
| ntree->init = 0; /* to set callbacks and force setting types */ | ntree->init = 0; /* to set callbacks and force setting types */ | ||||
| ntree->is_updating = false; | ntree->is_updating = false; | ||||
| ntree->typeinfo = nullptr; | ntree->typeinfo = nullptr; | ||||
| ntree->interface_type = nullptr; | ntree->interface_type = nullptr; | ||||
| ntree->progress = nullptr; | ntree->progress = nullptr; | ||||
| ntree->execdata = nullptr; | ntree->execdata = nullptr; | ||||
| ntree->field_inferencing_interface = nullptr; | // ntree->field_inferencing_interface = nullptr; | ||||
| BLO_read_data_address(reader, &ntree->adt); | BLO_read_data_address(reader, &ntree->adt); | ||||
| BKE_animdata_blend_read_data(reader, ntree->adt); | BKE_animdata_blend_read_data(reader, ntree->adt); | ||||
| BLO_read_list(reader, &ntree->nodes); | BLO_read_list(reader, &ntree->nodes); | ||||
| LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { | LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { | ||||
| node->typeinfo = nullptr; | node->typeinfo = nullptr; | ||||
| node->declaration = nullptr; | node->declaration = nullptr; | ||||
| ▲ Show 20 Lines • Show All 3,777 Lines • ▼ Show 20 Lines | static FieldInferencingInterface *node_field_inferencing_interface_copy( | ||||
| const FieldInferencingInterface &field_inferencing_interface) | const FieldInferencingInterface &field_inferencing_interface) | ||||
| { | { | ||||
| return new FieldInferencingInterface(field_inferencing_interface); | return new FieldInferencingInterface(field_inferencing_interface); | ||||
| } | } | ||||
| static void node_field_inferencing_interface_free( | static void node_field_inferencing_interface_free( | ||||
| const FieldInferencingInterface *field_inferencing_interface) | const FieldInferencingInterface *field_inferencing_interface) | ||||
| { | { | ||||
| std::cout << "Freeing interface " << field_inferencing_interface << "\n"; | |||||
| delete field_inferencing_interface; | delete field_inferencing_interface; | ||||
| } | } | ||||
| namespace blender::bke::node_field_inferencing { | namespace blender::bke::node_field_inferencing { | ||||
| static bool is_field_socket_type(eNodeSocketDatatype type) | static bool is_field_socket_type(eNodeSocketDatatype type) | ||||
| { | { | ||||
| return ELEM(type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA); | return ELEM(type, SOCK_FLOAT, SOCK_INT, SOCK_BOOLEAN, SOCK_VECTOR, SOCK_RGBA); | ||||
| ▲ Show 20 Lines • Show All 1,495 Lines • Show Last 20 Lines | |||||