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)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to