[Bf-blender-cvs] [fa7c300edc7] functions-experimental-refactor: more vector math

Jacques Lucke noreply at git.blender.org
Fri Nov 8 18:31:10 CET 2019


Commit: fa7c300edc79944fc63a0a3e643b18f53f346b2b
Author: Jacques Lucke
Date:   Fri Nov 8 16:27:58 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBfa7c300edc79944fc63a0a3e643b18f53f346b2b

more vector math

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

M	release/scripts/startup/nodes/function_nodes/float_math.py
M	source/blender/blenlib/BLI_math_cxx.h
M	source/blender/functions/intern/vtree_multi_function_network/mappings_nodes.cc

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

diff --git a/release/scripts/startup/nodes/function_nodes/float_math.py b/release/scripts/startup/nodes/function_nodes/float_math.py
index e6cd2affd6b..3906e9b2371 100644
--- a/release/scripts/startup/nodes/function_nodes/float_math.py
+++ b/release/scripts/startup/nodes/function_nodes/float_math.py
@@ -69,3 +69,7 @@ AddVectorsNode = create_variadic_math_node("Vector", "fn_AddVectorsNode", "Add V
 SubtractVectorsNode = create_two_inputs_math_node("Vector", "fn_SubtractVectorsNode", "Subtract Vectors")
 MultiplyVectorsNode = create_variadic_math_node("Vector", "fn_MultiplyVectorsNode", "Multiply Vectors")
 DivideVectorsNode = create_two_inputs_math_node("Vector", "fn_DivideVectorsNode", "Divide Vectors")
+
+VectorCrossProductNode = create_two_inputs_math_node("Vector", "fn_VectorCrossProductNode", "Cross Product")
+VectorReflectNode = create_two_inputs_math_node("Vector", "fn_ReflectVectorNode", "Reflect Vector")
+VectorProjectNode = create_two_inputs_math_node("Vector", "fn_ProjectVectorNode", "Project Vector")
diff --git a/source/blender/blenlib/BLI_math_cxx.h b/source/blender/blenlib/BLI_math_cxx.h
index 925cb09cbcd..59f1ddd44ec 100644
--- a/source/blender/blenlib/BLI_math_cxx.h
+++ b/source/blender/blenlib/BLI_math_cxx.h
@@ -263,6 +263,20 @@ struct float3 {
     return a.x * b.x + a.y * b.y + a.z * b.z;
   }
 
+  static float3 cross_high_precision(float3 a, float3 b)
+  {
+    float3 result;
+    cross_v3_v3v3_hi_prec(result, a, b);
+    return result;
+  }
+
+  static float3 project(float3 a, float3 b)
+  {
+    float3 result;
+    project_v3_v3v3(result, a, b);
+    return result;
+  }
+
   static float distance(float3 a, float3 b)
   {
     return (a - b).length();
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 b853ef199a5..f5ee47c53e8 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
@@ -9,12 +9,6 @@ namespace FN {
 
 using BLI::float3;
 
-static void INSERT_vector_math(VTreeMFNetworkBuilder &builder, const VNode &vnode)
-{
-  const MultiFunction &fn = builder.construct_fn<FN::MF_AddFloat3s>();
-  builder.add_function(fn, {0, 1}, {2}, vnode);
-}
-
 static const MultiFunction &get_vectorized_function(
     VTreeMFNetworkBuilder &builder,
     const MultiFunction &base_function,
@@ -39,15 +33,6 @@ static const MultiFunction &get_vectorized_function(
   }
 }
 
-static void INSERT_float_math(VTreeMFNetworkBuilder &builder, const VNode &vnode)
-{
-  const MultiFunction &base_fn = builder.construct_fn<FN::MF_AddFloats>();
-  const MultiFunction &fn = get_vectorized_function(
-      builder, base_fn, vnode.rna(), {"use_list__a", "use_list__b"});
-
-  builder.add_function(fn, {0, 1}, {2}, vnode);
-}
-
 static void INSERT_combine_vector(VTreeMFNetworkBuilder &builder, const VNode &vnode)
 {
   const MultiFunction &base_fn = builder.construct_fn<FN::MF_CombineVector>();
@@ -341,10 +326,28 @@ static void INSERT_divide_vectors(VTreeMFNetworkBuilder &builder, const VNode &v
   insert_two_inputs_math_function<float3, float3::safe_divide>(builder, vnode);
 }
 
+static float3 vector_reflect_func_cb(float3 a, float3 b)
+{
+  return a.reflected(b.normalized());
+}
+
+static void INSERT_vector_cross_product(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+  insert_two_inputs_math_function<float3, float3::cross_high_precision>(builder, vnode);
+}
+
+static void INSERT_reflect_vector(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+  insert_two_inputs_math_function<float3, vector_reflect_func_cb>(builder, vnode);
+}
+
+static void INSERT_project_vector(VTreeMFNetworkBuilder &builder, const VNode &vnode)
+{
+  insert_two_inputs_math_function<float3, float3::project>(builder, vnode);
+}
+
 void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
 {
-  mappings.vnode_inserters.add_new("fn_FloatMathNode", INSERT_float_math);
-  mappings.vnode_inserters.add_new("fn_VectorMathNode", INSERT_vector_math);
   mappings.vnode_inserters.add_new("fn_CombineVectorNode", INSERT_combine_vector);
   mappings.vnode_inserters.add_new("fn_SeparateVectorNode", INSERT_separate_vector);
   mappings.vnode_inserters.add_new("fn_ListLengthNode", INSERT_list_length);
@@ -374,6 +377,10 @@ void add_vtree_node_mapping_info(VTreeMultiFunctionMappings &mappings)
   mappings.vnode_inserters.add_new("fn_SubtractVectorsNode", INSERT_subtract_vectors);
   mappings.vnode_inserters.add_new("fn_MultiplyVectorsNode", INSERT_multiply_vectors);
   mappings.vnode_inserters.add_new("fn_DivideVectorsNode", INSERT_divide_vectors);
+
+  mappings.vnode_inserters.add_new("fn_VectorCrossProductNode", INSERT_vector_cross_product);
+  mappings.vnode_inserters.add_new("fn_ReflectVectorNode", INSERT_reflect_vector);
+  mappings.vnode_inserters.add_new("fn_ProjectVectorNode", INSERT_project_vector);
 }
 
 };  // namespace FN



More information about the Bf-blender-cvs mailing list