[Bf-blender-cvs] [94d4cde7a4a] soc-2019-cycles-procedural: Refactor and clean up Vector Math Cycles code.

OmarSquircleArt noreply at git.blender.org
Fri Aug 2 15:45:29 CEST 2019


Commit: 94d4cde7a4a626f41549de8820e7c2efdc872bab
Author: OmarSquircleArt
Date:   Fri Aug 2 15:46:04 2019 +0200
Branches: soc-2019-cycles-procedural
https://developer.blender.org/rB94d4cde7a4a626f41549de8820e7c2efdc872bab

Refactor and clean up Vector Math Cycles code.

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

M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/kernel/shaders/node_vector_math.osl
M	intern/cycles/kernel/svm/svm_math.h
M	intern/cycles/kernel/svm/svm_math_util.h
M	intern/cycles/kernel/svm/svm_types.h
M	intern/cycles/render/constant_fold.cpp
M	intern/cycles/render/constant_fold.h
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	intern/cycles/test/render_graph_finalize_test.cpp

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

diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index c3ac0bfdbf1..5678f08af51 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -312,7 +312,7 @@ static ShaderNode *add_node(Scene *scene,
   else if (b_node.is_a(&RNA_ShaderNodeVectorMath)) {
     BL::ShaderNodeVectorMath b_vector_math_node(b_node);
     VectorMathNode *vmath = new VectorMathNode();
-    vmath->type = (NodeVectorMath)b_vector_math_node.operation();
+    vmath->type = (NodeVectorMathType)b_vector_math_node.operation();
     node = vmath;
   }
   else if (b_node.is_a(&RNA_ShaderNodeVectorTransform)) {
diff --git a/intern/cycles/kernel/shaders/node_vector_math.osl b/intern/cycles/kernel/shaders/node_vector_math.osl
index 4f04558c802..496cb22cf54 100644
--- a/intern/cycles/kernel/shaders/node_vector_math.osl
+++ b/intern/cycles/kernel/shaders/node_vector_math.osl
@@ -42,64 +42,67 @@ vector snap(vector a, vector b)
 }
 
 shader node_vector_math(string type = "add",
-                        vector Vector1 = vector(0.0, 0.0, 0.0),
-                        vector Vector2 = vector(0.0, 0.0, 0.0),
-                        float Factor = 1.0,
+                        vector A = vector(0.0, 0.0, 0.0),
+                        vector B = vector(0.0, 0.0, 0.0),
+                        float Scale = 1.0,
                         output float Value = 0.0,
                         output vector Vector = vector(0.0, 0.0, 0.0))
 {
   if (type == "add") {
-    Vector = Vector1 + Vector2;
+    Vector = A + B;
   }
   else if (type == "subtract") {
-    Vector = Vector1 - Vector2;
+    Vector = A - B;
   }
   else if (type == "multiply") {
-    Vector = Vector1 * Vector2;
+    Vector = A * B;
   }
   else if (type == "divide") {
-    Vector = safe_divide(Vector1, Vector2);
+    Vector = safe_divide(A, B);
   }
   else if (type == "cross_product") {
-    Vector = cross(Vector1, Vector2);
+    Vector = cross(A, B);
   }
   else if (type == "project") {
-    Vector = project(Vector1, Vector2);
+    Vector = project(A, B);
   }
   else if (type == "reflect") {
-    Vector = reflect(Vector1, Vector2);
+    Vector = reflect(A, B);
   }
   else if (type == "average") {
-    Vector = normalize(Vector1 + Vector2);
+    Vector = normalize(A + B);
   }
   else if (type == "dot_product") {
-    Value = dot(Vector1, Vector2);
+    Value = dot(A, B);
   }
   else if (type == "distance") {
-    Value = distance(Vector1, Vector2);
+    Value = distance(A, B);
   }
   else if (type == "length") {
-    Value = length(Vector1);
+    Value = length(A);
   }
   else if (type == "scale") {
-    Vector = Vector1 * Factor;
+    Vector = A * Scale;
   }
   else if (type == "normalize") {
-    Vector = normalize(Vector1);
+    Vector = normalize(A);
   }
   else if (type == "snap") {
-    Vector = snap(Vector1, Vector2);
+    Vector = snap(A, B);
   }
   else if (type == "modulo") {
-    Vector = mod(Vector1, Vector2);
+    Vector = mod(A, B);
   }
   else if (type == "absolute") {
-    Vector = abs(Vector1);
+    Vector = abs(A);
   }
   else if (type == "minimum") {
-    Vector = min(Vector1, Vector2);
+    Vector = min(A, B);
   }
   else if (type == "maximum") {
-    Vector = max(Vector1, Vector2);
+    Vector = max(A, B);
+  }
+  else {
+    warning("%s", "Unknown vector math operator!");
   }
 }
diff --git a/intern/cycles/kernel/svm/svm_math.h b/intern/cycles/kernel/svm/svm_math.h
index f5f80da5357..e570f1840af 100644
--- a/intern/cycles/kernel/svm/svm_math.h
+++ b/intern/cycles/kernel/svm/svm_math.h
@@ -38,21 +38,19 @@ ccl_device void svm_node_math(KernelGlobals *kg,
 ccl_device void svm_node_vector_math(KernelGlobals *kg,
                                      ShaderData *sd,
                                      float *stack,
-                                     uint itype,
-                                     uint v1_offset,
-                                     uint v2_offset,
+                                     uint type,
+                                     uint a_offset,
+                                     uint b_offset,
                                      int *offset)
 {
   uint4 node1 = read_node(kg, offset);
+  float3 a = stack_load_float3(stack, a_offset);
+  float3 b = stack_load_float3(stack, b_offset);
+  float scale = stack_load_float(stack, node1.y);
 
-  NodeVectorMath type = (NodeVectorMath)itype;
-  float3 v1 = stack_load_float3(stack, v1_offset);
-  float3 v2 = stack_load_float3(stack, v2_offset);
-  float fac = stack_load_float(stack, node1.y);
   float f;
   float3 v;
-
-  svm_vector_math(&f, &v, type, v1, v2, fac);
+  svm_vector_math(&f, &v, (NodeVectorMathType)type, a, b, scale);
 
   if (stack_valid(node1.z))
     stack_store_float(stack, node1.z, f);
diff --git a/intern/cycles/kernel/svm/svm_math_util.h b/intern/cycles/kernel/svm/svm_math_util.h
index 17a40223f68..9ba1e31b1d7 100644
--- a/intern/cycles/kernel/svm/svm_math_util.h
+++ b/intern/cycles/kernel/svm/svm_math_util.h
@@ -17,88 +17,68 @@
 CCL_NAMESPACE_BEGIN
 
 ccl_device void svm_vector_math(
-    float *Fac, float3 *Vector, NodeVectorMath type, float3 Vector1, float3 Vector2, float Factor)
+    float *value, float3 *vector, NodeVectorMathType type, float3 a, float3 b, float scale)
 {
   switch (type) {
     case NODE_VECTOR_MATH_ADD:
-      *Vector = Vector1 + Vector2;
-      *Fac = 0.0f;
+      *vector = a + b;
       break;
     case NODE_VECTOR_MATH_SUBTRACT:
-      *Vector = Vector1 - Vector2;
-      *Fac = 0.0f;
+      *vector = a - b;
       break;
     case NODE_VECTOR_MATH_MULTIPLY:
-      *Vector = Vector1 * Vector2;
-      *Fac = 0.0f;
+      *vector = a * b;
       break;
     case NODE_VECTOR_MATH_DIVIDE:
-      *Vector = safe_divide_float3_float3(Vector1, Vector2);
-      *Fac = 0.0f;
+      *vector = safe_divide_float3_float3(a, b);
       break;
     case NODE_VECTOR_MATH_CROSS_PRODUCT:
-      *Vector = cross(Vector1, Vector2);
-      *Fac = 0.0f;
+      *vector = cross(a, b);
       break;
     case NODE_VECTOR_MATH_PROJECT:
-      *Vector = project(Vector1, Vector2);
-      *Fac = 0.0f;
+      *vector = project(a, b);
       break;
     case NODE_VECTOR_MATH_REFLECT:
-      *Vector = reflect(Vector1, Vector2);
-      *Fac = 0.0f;
+      *vector = reflect(a, b);
       break;
     case NODE_VECTOR_MATH_AVERAGE:
-      *Vector = safe_normalize(Vector1 + Vector2);
-      *Fac = 0.0f;
+      *vector = safe_normalize(a + b);
       break;
     case NODE_VECTOR_MATH_DOT_PRODUCT:
-      *Vector = make_float3(0.0f, 0.0f, 0.0f);
-      *Fac = dot(Vector1, Vector2);
+      *value = dot(a, b);
       break;
     case NODE_VECTOR_MATH_DISTANCE:
-      *Vector = make_float3(0.0f, 0.0f, 0.0f);
-      *Fac = len(Vector1 - Vector2);
+      *value = len(a - b);
       break;
     case NODE_VECTOR_MATH_LENGTH:
-      *Vector = make_float3(0.0f, 0.0f, 0.0f);
-      *Fac = len(Vector1);
+      *value = len(a);
       break;
     case NODE_VECTOR_MATH_SCALE:
-      *Vector = Vector1 * Factor;
-      *Fac = 0.0f;
+      *vector = a * scale;
       break;
     case NODE_VECTOR_MATH_NORMALIZE:
-      *Vector = safe_normalize(Vector1);
-      *Fac = 0.0f;
+      *vector = safe_normalize(a);
       break;
     case NODE_VECTOR_MATH_SNAP:
-      *Vector = make_float3(floorf(safe_divide(Vector1.x, Vector2.x)) * Vector2.x,
-                            floorf(safe_divide(Vector1.y, Vector2.y)) * Vector2.y,
-                            floorf(safe_divide(Vector1.z, Vector2.z)) * Vector2.z);
-      *Fac = 0.0f;
+      *vector = make_float3(floorf(safe_divide(a.x, b.x)) * b.x,
+                            floorf(safe_divide(a.y, b.y)) * b.y,
+                            floorf(safe_divide(a.z, b.z)) * b.z);
       break;
     case NODE_VECTOR_MATH_MODULO:
-      *Vector = make_float3(safe_modulo(Vector1.x, Vector2.x),
-                            safe_modulo(Vector1.y, Vector2.y),
-                            safe_modulo(Vector1.z, Vector2.z));
-      *Fac = 0.0f;
+      *vector = make_float3(safe_modulo(a.x, b.x), safe_modulo(a.y, b.y), safe_modulo(a.z, b.z));
       break;
     case NODE_VECTOR_MATH_ABSOLUTE:
-      *Vector = fabs(Vector1);
-      *Fac = 0.0f;
+      *vector = fabs(a);
       break;
     case NODE_VECTOR_MATH_MINIMUM:
-      *Vector = min(Vector1, Vector2);
-      *Fac = 0.0f;
+      *vector = min(a, b);
       break;
     case NODE_VECTOR_MATH_MAXIMUM:
-      *Vector = max(Vector1, Vector2);
-      *Fac = 0.0f;
+      *vector = max(a, b);
       break;
     default:
-      *Vector = make_float3(0.0f, 0.0f, 0.0f);
-      *Fac = 0.0f;
+      *vector = make_float3(0.0f, 0.0f, 0.0f);
+      *value = 0.0f;
   }
 }
 
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 69a4a8b599f..a4bedc8ad16 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -278,7 +278,7 @@ typedef enum NodeMathType {
   NODE_MATH_SQRT,
 } NodeMathType;
 
-typedef enum NodeVectorMath {
+typedef enum NodeVectorMathType {
   NODE_VECTOR_MATH_ADD,
   NODE_VECTOR_MATH_SUBTRACT,
   NODE_VECTOR_MATH_AVERAGE,
@@ -301,7 +301,7 @@ typedef enum NodeVectorMath {
   NODE_VECTOR_MATH_ABSOLUTE,
   NODE_VECTOR_MATH_MINIMUM,
   NODE_VECTOR_MATH_MAXIMUM,
-} NodeVectorMath;
+} NodeVectorMathType;
 
 typedef enum NodeMappingType {
   NODE_MAPPING_TYPE_POINT,
diff --git a/intern/cycles/render/constant_fold.cpp b/intern/cycles/render/constant_fold.cpp
index 217849dba85..fad290c567d 100644
--- a/intern/cycles/render/constant_fold.cpp
+++ b/intern/cycles/render/constant_fold.cpp
@@ -359,69 +359,69 @@ void ConstantFolder::fold_math(NodeMathType type) const
   }
 }
 
-void ConstantFolder::fold_vector_math(NodeVectorMath type) const
+void ConstantFolder::fold_vector_math(NodeVectorMathType type) const
 {
-  ShaderInput *vector1_in = node->input("Vector1");
-  ShaderInput *vector2_in = node->input("Vector2");
-  ShaderInput *factor_in = node->input("Factor");
+  ShaderInput *a_in = node->input("A");
+  ShaderInput *b_in = node->input("B");
+  ShaderInput *scale_in = node->input("Scale");
 
   switch (type) {
     case NODE_VECTOR_MATH_ADD:
       /* X + 0 == 0 + X == X */
-      if (is_zero(vector1

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list