[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