[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