[Bf-blender-cvs] [e0ebaf8f3c0] functions: Add multiply and divide to vector math node

Eitan noreply at git.blender.org
Mon Aug 12 16:25:14 CEST 2019


Commit: e0ebaf8f3c076b1258e8cbfee6d1bacd6325bf2c
Author: Eitan
Date:   Mon Aug 12 16:21:26 2019 +0200
Branches: functions
https://developer.blender.org/rBe0ebaf8f3c076b1258e8cbfee6d1bacd6325bf2c

Add multiply and divide to vector math node

Differential Revision: https://developer.blender.org/D5430

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

M	release/scripts/startup/nodes/function_nodes/vector.py
M	source/blender/blenlib/BLI_math.hpp
M	source/blender/functions/backends/cpp/list.hpp
M	source/blender/functions/backends/llvm/builder.hpp
M	source/blender/functions/frontends/data_flow_nodes/mappings/node_inserters.cpp
M	source/blender/functions/functions/vectors.cpp
M	source/blender/functions/functions/vectors.hpp

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

diff --git a/release/scripts/startup/nodes/function_nodes/vector.py b/release/scripts/startup/nodes/function_nodes/vector.py
index 1bc333ab557..609256759fd 100644
--- a/release/scripts/startup/nodes/function_nodes/vector.py
+++ b/release/scripts/startup/nodes/function_nodes/vector.py
@@ -10,9 +10,11 @@ class VectorMathNode(bpy.types.Node, FunctionNode):
 
     operation_items = [
         ("ADD", "Add", "", "", 1),
-        ("SUB", "Subtract", "", "", 2),
-        ("CROSS", "Cross Product", "", "", 3),
-        ("REFLECT", "Reflect", "", "", 4),
+        ("SUB", "Subtract", "", "", 2),
+        ("MUL", "Multiply", "", "", 3),
+        ("DIV", "Divide", "", "", 4),
+        ("CROSS", "Cross Product", "", "", 5),
+        ("REFLECT", "Reflect", "", "", 6),
     ]
 
     operation: EnumProperty(
diff --git a/source/blender/blenlib/BLI_math.hpp b/source/blender/blenlib/BLI_math.hpp
index aa226ea3538..6161d031c89 100644
--- a/source/blender/blenlib/BLI_math.hpp
+++ b/source/blender/blenlib/BLI_math.hpp
@@ -139,6 +139,15 @@ struct float3 {
     return result;
   }
 
+  static float3 safe_divide(const float3 a, const float3 b)
+  {
+    float3 result;
+    result.x = (b.x == 0.0f) ? 0.0f : a.x / b.x;
+    result.y = (b.y == 0.0f) ? 0.0f : a.y / b.y;
+    result.z = (b.z == 0.0f) ? 0.0f : a.z / b.z;
+    return result;
+  }
+
   void invert()
   {
     x = -x;
@@ -202,6 +211,12 @@ struct float3 {
     return b * a;
   }
 
+  friend float3 operator/(float3 a, float3 b)
+  {
+    BLI_assert(!b.is_zero());
+    return {a.x / b.x, a.y / b.y, a.z / b.z};
+  }
+
   friend float3 operator/(float3 a, float b)
   {
     BLI_assert(b != 0);
diff --git a/source/blender/functions/backends/cpp/list.hpp b/source/blender/functions/backends/cpp/list.hpp
index 240b66dac4a..357cc35164b 100644
--- a/source/blender/functions/backends/cpp/list.hpp
+++ b/source/blender/functions/backends/cpp/list.hpp
@@ -75,7 +75,6 @@ class List : public RefCounter {
 
   void get__dynamic_copy_to_tuple(uint element_index, Tuple &tuple, uint tuple_index)
   {
-    BLI_assert(this->is_mutable());
     BLI_assert(&tuple.meta().type_info(tuple_index) == m_type_info);
     BLI_assert(element_index < m_size);
     void *src = POINTER_OFFSET(m_storage, element_index * m_type_info->size());
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index ceaeed01258..5a17201bd23 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -281,16 +281,21 @@ class CodeBuilder {
     return m_builder.CreateFAdd(a, b);
   }
 
-  llvm::Value *CreateFSub(llvm::Value *a, llvm::Value *b)
-  {
-    return m_builder.CreateFSub(a, b);
-  }
-
+  llvm::Value *CreateFSub(llvm::Value *a, llvm::Value *b)
+  {
+    return m_builder.CreateFSub(a, b);
+  }
+
   llvm::Value *CreateFMul(llvm::Value *a, llvm::Value *b)
   {
     return m_builder.CreateFMul(a, b);
   }
 
+  llvm::Value *CreateFDiv(llvm::Value *a, llvm::Value *b)
+  {
+    return m_builder.CreateFDiv(a, b);
+  }
+
   llvm::Value *CreateURem(llvm::Value *a, llvm::Value *b)
   {
     return m_builder.CreateURem(a, b);
diff --git a/source/blender/functions/frontends/data_flow_nodes/mappings/node_inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/mappings/node_inserters.cpp
index bffe7ae131e..997048e8279 100644
--- a/source/blender/functions/frontends/data_flow_nodes/mappings/node_inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/mappings/node_inserters.cpp
@@ -116,10 +116,14 @@ static SharedFunction &get_vector_math_function(int operation)
     case 1:
       return Functions::GET_FN_add_vectors();
     case 2:
-      return Functions::GET_FN_sub_vectors();
-    case 3:
+      return Functions::GET_FN_sub_vectors();
+    case 3:
+      return Functions::GET_FN_mul_vectors();
+    case 4:
+      return Functions::GET_FN_div_vectors();
+    case 5:
       return Functions::GET_FN_cross_vectors();
-    case 4:
+    case 6:
       return Functions::GET_FN_reflect_vectors();
     default:
       BLI_assert(false);
diff --git a/source/blender/functions/functions/vectors.cpp b/source/blender/functions/functions/vectors.cpp
index 1b8e8e06ade..9457c864f2d 100644
--- a/source/blender/functions/functions/vectors.cpp
+++ b/source/blender/functions/functions/vectors.cpp
@@ -123,107 +123,150 @@ BLI_LAZY_INIT(SharedFunction, GET_FN_add_vectors)
   return fn;
 }
 
-class SubVectors : public TupleCallBody {
-  void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
-  {
-    float3 a = fn_in.get<float3>(0);
-    float3 b = fn_in.get<float3>(1);
-    fn_out.set<float3>(0, a - b);
-  }
-};
-
-class SubVectorsGen : public LLVMBuildIRBody {
-  void build_ir(CodeBuilder &builder,
-                CodeInterface &interface,
-                const BuildIRSettings &UNUSED(settings)) const override
-  {
-    llvm::Value *a = interface.get_input(0);
-    llvm::Value *b = interface.get_input(1);
-    llvm::Value *result = builder.CreateFSub(a, b);
-    interface.set_output(0, result);
-  }
-};
-
-BLI_LAZY_INIT(SharedFunction, GET_FN_sub_vectors)
-{
-  auto fn = get_math_function__two_inputs("Subtract Vectors");
-  fn->add_body<SubVectors>();
-  fn->add_body<SubVectorsGen>();
-  return fn;
-}
-
-class CrossProductVectors : public TupleCallBody {
-  void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
-  {
-    float3 a = fn_in.get<float3>(0);
-    float3 b = fn_in.get<float3>(1);
-    float3 result;
-    cross_v3_v3v3_hi_prec(result, a, b);
-    fn_out.set<float3>(0, result);
-  }
-};
-
-class CrossProductVectorsGen : public LLVMBuildIRBody {
-  void build_ir(CodeBuilder &builder,
-                CodeInterface &interface,
-                const BuildIRSettings &UNUSED(settings)) const override
-  {
-    auto a = interface.get_input(0);
-    auto b = interface.get_input(1);
-
-    auto a_x = builder.CreateExtractElement(a, 0);
-    auto a_y = builder.CreateExtractElement(a, 1);
-    auto a_z = builder.CreateExtractElement(a, 2);
-
-    auto b_x = builder.CreateExtractElement(b, 0);
-    auto b_y = builder.CreateExtractElement(b, 1);
-    auto b_z = builder.CreateExtractElement(b, 2);
-
-    auto mul_ay_bz = builder.CreateFMul(a_y, b_z);
-    auto mul_az_by = builder.CreateFMul(a_z, b_y);
-    auto result_x = builder.CreateFSub(mul_ay_bz, mul_az_by);
-
-    auto mul_az_bx = builder.CreateFMul(a_z, b_x);
-    auto mul_ax_bz = builder.CreateFMul(a_x, b_z);
-    auto result_y = builder.CreateFSub(mul_az_bx, mul_ax_bz);
-
-    auto mul_ax_by = builder.CreateFMul(a_x, b_y);
-    auto mul_ay_bx = builder.CreateFMul(a_y, b_x);
-    auto result_z = builder.CreateFSub(mul_ax_by, mul_ay_bx);
-
-    auto result = static_cast<llvm::Value *>(builder.getUndef(a->getType()));
-
-    result = builder.CreateInsertElement(result, result_x, 0);
-    result = builder.CreateInsertElement(result, result_y, 1);
-    result = builder.CreateInsertElement(result, result_z, 2);
-
-    interface.set_output(0, result);
-  }
-};
-
-BLI_LAZY_INIT(SharedFunction, GET_FN_cross_vectors)
-{
-  auto fn = get_math_function__two_inputs("Cross Product");
-  fn->add_body<CrossProductVectors>();
-  fn->add_body<CrossProductVectorsGen>();
-  return fn;
-}
-
-class ReflectVectors : public TupleCallBody {
-  void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
-  {
-    float3 a = fn_in.get<float3>(0);
-    float3 b = fn_in.get<float3>(1);
-    fn_out.set<float3>(0, a.reflected(b.normalized()));
-  }
-};
-
-BLI_LAZY_INIT(SharedFunction, GET_FN_reflect_vectors)
-{
-  auto fn = get_math_function__two_inputs("Reflect Vectors");
-  fn->add_body<ReflectVectors>();
-  return fn;
-}
-
+class SubVectors : public TupleCallBody {
+  void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
+  {
+    float3 a = fn_in.get<float3>(0);
+    float3 b = fn_in.get<float3>(1);
+    fn_out.set<float3>(0, a - b);
+  }
+};
+
+class SubVectorsGen : public LLVMBuildIRBody {
+  void build_ir(CodeBuilder &builder,
+                CodeInterface &interface,
+                const BuildIRSettings &UNUSED(settings)) const override
+  {
+    llvm::Value *a = interface.get_input(0);
+    llvm::Value *b = interface.get_input(1);
+    llvm::Value *result = builder.CreateFSub(a, b);
+    interface.set_output(0, result);
+  }
+};
+
+BLI_LAZY_INIT(SharedFunction, GET_FN_sub_vectors)
+{
+  auto fn = get_math_function__two_inputs("Subtract Vectors");
+  fn->add_body<SubVectors>();
+  fn->add_body<SubVectorsGen>();
+  return fn;
+}
+class MultiplyVectors : public TupleCallBody {
+  void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
+  {
+    float3 a = fn_in.get<float3>(0);
+    float3 b = fn_in.get<float3>(1);
+    fn_out.set<float3>(0, a * b);
+  }
+};
+
+class MultiplyVectorsGen : public LLVMBuildIRBody {
+  void build_ir(CodeBuilder &builder,
+                CodeInterface &interface,
+                const BuildIRSettings &UNUSED(settings)) const override
+  {
+    llvm::Value *a = interface.get_input(0);
+    llvm::Value *b = interface.get_input(1);
+    llvm::Value *result = builder.CreateFMul(a, b);
+    interface.set_output(0, result);
+  }
+};
+
+BLI_LAZY_INIT(SharedFunction, GET_FN_mul_vectors)
+{
+  auto fn = get_math_function__two_inputs("Multiply Vectors");
+  fn->add_body<MultiplyVectors>();
+  fn->add_body<MultiplyVectorsGen>();
+  return fn;
+}
+
+class DivideVectors : public TupleCallBody {
+  void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
+  {
+    float3 a = fn_in.get<float3>(0);
+    float3 b = fn_in.get<float3>(1);
+    fn_out.set<float3>(0, float3::safe_divide(a, b));
+  }
+};
+
+BLI_LAZY_INIT(SharedFunction, GET_FN_div_vectors)
+{
+  auto fn = get_math_function__two_inputs("Divide Vectors");
+  fn->add_body<DivideVectors>();
+  return fn;
+}
+class CrossProductVectors : public TupleCallBody {
+  void call(Tuple &fn_in, Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
+  {
+    float3 a = fn_in.get<float3>(0);
+    float3 b = fn_in.get<float3>(1);
+    float3 result;
+    cross_v3_v3v3_hi_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list