diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-04-20 21:25:20 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-04-24 13:44:27 +0300 |
commit | 1978066e041424db82613cd0ba4c6a928fa878d8 (patch) | |
tree | d6819ca85407b19efa98f53d9eb43b95de0ea6a9 /source/blender/blenloader/intern/versioning_250.c | |
parent | bde1561fc1ad503f06b1873c767f615b6485a2e9 (diff) |
Nodes: better integrate node init and versioning in file reading
Node versioning code was added before there was a mechanism to do versioning
after lib linking. Now integrate with that system and make it less of a strange
exception. Node versioning is now skipped on undo, like other versioning code.
Diffstat (limited to 'source/blender/blenloader/intern/versioning_250.c')
-rw-r--r-- | source/blender/blenloader/intern/versioning_250.c | 65 |
1 files changed, 59 insertions, 6 deletions
diff --git a/source/blender/blenloader/intern/versioning_250.c b/source/blender/blenloader/intern/versioning_250.c index d7c26564576..a34b441d511 100644 --- a/source/blender/blenloader/intern/versioning_250.c +++ b/source/blender/blenloader/intern/versioning_250.c @@ -2030,12 +2030,9 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain) } } - /* XXX The external group node sockets needs to adjust their own_index to point at - * associated ntree inputs/outputs internal sockets. However, this can only happen - * after lib-linking (needs access to internal node group tree)! - * Setting a temporary flag here, actual do_versions happens in lib_verify_nodetree. - */ - ntree->flag |= NTREE_DO_VERSIONS_GROUP_EXPOSE_2_56_2; + /* Externl group node socket need to adjust their own_index to point at + * associated ntree inputs/outputs internal sockets. This happens in + * do_versions_after_linking_250, after lib linking. */ } } @@ -2296,3 +2293,59 @@ void blo_do_versions_250(FileData *fd, Library *lib, Main *bmain) } } } + +/* updates group node socket identifier so that + * external links to/from the group node are preserved. + */ +static void lib_node_do_versions_group_indices(bNode *gnode) +{ + bNodeTree *ngroup = (bNodeTree *)gnode->id; + bNodeSocket *sock; + bNodeLink *link; + + for (sock = gnode->outputs.first; sock; sock = sock->next) { + int old_index = sock->to_index; + + for (link = ngroup->links.first; link; link = link->next) { + if (link->tonode == NULL && link->fromsock->own_index == old_index) { + strcpy(sock->identifier, link->fromsock->identifier); + /* deprecated */ + sock->own_index = link->fromsock->own_index; + sock->to_index = 0; + sock->groupsock = NULL; + } + } + } + for (sock = gnode->inputs.first; sock; sock = sock->next) { + int old_index = sock->to_index; + + for (link = ngroup->links.first; link; link = link->next) { + if (link->fromnode == NULL && link->tosock->own_index == old_index) { + strcpy(sock->identifier, link->tosock->identifier); + /* deprecated */ + sock->own_index = link->tosock->own_index; + sock->to_index = 0; + sock->groupsock = NULL; + } + } + } +} + +void do_versions_after_linking_250(Main *bmain) +{ + if (bmain->versionfile < 256 || (bmain->versionfile == 256 && bmain->subversionfile < 2)) { + FOREACH_NODETREE_BEGIN (bmain, ntree, id) { + /* updates external links for all group nodes in a tree */ + bNode *node; + for (node = ntree->nodes.first; node; node = node->next) { + if (node->type == NODE_GROUP) { + bNodeTree *ngroup = (bNodeTree *)node->id; + if (ngroup) { + lib_node_do_versions_group_indices(node); + } + } + } + } + FOREACH_NODETREE_END; + } +} |