Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-04-20 21:25:20 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-04-24 13:44:27 +0300
commit1978066e041424db82613cd0ba4c6a928fa878d8 (patch)
treed6819ca85407b19efa98f53d9eb43b95de0ea6a9 /source/blender/blenloader/intern/versioning_250.c
parentbde1561fc1ad503f06b1873c767f615b6485a2e9 (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.c65
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;
+ }
+}