[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