[Bf-blender-cvs] [bc102827306] soc-2019-cycles-procedural: Refactor and clean up Math node.

OmarSquircleArt noreply at git.blender.org
Wed Jul 31 20:01:16 CEST 2019


Commit: bc10282730675747050628b721fbbdc98aba51ef
Author: OmarSquircleArt
Date:   Wed Jul 31 20:02:05 2019 +0200
Branches: soc-2019-cycles-procedural
https://developer.blender.org/rBbc10282730675747050628b721fbbdc98aba51ef

Refactor and clean up Math node.

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

M	intern/cycles/blender/blender_shader.cpp
M	intern/cycles/kernel/shaders/node_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/graph.cpp
M	intern/cycles/render/nodes.cpp
M	intern/cycles/render/nodes.h
M	intern/cycles/test/render_graph_finalize_test.cpp
M	source/blender/blenloader/intern/versioning_cycles.c
M	source/blender/compositor/nodes/COM_MathNode.cpp
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/makesrna/intern/rna_nodetree.c
M	source/blender/nodes/shader/nodes/node_shader_math.c
M	source/blender/nodes/texture/nodes/node_texture_math.c

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

diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 564564d5bad..c3ac0bfdbf1 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -306,7 +306,7 @@ static ShaderNode *add_node(Scene *scene,
   else if (b_node.is_a(&RNA_ShaderNodeMath)) {
     BL::ShaderNodeMath b_math_node(b_node);
     MathNode *math = new MathNode();
-    math->type = (NodeMath)b_math_node.operation();
+    math->type = (NodeMathType)b_math_node.operation();
     node = math;
   }
   else if (b_node.is_a(&RNA_ShaderNodeVectorMath)) {
diff --git a/intern/cycles/kernel/shaders/node_math.osl b/intern/cycles/kernel/shaders/node_math.osl
index a2c6255948c..f8c95a7b664 100644
--- a/intern/cycles/kernel/shaders/node_math.osl
+++ b/intern/cycles/kernel/shaders/node_math.osl
@@ -17,102 +17,79 @@
 #include "stdosl.h"
 
 float safe_divide(float a, float b)
-{
-  float result;
-
-  if (b == 0.0)
-    result = 0.0;
-  else
-    result = a / b;
-
-  return result;
+{ 
+  return (b != 0.0) ? a / b : 0.0;
 }
 
 float safe_modulo(float a, float b)
 {
-  float result;
-
-  if (b == 0.0)
-    result = 0.0;
-  else
-    result = fmod(a, b);
-
-  return result;
+  return (b != 0.0) ? fmod(a, b) : 0.0;
 }
 
 float safe_sqrt(float a)
 {
-  float result;
-
-  if (a > 0.0)
-    result = sqrt(a);
-  else
-    result = 0.0;
-
-  return result;
+  return (a > 0.0) ? sqrt(a) : 0.0;
 }
 
 float safe_log(float a, float b)
 {
-  if (a < 0.0 || b < 0.0)
-    return 0.0;
-
-  return log(a) / log(b);
+  return (a > 0.0 && b > 0.0) ? log(a) / log(b) : 0.0;
 }
 
 shader node_math(string type = "add",
-                 float Value1 = 0.0,
-                 float Value2 = 0.0,
-                 output float Value = 0.0)
+                 float A = 0.5,
+                 float B = 0.5,
+                 output float Result = 0.0)
 {
-  /* OSL asin, acos, pow check for values that could give rise to nan */
-
+  /* OSL asin, acos, pow check for values that could give rise to nan. */
   if (type == "add")
-    Value = Value1 + Value2;
+    Result = A + B;
   else if (type == "subtract")
-    Value = Value1 - Value2;
+    Result = A - B;
   else if (type == "multiply")
-    Value = Value1 * Value2;
+    Result = A * B;
   else if (type == "divide")
-    Value = safe_divide(Value1, Value2);
-  else if (type == "sine")
-    Value = sin(Value1);
-  else if (type == "cosine")
-    Value = cos(Value1);
-  else if (type == "tangent")
-    Value = tan(Value1);
-  else if (type == "arcsine")
-    Value = asin(Value1);
-  else if (type == "arccosine")
-    Value = acos(Value1);
-  else if (type == "arctangent")
-    Value = atan(Value1);
+    Result = safe_divide(A, B);
   else if (type == "power")
-    Value = pow(Value1, Value2);
+    Result = pow(A, B);
   else if (type == "logarithm")
-    Value = safe_log(Value1, Value2);
+    Result = safe_log(A, B);
+  else if (type == "sqrt")
+    Result = safe_sqrt(A);
+  else if (type == "absolute")
+    Result = fabs(A);
   else if (type == "minimum")
-    Value = min(Value1, Value2);
+    Result = min(A, B);
   else if (type == "maximum")
-    Value = max(Value1, Value2);
-  else if (type == "round")
-    Value = floor(Value1 + 0.5);
+    Result = max(A, B);
   else if (type == "less_than")
-    Value = Value1 < Value2;
+    Result = A < B;
   else if (type == "greater_than")
-    Value = Value1 > Value2;
-  else if (type == "modulo")
-    Value = safe_modulo(Value1, Value2);
-  else if (type == "absolute")
-    Value = fabs(Value1);
-  else if (type == "arctan2")
-    Value = atan2(Value1, Value2);
+    Result = A > B;
+  else if (type == "round")
+    Result = floor(A + 0.5);
   else if (type == "floor")
-    Value = floor(Value1);
+    Result = floor(A);
   else if (type == "ceil")
-    Value = ceil(Value1);
-  else if (type == "fract")
-    Value = Value1 - floor(Value1);
-  else if (type == "sqrt")
-    Value = safe_sqrt(Value1);
+    Result = ceil(A);
+  else if (type == "fraction")
+    Result = A - floor(A);
+  else if (type == "modulo")
+    Result = safe_modulo(A, B);
+  else if (type == "sine")
+    Result = sin(A);
+  else if (type == "cosine")
+    Result = cos(A);
+  else if (type == "tangent")
+    Result = tan(A);
+  else if (type == "arcsine")
+    Result = asin(A);
+  else if (type == "arccosine")
+    Result = acos(A);
+  else if (type == "arctangent")
+    Result = atan(A);
+  else if (type == "arctan2")
+    Result = atan2(A, B);
+  else
+    Result = 0.0;
 }
diff --git a/intern/cycles/kernel/svm/svm_math.h b/intern/cycles/kernel/svm/svm_math.h
index 643b1f78a0d..f5f80da5357 100644
--- a/intern/cycles/kernel/svm/svm_math.h
+++ b/intern/cycles/kernel/svm/svm_math.h
@@ -21,15 +21,14 @@ CCL_NAMESPACE_BEGIN
 ccl_device void svm_node_math(KernelGlobals *kg,
                               ShaderData *sd,
                               float *stack,
-                              uint itype,
-                              uint f1_offset,
-                              uint f2_offset,
+                              uint type,
+                              uint a_offset,
+                              uint b_offset,
                               int *offset)
 {
-  NodeMath type = (NodeMath)itype;
-  float f1 = stack_load_float(stack, f1_offset);
-  float f2 = stack_load_float(stack, f2_offset);
-  float f = svm_math(type, f1, f2);
+  float a = stack_load_float(stack, a_offset);
+  float b = stack_load_float(stack, b_offset);
+  float f = svm_math((NodeMathType)type, a, b);
 
   uint4 node1 = read_node(kg, offset);
 
diff --git a/intern/cycles/kernel/svm/svm_math_util.h b/intern/cycles/kernel/svm/svm_math_util.h
index 91a0bc64fd1..9e8c1a7178e 100644
--- a/intern/cycles/kernel/svm/svm_math_util.h
+++ b/intern/cycles/kernel/svm/svm_math_util.h
@@ -102,62 +102,86 @@ ccl_device void svm_vector_math(
   }
 }
 
-ccl_device float svm_math(NodeMath type, float Fac1, float Fac2)
+ccl_device float svm_math(NodeMathType type, float a, float b)
 {
-  float Fac;
-
-  if (type == NODE_MATH_ADD)
-    Fac = Fac1 + Fac2;
-  else if (type == NODE_MATH_SUBTRACT)
-    Fac = Fac1 - Fac2;
-  else if (type == NODE_MATH_MULTIPLY)
-    Fac = Fac1 * Fac2;
-  else if (type == NODE_MATH_DIVIDE)
-    Fac = safe_divide(Fac1, Fac2);
-  else if (type == NODE_MATH_SINE)
-    Fac = sinf(Fac1);
-  else if (type == NODE_MATH_COSINE)
-    Fac = cosf(Fac1);
-  else if (type == NODE_MATH_TANGENT)
-    Fac = tanf(Fac1);
-  else if (type == NODE_MATH_ARCSINE)
-    Fac = safe_asinf(Fac1);
-  else if (type == NODE_MATH_ARCCOSINE)
-    Fac = safe_acosf(Fac1);
-  else if (type == NODE_MATH_ARCTANGENT)
-    Fac = atanf(Fac1);
-  else if (type == NODE_MATH_POWER)
-    Fac = safe_powf(Fac1, Fac2);
-  else if (type == NODE_MATH_LOGARITHM)
-    Fac = safe_logf(Fac1, Fac2);
-  else if (type == NODE_MATH_MINIMUM)
-    Fac = fminf(Fac1, Fac2);
-  else if (type == NODE_MATH_MAXIMUM)
-    Fac = fmaxf(Fac1, Fac2);
-  else if (type == NODE_MATH_ROUND)
-    Fac = floorf(Fac1 + 0.5f);
-  else if (type == NODE_MATH_LESS_THAN)
-    Fac = Fac1 < Fac2;
-  else if (type == NODE_MATH_GREATER_THAN)
-    Fac = Fac1 > Fac2;
-  else if (type == NODE_MATH_MODULO)
-    Fac = safe_modulo(Fac1, Fac2);
-  else if (type == NODE_MATH_ABSOLUTE)
-    Fac = fabsf(Fac1);
-  else if (type == NODE_MATH_ARCTAN2)
-    Fac = atan2f(Fac1, Fac2);
-  else if (type == NODE_MATH_FLOOR)
-    Fac = floorf(Fac1);
-  else if (type == NODE_MATH_CEIL)
-    Fac = ceilf(Fac1);
-  else if (type == NODE_MATH_FRACT)
-    Fac = Fac1 - floorf(Fac1);
-  else if (type == NODE_MATH_SQRT)
-    Fac = safe_sqrtf(Fac1);
-  else
-    Fac = 0.0f;
-
-  return Fac;
+  float result;
+  switch (type) {
+    case NODE_MATH_ADD:
+      result = a + b;
+      break;
+    case NODE_MATH_SUBTRACT:
+      result = a - b;
+      break;
+    case NODE_MATH_MULTIPLY:
+      result = a * b;
+      break;
+    case NODE_MATH_DIVIDE:
+      result = safe_divide(a, b);
+      break;
+    case NODE_MATH_POWER:
+      result = safe_powf(a, b);
+      break;
+    case NODE_MATH_LOGARITHM:
+      result = safe_logf(a, b);
+      break;
+    case NODE_MATH_SQRT:
+      result = safe_sqrtf(a);
+      break;
+    case NODE_MATH_ABSOLUTE:
+      result = fabsf(a);
+      break;
+    case NODE_MATH_MINIMUM:
+      result = fminf(a, b);
+      break;
+    case NODE_MATH_MAXIMUM:
+      result = fmaxf(a, b);
+      break;
+    case NODE_MATH_LESS_THAN:
+      result = a < b;
+      break;
+    case NODE_MATH_GREATER_THAN:
+      result = a > b;
+      break;
+    case NODE_MATH_ROUND:
+      result = floorf(a + 0.5f);
+      break;
+    case NODE_MATH_FLOOR:
+      result = floorf(a);
+      break;
+    case NODE_MATH_CEIL:
+      result = ceilf(a);
+      break;
+    case NODE_MATH_FRACTION:
+      result = a - floorf(a);
+      break;
+    case NODE_MATH_MODULO:
+      result = safe_modulo(a, b);
+      break;
+    case NODE_MATH_SINE:
+      result = sinf(a);
+      break;
+    case NODE_MATH_COSINE:
+      result = cosf(a);
+      break;
+    case NODE_MATH_TANGENT:
+      result = tanf(a);
+      break;
+    case NODE_MATH_ARCSINE:
+      result = safe_asinf(a);
+      break;
+    case NODE_MATH_ARCCOSINE:
+      result = safe_acosf(a);
+      break;
+    case NODE_MATH_ARCTANGENT:
+      result = atanf(a);
+      break;
+    case NODE_MATH_ARCTAN2:
+      result = atan2f(a, b);
+      break;
+    default:
+      result = 0.0f;
+  }
+  return result;
 }
 
 /* Calculate color in range 800..12000 using an approximation
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index 98e0ceaeb0e..afa12a49035 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -251,7 +251,7 @@ typedef enum NodeMix {
   NODE_MIX_CLAMP /* used for the clamp UI option */
 } NodeMix;
 
-typedef enum NodeMath {
+typedef enum NodeMathType {
   NODE_MATH_ADD,
   NODE_MATH_SUBTRACT,
   NODE_MATH_MULTIPLY,
@@ -274,9 +274,9 @@ typedef enum NodeMath {
   NODE_MATH_ARCTAN2,
   NODE_MATH_FLOOR,
   NODE_MATH_CEIL,
-  NODE_MATH_FRACT,
+  NODE_MATH_FRACTION,
   NODE_MATH_SQRT,
-} NodeMath;
+} NodeMathType;
 
 typedef enum NodeVectorMath {
   NODE_VECTOR_MATH_ADD,
dif

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list