[Bf-blender-cvs] [ac131ea] openvdb: Relink outputs when opening a file after one was already open in the node.
Kévin Dietrich
noreply at git.blender.org
Fri Jun 5 14:08:39 CEST 2015
Commit: ac131ea55138469e9f9ea7c237e412c06201845c
Author: Kévin Dietrich
Date: Mon Jun 1 13:55:21 2015 +0200
Branches: openvdb
https://developer.blender.org/rBac131ea55138469e9f9ea7c237e412c06201845c
Relink outputs when opening a file after one was already open in the
node.
===================================================================
M source/blender/nodes/shader/nodes/node_shader_openvdb.c
===================================================================
diff --git a/source/blender/nodes/shader/nodes/node_shader_openvdb.c b/source/blender/nodes/shader/nodes/node_shader_openvdb.c
index 96c3f99..6ca35f6 100644
--- a/source/blender/nodes/shader/nodes/node_shader_openvdb.c
+++ b/source/blender/nodes/shader/nodes/node_shader_openvdb.c
@@ -40,10 +40,27 @@ static void node_shader_init_openvdb(bNodeTree *UNUSED(ntree), bNode *node)
node->storage = vdb;
}
+static bNodeSocket *node_output_relink(bNode *node, bNodeSocket *oldsock, int oldindex)
+{
+ bNodeSocket *sock;
+
+ /* first try to find matching socket name */
+ for (sock = node->outputs.first; sock; sock = sock->next)
+ if (STREQ(sock->name, oldsock->name))
+ return sock;
+
+ /* no matching name, simply link to same index */
+ return BLI_findlink(&node->outputs, oldindex);
+}
+
#ifdef WITH_OPENVDB
void ntreeUpdateOpenVDBNode(Main *bmain, bNodeTree *ntree, bNode *node)
{
NodeShaderOpenVDB *vdb = node->storage;
+ bNodeSocket *newsock, *oldsock;
+ ListBase oldsocklist;
+ bNodeLink *link;
+ int oldindex;
char *filename;
if (!vdb) {
@@ -56,8 +73,22 @@ void ntreeUpdateOpenVDBNode(Main *bmain, bNodeTree *ntree, bNode *node)
BLI_path_abs(filename, bmain->name);
}
+ oldsocklist = node->outputs;
BLI_listbase_clear(&node->outputs);
+
OpenVDB_getNodeSockets(filename, ntree, node);
+
+ /* move links to new socket */
+ for (oldsock = oldsocklist.first, oldindex = 0; oldsock; oldsock = oldsock->next, ++oldindex) {
+ newsock = node_output_relink(node, oldsock, oldindex);
+
+ if (newsock) {
+ for (link = ntree->links.first; link; link = link->next) {
+ if (link->fromsock == oldsock)
+ link->fromsock = newsock;
+ }
+ }
+ }
}
#else
void ntreeUpdateOpenVDBNode(Main *bmain, bNodeTree *ntree, bNode *node)
More information about the Bf-blender-cvs
mailing list