[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