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)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to