[Bf-blender-cvs] [4e61bfbb154] functions: initial working function groups
Jacques Lucke
noreply at git.blender.org
Thu Nov 14 13:59:20 CET 2019
Commit: 4e61bfbb154099629813d5084c3d447dce75601c
Author: Jacques Lucke
Date: Thu Nov 14 13:38:39 2019 +0100
Branches: functions
https://developer.blender.org/rB4e61bfbb154099629813d5084c3d447dce75601c
initial working function groups
===================================================================
M release/scripts/startup/bl_operators/modifiers.py
M release/scripts/startup/nodes/node_operators.py
M source/blender/functions/FN_vtree_multi_function_network.h
M source/blender/functions/intern/vtree_multi_function_network/builder.h
M source/blender/functions/intern/vtree_multi_function_network/generate.cc
M source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
===================================================================
diff --git a/release/scripts/startup/bl_operators/modifiers.py b/release/scripts/startup/bl_operators/modifiers.py
index ff91dff2521..be3f2e6b6fe 100644
--- a/release/scripts/startup/bl_operators/modifiers.py
+++ b/release/scripts/startup/bl_operators/modifiers.py
@@ -31,9 +31,9 @@ class NewDeformationFunction(bpy.types.Operator, ModifierOperator):
("Vector", "New Position"),
])
- input_node = tree.get_input_node()
- output_node = tree.get_output_node()
- tree.new_link(input_node.outputs[0], output_node.inputs[0])
+ tree.new_link(
+ tree.get_input_nodes()[0].outputs[0],
+ tree.get_output_nodes()[0].inputs[0])
mod.function_tree = tree
return {'FINISHED'}
diff --git a/release/scripts/startup/nodes/node_operators.py b/release/scripts/startup/nodes/node_operators.py
index 315ea42f859..ff49adde147 100644
--- a/release/scripts/startup/nodes/node_operators.py
+++ b/release/scripts/startup/nodes/node_operators.py
@@ -101,10 +101,21 @@ def new_function_tree(name, inputs, outputs):
return output_node
tree = bpy.data.node_groups.new(name, "FunctionTree")
- input_node = create_input(tree)
- output_node = create_output(tree)
- input_node.location.x = -200 - input_node.width
- output_node.location.x = 200
+
+ for i, (data_type, input_name) in enumerate(inputs):
+ input_node = tree.nodes.new("fn_GroupDataInputNode")
+ input_node.sort_index = i
+ input_node.input_name = input_name
+ input_node.data_type = data_type
+ input_node.location = (-200, -i * 130)
+
+ for i, (data_type, output_name) in enumerate(outputs):
+ output_node = tree.nodes.new("fn_GroupDataOutputNode")
+ output_node.sort_index = i
+ output_node.output_name = output_name
+ output_node.data_type = data_type
+ output_node.location = (200, -i * 130)
+
tree.sync()
return tree
diff --git a/source/blender/functions/FN_vtree_multi_function_network.h b/source/blender/functions/FN_vtree_multi_function_network.h
index 1ec48338d1f..590bec29ff5 100644
--- a/source/blender/functions/FN_vtree_multi_function_network.h
+++ b/source/blender/functions/FN_vtree_multi_function_network.h
@@ -144,6 +144,13 @@ class VTreeMFNetwork {
return socket;
}
+ const MFOutputSocket &lookup_dummy_socket(const VOutputSocket &vsocket) const
+ {
+ const MFOutputSocket &socket = this->lookup_socket(vsocket);
+ BLI_assert(socket.node().is_dummy());
+ return socket;
+ }
+
const MFOutputSocket &lookup_socket(const VOutputSocket &vsocket) const
{
return m_socket_map.lookup_socket(vsocket);
diff --git a/source/blender/functions/intern/vtree_multi_function_network/builder.h b/source/blender/functions/intern/vtree_multi_function_network/builder.h
index f3cd1c62cd6..ee31a3c0b67 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/vtree_multi_function_network/builder.h
@@ -36,6 +36,11 @@ class VTreeMFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
return m_vtree;
}
+ ResourceCollector &resources()
+ {
+ return m_resources;
+ }
+
MFBuilderFunctionNode &add_function(const MultiFunction &function,
ArrayRef<uint> input_param_indices,
ArrayRef<uint> output_param_indices);
diff --git a/source/blender/functions/intern/vtree_multi_function_network/generate.cc b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
index 5c409831128..c454fd730a8 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/generate.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/generate.cc
@@ -3,6 +3,7 @@
#include "BLI_math_cxx.h"
#include "BLI_string_map.h"
+#include "BLI_string.h"
#include "mappings.h"
#include "builder.h"
@@ -124,28 +125,39 @@ std::unique_ptr<VTreeMFNetwork> generate_vtree_multi_function_network(const Virt
return vtree_network;
}
+static bool cmp_group_interface_nodes(const VNode *a, const VNode *b)
+{
+ int a_index = RNA_int_get(a->rna(), "sort_index");
+ int b_index = RNA_int_get(b->rna(), "sort_index");
+ if (a_index < b_index) {
+ return true;
+ }
+
+ /* TODO: Match sorting with Python. */
+ return BLI_strcasecmp(a->name().data(), b->name().data()) == -1;
+}
+
std::unique_ptr<MF_EvaluateNetwork> generate_vtree_multi_function(const VirtualNodeTree &vtree,
ResourceCollector &resources)
{
std::unique_ptr<VTreeMFNetwork> network = generate_vtree_multi_function_network(vtree,
resources);
- auto input_vnodes = vtree.nodes_with_idname("fn_FunctionInputNode");
- auto output_vnodes = vtree.nodes_with_idname("fn_FunctionOutputNode");
+ Vector<const VNode *> input_vnodes = vtree.nodes_with_idname("fn_GroupDataInputNode");
+ Vector<const VNode *> output_vnodes = vtree.nodes_with_idname("fn_GroupDataOutputNode");
+
+ std::sort(input_vnodes.begin(), input_vnodes.end(), cmp_group_interface_nodes);
+ std::sort(output_vnodes.begin(), output_vnodes.end(), cmp_group_interface_nodes);
Vector<const MFOutputSocket *> function_inputs;
Vector<const MFInputSocket *> function_outputs;
- if (input_vnodes.size() == 1) {
- auto vsockets = input_vnodes.first()->outputs().drop_back(1);
- function_inputs.append_n_times(nullptr, vsockets.size());
- network->lookup_dummy_sockets(vsockets, function_inputs);
+ for (const VNode *vnode : input_vnodes) {
+ function_inputs.append(&network->lookup_dummy_socket(vnode->output(0)));
}
- if (output_vnodes.size() == 1) {
- auto vsockets = output_vnodes.first()->inputs().drop_back(1);
- function_outputs.append_n_times(nullptr, vsockets.size());
- network->lookup_dummy_sockets(vsockets, function_outputs);
+ for (const VNode *vnode : output_vnodes) {
+ function_outputs.append(&network->lookup_dummy_socket(vnode->input(0)));
}
auto function = BLI::make_unique<MF_EvaluateNetwork>(std::move(function_inputs),
diff --git a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
index 85a9b65e606..4c0e1b5ceb4 100644
--- a/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc
@@ -2,6 +2,7 @@
#include "builder.h"
#include "FN_multi_functions.h"
+#include "FN_vtree_multi_function_network_generation.h"
#include "BLI_math_cxx.h"
@@ -521,6 +522,29 @@ static void INSERT_map_range(VTreeMFNetworkBuilder &builder, const VNode &vnode)
}
}
+static void INSERT_group_node(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+ bNodeTree *btree = (bNodeTree *)RNA_pointer_get(vnode.rna(), "node_group").data;
+ if (btree == nullptr) {
+ BLI_assert(vnode.inputs().size() == 0);
+ BLI_assert(vnode.outputs().size() == 0);
+ return;
+ }
+
+ BKE::VirtualNodeTreeBuilder vtree_builder;
+ vtree_builder.add_all_of_node_tree(btree);
+ auto vtree = vtree_builder.build();
+
+ std::unique_ptr<MF_EvaluateNetwork> fn = generate_vtree_multi_function(*vtree,
+ builder.resources());
+ builder.add_function(*fn,
+ IndexRange(vnode.inputs().size()).as_array_ref(),
+ IndexRange(vnode.inputs().size(), vnode.outputs().size()).as_array_ref(),
+ vnode);
+ builder.resources().add(std::move(vtree), "VTree for Group");
+ builder.resources().add(std::move(fn), "Function for Group");
+}
+
void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
{
mappings.vnode_inserters.add_new("fn_CombineColorNode", INSERT_combine_color);
@@ -543,6 +567,7 @@ void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
mappings.vnode_inserters.add_new("fn_ClosestPointOnObjectNode", INSERT_closest_point_on_object);
mappings.vnode_inserters.add_new("fn_MapRangeNode", INSERT_map_range);
mappings.vnode_inserters.add_new("fn_FloatClampNode", INSERT_clamp_float);
+ mappings.vnode_inserters.add_new("fn_GroupNode", INSERT_group_node);
mappings.vnode_inserters.add_new("fn_AddFloatsNode", INSERT_add_floats);
mappings.vnode_inserters.add_new("fn_MultiplyFloatsNode", INSERT_multiply_floats);
More information about the Bf-blender-cvs
mailing list