Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/node.cc
| Show First 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | static void ntree_copy_data(Main * /*bmain*/, ID *id_dst, const ID *id_src, const int flag) | ||||
| ntree_dst->runtime = MEM_new<bNodeTreeRuntime>(__func__); | ntree_dst->runtime = MEM_new<bNodeTreeRuntime>(__func__); | ||||
| bNodeTreeRuntime &dst_runtime = *ntree_dst->runtime; | bNodeTreeRuntime &dst_runtime = *ntree_dst->runtime; | ||||
| Map<const bNodeSocket *, bNodeSocket *> socket_map; | Map<const bNodeSocket *, bNodeSocket *> socket_map; | ||||
| dst_runtime.nodes_by_id.reserve(ntree_src->all_nodes().size()); | dst_runtime.nodes_by_id.reserve(ntree_src->all_nodes().size()); | ||||
| BLI_listbase_clear(&ntree_dst->nodes); | BLI_listbase_clear(&ntree_dst->nodes); | ||||
| LISTBASE_FOREACH (const bNode *, src_node, &ntree_src->nodes) { | int i; | ||||
| LISTBASE_FOREACH_INDEX (const bNode *, src_node, &ntree_src->nodes, i) { | |||||
| /* Don't find a unique name for every node, since they should have valid names already. */ | /* Don't find a unique name for every node, since they should have valid names already. */ | ||||
| bNode *new_node = blender::bke::node_copy_with_mapping( | bNode *new_node = blender::bke::node_copy_with_mapping( | ||||
| ntree_dst, *src_node, flag_subdata, false, socket_map); | ntree_dst, *src_node, flag_subdata, false, socket_map); | ||||
| dst_runtime.nodes_by_id.add_new(new_node); | dst_runtime.nodes_by_id.add_new(new_node); | ||||
| new_node->runtime->index_in_tree = i; | |||||
| } | } | ||||
| /* copy links */ | /* copy links */ | ||||
| BLI_listbase_clear(&ntree_dst->links); | BLI_listbase_clear(&ntree_dst->links); | ||||
| LISTBASE_FOREACH (const bNodeLink *, src_link, &ntree_src->links) { | LISTBASE_FOREACH (const bNodeLink *, src_link, &ntree_src->links) { | ||||
| bNodeLink *dst_link = (bNodeLink *)MEM_dupallocN(src_link); | bNodeLink *dst_link = (bNodeLink *)MEM_dupallocN(src_link); | ||||
| dst_link->fromnode = dst_runtime.nodes_by_id.lookup_key_as(src_link->fromnode->identifier); | dst_link->fromnode = dst_runtime.nodes_by_id.lookup_key_as(src_link->fromnode->identifier); | ||||
| dst_link->fromsock = socket_map.lookup(src_link->fromsock); | dst_link->fromsock = socket_map.lookup(src_link->fromsock); | ||||
| ▲ Show 20 Lines • Show All 507 Lines • ▼ Show 20 Lines | void ntreeBlendReadData(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree) | ||||
| ntree->runtime = MEM_new<bNodeTreeRuntime>(__func__); | ntree->runtime = MEM_new<bNodeTreeRuntime>(__func__); | ||||
| BKE_ntree_update_tag_missing_runtime_data(ntree); | BKE_ntree_update_tag_missing_runtime_data(ntree); | ||||
| 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) { | int i; | ||||
| LISTBASE_FOREACH_INDEX (bNode *, node, &ntree->nodes, i) { | |||||
| node->runtime = MEM_new<bNodeRuntime>(__func__); | node->runtime = MEM_new<bNodeRuntime>(__func__); | ||||
| node->typeinfo = nullptr; | node->typeinfo = nullptr; | ||||
| node->runtime->index_in_tree = i; | |||||
| /* Create the `nodes_by_id` cache eagerly so it can be expected to be valid. Because | /* Create the `nodes_by_id` cache eagerly so it can be expected to be valid. Because | ||||
| * we create it here we also have to check for zero identifiers from previous versions. */ | * we create it here we also have to check for zero identifiers from previous versions. */ | ||||
| if (node->identifier == 0 || ntree->runtime->nodes_by_id.contains_as(node->identifier)) { | if (node->identifier == 0 || ntree->runtime->nodes_by_id.contains_as(node->identifier)) { | ||||
| nodeUniqueID(ntree, node); | nodeUniqueID(ntree, node); | ||||
| } | } | ||||
| else { | else { | ||||
| ntree->runtime->nodes_by_id.add_new(node); | ntree->runtime->nodes_by_id.add_new(node); | ||||
| ▲ Show 20 Lines • Show All 1,506 Lines • ▼ Show 20 Lines | void nodeUniqueID(bNodeTree *ntree, bNode *node) | ||||
| /* In the unlikely case that the random ID doesn't match, choose a new one until it does. */ | /* In the unlikely case that the random ID doesn't match, choose a new one until it does. */ | ||||
| int32_t new_id = id_rng.get_int32(); | int32_t new_id = id_rng.get_int32(); | ||||
| while (ntree->runtime->nodes_by_id.contains_as(new_id) || new_id <= 0) { | while (ntree->runtime->nodes_by_id.contains_as(new_id) || new_id <= 0) { | ||||
| new_id = id_rng.get_int32(); | new_id = id_rng.get_int32(); | ||||
| } | } | ||||
| node->identifier = new_id; | node->identifier = new_id; | ||||
| ntree->runtime->nodes_by_id.add_new(node); | ntree->runtime->nodes_by_id.add_new(node); | ||||
| node->runtime->index_in_tree = ntree->runtime->nodes_by_id.index_range().last(); | |||||
| BLI_assert(node->runtime->index_in_tree == ntree->runtime->nodes_by_id.index_of(node)); | |||||
| } | } | ||||
| bNode *nodeAddNode(const bContext *C, bNodeTree *ntree, const char *idname) | bNode *nodeAddNode(const bContext *C, bNodeTree *ntree, const char *idname) | ||||
| { | { | ||||
| bNode *node = MEM_cnew<bNode>("new node"); | bNode *node = MEM_cnew<bNode>("new node"); | ||||
| node->runtime = MEM_new<bNodeRuntime>(__func__); | node->runtime = MEM_new<bNodeRuntime>(__func__); | ||||
| BLI_addtail(&ntree->nodes, node); | BLI_addtail(&ntree->nodes, node); | ||||
| nodeUniqueID(ntree, node); | nodeUniqueID(ntree, node); | ||||
| ▲ Show 20 Lines • Show All 723 Lines • ▼ Show 20 Lines | for (bNode *node : ntree->all_nodes()) { | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void nodeRebuildIDVector(bNodeTree *node_tree) | void nodeRebuildIDVector(bNodeTree *node_tree) | ||||
| { | { | ||||
| /* Rebuild nodes #VectorSet which must have the same order as the list. */ | /* Rebuild nodes #VectorSet which must have the same order as the list. */ | ||||
| node_tree->runtime->nodes_by_id.clear(); | node_tree->runtime->nodes_by_id.clear(); | ||||
| LISTBASE_FOREACH (bNode *, node, &node_tree->nodes) { | int i; | ||||
| LISTBASE_FOREACH_INDEX (bNode *, node, &node_tree->nodes, i) { | |||||
| node_tree->runtime->nodes_by_id.add_new(node); | node_tree->runtime->nodes_by_id.add_new(node); | ||||
| node->runtime->index_in_tree = i; | |||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Free the node itself. | * Free the node itself. | ||||
| * | * | ||||
| * \note: ID user refcounting and changing the `nodes_by_id` vector are up to the caller. | * \note: ID user refcounting and changing the `nodes_by_id` vector are up to the caller. | ||||
| */ | */ | ||||
| ▲ Show 20 Lines • Show All 992 Lines • Show Last 20 Lines | |||||