[Bf-blender-cvs] [6d71136e4a5] functions: new vnode to multifunction mapping

Jacques Lucke noreply at git.blender.org
Thu Nov 21 15:19:40 CET 2019


Commit: 6d71136e4a5adcc5e5ed6764825f22aaa4df9fbc
Author: Jacques Lucke
Date:   Wed Nov 20 17:37:28 2019 +0100
Branches: functions
https://developer.blender.org/rB6d71136e4a5adcc5e5ed6764825f22aaa4df9fbc

new vnode to multifunction mapping

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

M	source/blender/functions/CMakeLists.txt
A	source/blender/functions/intern/vtree_multi_function/mappings.cc
A	source/blender/functions/intern/vtree_multi_function/mappings.h
A	source/blender/functions/intern/vtree_multi_function/vnode_multi_function_wrapper.h
A	source/blender/functions/intern/vtree_multi_function/vnode_multi_function_wrapper_builder.cc
A	source/blender/functions/intern/vtree_multi_function/vnode_multi_function_wrapper_builder.h
A	source/blender/functions/intern/vtree_multi_function/vsocket_multi_function_builder.h
A	source/blender/functions/intern/vtree_multi_function/vsocket_multi_function_data_types.h
A	source/blender/functions/intern/vtree_multi_function/vtree_multi_function.h
M	source/blender/modifiers/intern/MOD_functiondeform_cxx.cc

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

diff --git a/source/blender/functions/CMakeLists.txt b/source/blender/functions/CMakeLists.txt
index 5d83c907b38..2d2cacf1cc4 100644
--- a/source/blender/functions/CMakeLists.txt
+++ b/source/blender/functions/CMakeLists.txt
@@ -25,6 +25,8 @@ set(SRC
   intern/multi_functions/lists.cc
   intern/multi_functions/mixed.cc
   intern/multi_functions/network.cc
+  intern/vtree_multi_function/mappings.cc
+  intern/vtree_multi_function/vnode_multi_function_wrapper_builder.cc
   intern/vtree_multi_function_network/builder.cc
   intern/vtree_multi_function_network/generate.cc
   intern/vtree_multi_function_network/mappings_nodes.cc
@@ -63,6 +65,12 @@ set(SRC
   intern/multi_functions/lists.h
   intern/multi_functions/mixed.h
   intern/multi_functions/network.h
+  intern/vtree_multi_function/mappings.h
+  intern/vtree_multi_function/vnode_multi_function_wrapper_builder.h
+  intern/vtree_multi_function/vnode_multi_function_wrapper.h
+  intern/vtree_multi_function/vsocket_multi_function_builder.h
+  intern/vtree_multi_function/vsocket_multi_function_data_types.h
+  intern/vtree_multi_function/vtree_multi_function.h
   intern/vtree_multi_function_network/builder.h
   intern/vtree_multi_function_network/mappings.h
   intern/cpp_types.h
diff --git a/source/blender/functions/intern/vtree_multi_function/mappings.cc b/source/blender/functions/intern/vtree_multi_function/mappings.cc
new file mode 100644
index 00000000000..4bbce75aa27
--- /dev/null
+++ b/source/blender/functions/intern/vtree_multi_function/mappings.cc
@@ -0,0 +1,543 @@
+#include "BLI_lazy_init_cxx.h"
+#include "BLI_math_cxx.h"
+
+#include "RNA_access.h"
+
+#include "mappings.h"
+
+#include "vsocket_multi_function_builder.h"
+#include "vnode_multi_function_wrapper_builder.h"
+
+namespace FN {
+
+using BLI::float3;
+
+static void BUILD_vector_socket(VSocketMFBuilder &builder)
+{
+  BLI::float3 value;
+  RNA_float_get_array(builder.vsocket().rna(), "value", value);
+  builder.build_constant_value_fn(value);
+}
+
+static void BUILD_color_socket(VSocketMFBuilder &builder)
+{
+  BLI::rgba_f value;
+  RNA_float_get_array(builder.vsocket().rna(), "value", value);
+  builder.build_constant_value_fn(value);
+}
+
+static void BUILD_float_socket(VSocketMFBuilder &builder)
+{
+  float value = RNA_float_get(builder.vsocket().rna(), "value");
+  builder.build_constant_value_fn(value);
+}
+
+static void BUILD_bool_socket(VSocketMFBuilder &builder)
+{
+  bool value = RNA_boolean_get(builder.vsocket().rna(), "value");
+  builder.build_constant_value_fn(value);
+}
+
+static void BUILD_int_socket(VSocketMFBuilder &builder)
+{
+  int value = RNA_int_get(builder.vsocket().rna(), "value");
+  builder.build_constant_value_fn(value);
+}
+
+static void BUILD_object_socket(VSocketMFBuilder &builder)
+{
+  Object *value = (Object *)RNA_pointer_get(builder.vsocket().rna(), "value").data;
+  builder.build_constant_value_fn(value);
+}
+
+static void BUILD_text_socket(VSocketMFBuilder &builder)
+{
+  char *value = RNA_string_get_alloc(builder.vsocket().rna(), "value", nullptr, 0);
+  std::string text = value;
+  MEM_freeN(value);
+
+  builder.build_constant_value_fn(text);
+}
+
+template<typename T> static void BUILD_empty_list_socket(VSocketMFBuilder &builder)
+{
+  const MultiFunction &fn = builder.construct_fn<MF_EmptyList<T>>();
+  builder.set_fn(fn);
+}
+
+static void WRAP_combine_color(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_vectorized_constructed_matching_fn<MF_CombineColor>(
+      {"use_list__red", "use_list__green", "use_list__blue", "use_list__alpha"});
+}
+
+static void WRAP_separate_color(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_vectorized_constructed_matching_fn<MF_SeparateColor>({"use_list__color"});
+}
+
+static void WRAP_combine_vector(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_vectorized_constructed_matching_fn<MF_CombineVector>(
+      {"use_list__x", "use_list__y", "use_list__z"});
+}
+
+static void WRAP_separate_vector(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_vectorized_constructed_matching_fn<MF_SeparateVector>({"use_list__vector"});
+}
+
+static void WRAP_list_length(VNodeMFWrapperBuilder &builder)
+{
+  const CPPType &type = builder.cpp_type_from_property("active_type");
+  builder.set_constructed_matching_fn<MF_ListLength>(type);
+}
+
+static void WRAP_get_list_element(VNodeMFWrapperBuilder &builder)
+{
+  const CPPType &type = builder.cpp_type_from_property("active_type");
+  builder.set_constructed_matching_fn<MF_GetListElement>(type);
+}
+
+static void WRAP_pack_list(VNodeMFWrapperBuilder &builder)
+{
+  const CPPType &type = builder.cpp_type_from_property("active_type");
+  Vector<bool> list_states = builder.get_list_base_variadic_states("variadic");
+  builder.set_constructed_matching_fn<MF_PackList>(type, list_states);
+}
+
+static void WRAP_object_location(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_ObjectWorldLocation>();
+}
+
+static void WRAP_object_mesh_info(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_ObjectVertexPositions>();
+}
+
+static void WRAP_switch(VNodeMFWrapperBuilder &builder)
+{
+  MFDataType type = builder.data_type_from_property("data_type");
+  switch (type.category()) {
+    case MFDataType::Single: {
+      builder.set_constructed_matching_fn<MF_SwitchSingle>(type.type());
+      break;
+    }
+    case MFDataType::Vector: {
+      builder.set_constructed_matching_fn<MF_SwitchVector>(type.type());
+      break;
+    }
+  }
+}
+
+static void WRAP_text_length(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_TextLength>();
+}
+
+static void WRAP_vertex_info(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_ContextVertexPosition>();
+}
+
+static void WRAP_float_range(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_FloatRange>();
+}
+
+static void WRAP_time_info(VNodeMFWrapperBuilder &builder)
+{
+  builder.set_constructed_matching_fn<MF_ContextCurrentFrame>();
+}
+
+template<typename InT, typename OutT>
+static void build_math_fn(VNodeMFWrapperBuilder &builder, OutT (*func)(InT))
+{
+  auto fn =
+      [func](MFMask mask, VirtualListRef<InT> inputs, MutableArrayRef<OutT> outputs) -> void {
+    for (uint i : mask.indices()) {
+      new (&outputs[i]) OutT(func(inputs[i]));
+    }
+  };
+
+  builder.set_vectorized_constructed_matching_fn<MF_Custom_In1_Out1<InT, OutT>>(
+      {"use_list"}, builder.vnode().name(), fn);
+}
+
+template<typename InT1, typename InT2, typename OutT>
+static void build_math_fn(VNodeMFWrapperBuilder &builder, OutT (*func)(InT1, InT2))
+{
+  auto fn = [func](MFMask mask,
+                   VirtualListRef<InT1> inputs1,
+                   VirtualListRef<InT2> inputs2,
+                   MutableArrayRef<OutT> outputs) -> void {
+    for (uint i : mask.indices()) {
+      new (&outputs[i]) OutT(func(inputs1[i], inputs2[i]));
+    }
+  };
+
+  builder.set_vectorized_constructed_matching_fn<MF_Custom_In2_Out1<InT1, InT2, OutT>>(
+      {"use_list__a", "use_list__b"}, builder.vnode().name(), fn);
+}
+
+template<typename T>
+static void build_variadic_math_fn(VNodeMFWrapperBuilder &builder,
+                                   T (*func)(T, T),
+                                   T default_value)
+{
+  auto fn = [func](MFMask mask,
+                   VirtualListRef<T> inputs1,
+                   VirtualListRef<T> inputs2,
+                   MutableArrayRef<T> outputs) {
+    for (uint i : mask.indices()) {
+      outputs[i] = func(inputs1[i], inputs2[i]);
+    }
+  };
+
+  Vector<bool> list_states = builder.get_list_base_variadic_states("variadic");
+  if (list_states.size() == 0) {
+    builder.set_constructed_matching_fn<MF_ConstantValue<T>>(default_value);
+  }
+  else {
+    const MultiFunction &base_fn = builder.construct_fn<MF_VariadicMath<T>>(
+        builder.vnode().name(), list_states.size(), fn);
+    if (list_states.contains(true)) {
+      builder.set_constructed_matching_fn<MF_SimpleVectorize>(base_fn, list_states);
+    }
+    else {
+      builder.set_matching_fn(base_fn);
+    }
+  }
+}
+
+static void WRAP_add_floats(VNodeMFWrapperBuilder &builder)
+{
+  build_variadic_math_fn(
+      builder, +[](float a, float b) -> float { return a + b; }, 0.0f);
+}
+
+static void WRAP_multiply_floats(VNodeMFWrapperBuilder &builder)
+{
+  build_variadic_math_fn(
+      builder, +[](float a, float b) -> float { return a * b; }, 1.0f);
+}
+
+static void WRAP_minimum_floats(VNodeMFWrapperBuilder &builder)
+{
+  build_variadic_math_fn(
+      builder, +[](float a, float b) -> float { return std::min(a, b); }, 0.0f);
+}
+
+static void WRAP_maximum_floats(VNodeMFWrapperBuilder &builder)
+{
+  build_variadic_math_fn(
+      builder, +[](float a, float b) -> float { return std::max(a, b); }, 0.0f);
+}
+
+static void WRAP_subtract_floats(VNodeMFWrapperBuilder &builder)
+{
+  build_math_fn(
+      builder, +[](float a, float b) -> float { return a - b; });
+}
+
+static void WRAP_divide_floats(VNodeMFWrapperBuilder &builder)
+{
+  build_math_fn(
+      builder, +[](float a, float b) -> float { return (b != 0.0f) ? a / b : 0.0f; });
+}
+
+static void WRAP_power_floats(VNodeMFWrapperBuilder &builder)
+{
+  build_math_fn(
+      builder,
+      +[](float a, float b) -> float { return (a >= 0.0f) ? (float)std::pow(a, b) : 0.0f; });
+}
+
+static void WRAP_sqrt_float(VNodeMFWrapperBuilder &builder)
+{
+  build_math_fn(
+      builder, +[](float a) -> float { return (a >= 0.0f) ? (float)std::sqrt(a) : 0.0f; });
+}
+
+static void WRAP_abs_float(VNodeMFWrapperBuilder &builder)
+{
+  build_math_fn(
+      builder, +[](float a) -> float { return std::abs(a); });
+}
+
+static void WRAP_sine_float(VNodeMFWrapperBuilder &builder)
+{
+  build_math_fn(
+      builder, +[](float a) -> float { return std::sin(a); });
+}
+
+static void WRAP_cosine_float(VNodeMFWrapperBuilder &builder)
+{
+  build_math_fn(
+      builder, +[](float a) -> float { return std::cos(a); });
+}
+
+static void WRAP_add_vectors(VNodeMFWrapperBuilder &builder)
+{
+  build_variadic_math_fn(builder, +[](float3 a, float3 b) -> float3 { return a + b; }, {0, 0, 0});
+}
+
+static void WRAP_multiply_vectors(VNodeMFWrapperBuilder &builder)


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list