[Bf-blender-cvs] [8ea69ff] object_nodes: Use a map to ensure proper links between internal nodes.
Lukas Tönne
noreply at git.blender.org
Tue Nov 24 09:43:10 CET 2015
Commit: 8ea69ffbc765ab8213b3d43baf4301f7696591fc
Author: Lukas Tönne
Date: Mon Oct 19 18:11:29 2015 +0200
Branches: object_nodes
https://developer.blender.org/rB8ea69ffbc765ab8213b3d43baf4301f7696591fc
Use a map to ensure proper links between internal nodes.
Socket names usually don't match the internal nodes exactly.
===================================================================
M source/blender/blenvm/intern/bvm_api.cc
===================================================================
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index f437a8e..5e8d153 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -114,10 +114,16 @@ void BVM_eval_forcefield(struct BVMEvalContext *ctx, struct BVMExpression *expr,
/* ------------------------------------------------------------------------- */
-static void set_input_value(bNode *bnode, int bindex, bvm::NodeInstance *node, const bvm::string &name)
+typedef std::pair<bNode*, bNodeSocket*> bSocketPair;
+typedef std::pair<bvm::NodeInstance*, bvm::string> SocketPair;
+typedef std::map<bSocketPair, SocketPair> SocketMap;
+
+static void map_input_socket(SocketMap &socket_map, bNode *bnode, int bindex, bvm::NodeInstance *node, const bvm::string &name)
{
bNodeSocket *binput = (bNodeSocket *)BLI_findlink(&bnode->inputs, bindex);
+ socket_map[bSocketPair(bnode, binput)] = SocketPair(node, name);
+
switch (binput->type) {
case SOCK_FLOAT: {
bNodeSocketValueFloat *bvalue = (bNodeSocketValueFloat *)binput->default_value;
@@ -132,7 +138,14 @@ static void set_input_value(bNode *bnode, int bindex, bvm::NodeInstance *node, c
}
}
-static void set_all_input_values(bNode *bnode, bvm::NodeInstance *node)
+static void map_output_socket(SocketMap &socket_map, bNode *bnode, int bindex, bvm::NodeInstance *node, const bvm::string &name)
+{
+ bNodeSocket *boutput = (bNodeSocket *)BLI_findlink(&bnode->outputs, bindex);
+
+ socket_map[bSocketPair(bnode, boutput)] = SocketPair(node, name);
+}
+
+static void map_all_input_sockets(SocketMap &socket_map, bNode *bnode, bvm::NodeInstance *node)
{
bNodeSocket *bsock;
int i;
@@ -140,7 +153,7 @@ static void set_all_input_values(bNode *bnode, bvm::NodeInstance *node)
for (bsock = (bNodeSocket *)bnode->inputs.first, i = 0; bsock; bsock = bsock->next, ++i) {
const bvm::NodeSocket *input = node->type->find_input(i);
- set_input_value(bnode, i, node, input->name);
+ map_input_socket(socket_map, bnode, i, node, input->name);
}
}
@@ -152,6 +165,9 @@ static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
graph.add_output("impulse", BVM_FLOAT3, zero);
}
+ /* maps bNodeTree sockets to internal sockets, for converting links */
+ SocketMap socket_map;
+
#if 1
for (bNode *bnode = (bNode*)btree->nodes.first; bnode; bnode = bnode->next) {
PointerRNA ptr;
@@ -168,14 +184,16 @@ static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
if (bvm::string(type) == "ForceOutputNode") {
{
bvm::NodeInstance *node = graph.add_node("PASS_FLOAT3", "RET_FORCE_" + bvm::string(bnode->name));
- set_input_value(bnode, 0, node, "value");
+ map_input_socket(socket_map, bnode, 0, node, "value");
+ map_output_socket(socket_map, bnode, 0, node, "value");
graph.set_output_link("force", node, "value");
}
{
bvm::NodeInstance *node = graph.add_node("PASS_FLOAT3", "RET_IMPULSE_" + bvm::string(bnode->name));
- set_input_value(bnode, 1, node, "value");
+ map_input_socket(socket_map, bnode, 1, node, "value");
+ map_output_socket(socket_map, bnode, 0, node, "value");
graph.set_output_link("impulse", node, "value");
}
@@ -185,14 +203,35 @@ static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
switch (mode) {
case 0: {
bvm::NodeInstance *node = graph.add_node("ADD_FLOAT", bnode->name);
- set_input_value(bnode, 0, node, "value_a");
- set_input_value(bnode, 1, node, "value_b");
+ map_input_socket(socket_map, bnode, 0, node, "value_a");
+ map_input_socket(socket_map, bnode, 1, node, "value_b");
+ map_output_socket(socket_map, bnode, 0, node, "value");
break;
}
case 1: {
bvm::NodeInstance *node = graph.add_node("SUB_FLOAT", bnode->name);
- set_input_value(bnode, 0, node, "value_a");
- set_input_value(bnode, 1, node, "value_b");
+ map_input_socket(socket_map, bnode, 0, node, "value_a");
+ map_input_socket(socket_map, bnode, 1, node, "value_b");
+ map_output_socket(socket_map, bnode, 0, node, "value");
+ break;
+ }
+ }
+ }
+ else if (bvm::string(type) == "ObjectVectorMathNode") {
+ int mode = RNA_enum_get(&ptr, "mode");
+ switch (mode) {
+ case 0: {
+ bvm::NodeInstance *node = graph.add_node("ADD_FLOAT3", bnode->name);
+ map_input_socket(socket_map, bnode, 0, node, "value_a");
+ map_input_socket(socket_map, bnode, 1, node, "value_b");
+ map_output_socket(socket_map, bnode, 0, node, "value");
+ break;
+ }
+ case 1: {
+ bvm::NodeInstance *node = graph.add_node("SUB_FLOAT3", bnode->name);
+ map_input_socket(socket_map, bnode, 0, node, "value_a");
+ map_input_socket(socket_map, bnode, 1, node, "value_b");
+ map_output_socket(socket_map, bnode, 0, node, "value");
break;
}
}
@@ -204,8 +243,14 @@ static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
if (!(blink->flag & NODE_LINK_VALID))
continue;
- graph.add_link(blink->fromnode->name, blink->fromsock->name,
- blink->tonode->name, blink->tosock->name);
+ SocketMap::const_iterator it_from = socket_map.find(bSocketPair(blink->fromnode, blink->fromsock));
+ SocketMap::const_iterator it_to = socket_map.find(bSocketPair(blink->tonode, blink->tosock));
+ if (it_from != socket_map.end() && it_to != socket_map.end()) {
+ SocketPair from_pair = it_from->second;
+ SocketPair to_pair = it_to->second;
+ graph.add_link(from_pair.first, from_pair.second,
+ to_pair.first, to_pair.second);
+ }
}
#else
// XXX TESTING
More information about the Bf-blender-cvs
mailing list