[Bf-blender-cvs] [5d8036c6759] functions: access position and normal directly in Closest surface hook node

Jacques Lucke noreply at git.blender.org
Wed Dec 11 16:05:55 CET 2019


Commit: 5d8036c6759cca021e3617b9350250dd5addef66
Author: Jacques Lucke
Date:   Wed Dec 11 15:50:06 2019 +0100
Branches: functions
https://developer.blender.org/rB5d8036c6759cca021e3617b9350250dd5addef66

access position and normal directly in Closest surface hook node

===================================================================

M	release/scripts/startup/nodes/function_nodes/object_mesh.py
M	source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
M	source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc

===================================================================

diff --git a/release/scripts/startup/nodes/function_nodes/object_mesh.py b/release/scripts/startup/nodes/function_nodes/object_mesh.py
index 3c5864ec5d2..33b602f5232 100644
--- a/release/scripts/startup/nodes/function_nodes/object_mesh.py
+++ b/release/scripts/startup/nodes/function_nodes/object_mesh.py
@@ -30,7 +30,11 @@ class ClosestLocationOnObjectNode(bpy.types.Node, FunctionNode):
     def declaration(self, builder: NodeBuilder):
         builder.vectorized_input("object", "use_list__object", "Object", "Objects", "Object")
         builder.vectorized_input("position", "use_list__position", "Position", "Positions", "Vector")
-        builder.vectorized_output("closest_hook", ["use_list__object", "use_list__position"], "Closest Hook", "Closest Hooks", "Surface Hook")
+
+        vectorize_props = ["use_list__object", "use_list__position"]
+        builder.vectorized_output("closest_hook", vectorize_props, "Closest Hook", "Closest Hooks", "Surface Hook")
+        builder.vectorized_output("closest_position", vectorize_props, "Closest Position", "Closest Positions", "Vector")
+        builder.vectorized_output("closest_normal", vectorize_props, "Closest Normal", "Closest Normals", "Vector")
 
 
 class GetPositionOnSurfaceNode(bpy.types.Node, FunctionNode):
diff --git a/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h b/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
index 746106da54e..061446e1561 100644
--- a/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
+++ b/source/blender/functions/intern/inlined_tree_multi_function_network/builder.h
@@ -382,7 +382,6 @@ class VNodeMFNetworkBuilder {
 
   void set_matching_fn(const MultiFunction &fn);
 
- private:
   const MultiFunction &get_vectorized_function(const MultiFunction &base_function,
                                                ArrayRef<const char *> is_vectorized_prop_names);
 };
diff --git a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
index 52ba9d3b61e..0ead4e34143 100644
--- a/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
+++ b/source/blender/functions/intern/inlined_tree_multi_function_network/mappings_nodes.cc
@@ -408,8 +408,42 @@ static void INSERT_get_particle_attribute(VNodeMFNetworkBuilder &builder)
 
 static void INSERT_closest_surface_hook_on_object(VNodeMFNetworkBuilder &builder)
 {
-  builder.set_vectorized_constructed_matching_fn<MF_ClosestSurfaceHookOnObject>(
-      {"use_list__object", "use_list__position"});
+  const MultiFunction &main_fn = builder.construct_fn<MF_ClosestSurfaceHookOnObject>();
+  const MultiFunction &position_fn = builder.construct_fn<MF_GetPositionOnSurface>();
+  const MultiFunction &normal_fn = builder.construct_fn<MF_GetNormalOnSurface>();
+
+  const MultiFunction &vectorized_main_fn = builder.get_vectorized_function(
+      main_fn, {"use_list__object", "use_list__position"});
+
+  InlinedTreeMFNetworkBuilder &network_builder = builder.network_builder();
+
+  MFBuilderFunctionNode *main_node, *position_node, *normal_node;
+
+  if (&main_fn == &vectorized_main_fn) {
+    main_node = &network_builder.add_function(main_fn);
+    position_node = &network_builder.add_function(position_fn);
+    normal_node = &network_builder.add_function(normal_fn);
+  }
+  else {
+    std::array<bool, 1> input_is_vectorized = {true};
+    const MultiFunction &vectorized_position_fn = builder.construct_fn<MF_SimpleVectorize>(
+        position_fn, input_is_vectorized);
+    const MultiFunction &vectorized_normal_fn = builder.construct_fn<MF_SimpleVectorize>(
+        normal_fn, input_is_vectorized);
+
+    main_node = &network_builder.add_function(vectorized_main_fn);
+    position_node = &network_builder.add_function(vectorized_position_fn);
+    normal_node = &network_builder.add_function(vectorized_normal_fn);
+  }
+
+  network_builder.add_link(main_node->output(0), position_node->input(0));
+  network_builder.add_link(main_node->output(0), normal_node->input(0));
+
+  const XNode &xnode = builder.xnode();
+  network_builder.map_sockets(xnode.inputs(), main_node->inputs());
+  network_builder.map_sockets(xnode.output(0), main_node->output(0));
+  network_builder.map_sockets(xnode.output(1), position_node->output(0));
+  network_builder.map_sockets(xnode.output(2), normal_node->output(0));
 }
 
 static void INSERT_clamp_float(VNodeMFNetworkBuilder &builder)



More information about the Bf-blender-cvs mailing list