diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-12-23 08:04:03 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-12-23 08:04:03 +0300 |
commit | 9282d305bdc56522543129436db1e8a5d19cf39f (patch) | |
tree | b6d0cdcc7dd3f4113cf9e4f9813c40f44d29746e /source/blender/nodes/shader/nodes/node_shader_math.c | |
parent | de724a258eda45d1fed2b2176006c3b2df8abea2 (diff) | |
parent | 646a96bf8edc211a06f3df652101c265ee166e8d (diff) |
Merge branch 'master' into texture_nodes_refactortexture_nodes_refactor
Conflicts:
source/blender/nodes/texture/nodes/node_texture_math.c
Diffstat (limited to 'source/blender/nodes/shader/nodes/node_shader_math.c')
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_math.c | 89 |
1 files changed, 49 insertions, 40 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c index dc5971909d2..be2e3dcd311 100644 --- a/source/blender/nodes/shader/nodes/node_shader_math.c +++ b/source/blender/nodes/shader/nodes/node_shader_math.c @@ -54,16 +54,16 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode switch (node->custom1) { - case 0: /* Add */ + case NODE_MATH_ADD: r = a + b; break; - case 1: /* Subtract */ + case NODE_MATH_SUB: r = a - b; break; - case 2: /* Multiply */ + case NODE_MATH_MUL: r = a * b; break; - case 3: /* Divide */ + case NODE_MATH_DIVIDE: { if (b == 0) /* We don't want to divide by zero. */ r = 0.0; @@ -71,7 +71,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = a / b; break; } - case 4: /* Sine */ + case NODE_MATH_SIN: { if (in[0]->hasinput || !in[1]->hasinput) /* This one only takes one input, so we've got to choose. */ r = sinf(a); @@ -79,7 +79,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = sinf(b); break; } - case 5: /* Cosine */ + case NODE_MATH_COS: { if (in[0]->hasinput || !in[1]->hasinput) /* This one only takes one input, so we've got to choose. */ r = cosf(a); @@ -87,7 +87,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = cosf(b); break; } - case 6: /* Tangent */ + case NODE_MATH_TAN: { if (in[0]->hasinput || !in[1]->hasinput) /* This one only takes one input, so we've got to choose. */ r = tanf(a); @@ -95,7 +95,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = tanf(b); break; } - case 7: /* Arc-Sine */ + case NODE_MATH_ASIN: { if (in[0]->hasinput || !in[1]->hasinput) { /* This one only takes one input, so we've got to choose. */ /* Can't do the impossible... */ @@ -113,7 +113,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode } break; } - case 8: /* Arc-Cosine */ + case NODE_MATH_ACOS: { if (in[0]->hasinput || !in[1]->hasinput) { /* This one only takes one input, so we've got to choose. */ /* Can't do the impossible... */ @@ -131,7 +131,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode } break; } - case 9: /* Arc-Tangent */ + case NODE_MATH_ATAN: { if (in[0]->hasinput || !in[1]->hasinput) /* This one only takes one input, so we've got to choose. */ r = atan(a); @@ -139,7 +139,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = atan(b); break; } - case 10: /* Power */ + case NODE_MATH_POW: { /* Only raise negative numbers by full integers */ if (a >= 0) { @@ -159,7 +159,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode break; } - case 11: /* Logarithm */ + case NODE_MATH_LOG: { /* Don't want any imaginary numbers... */ if (a > 0 && b > 0) @@ -168,7 +168,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = 0.0; break; } - case 12: /* Minimum */ + case NODE_MATH_MIN: { if (a < b) r = a; @@ -176,7 +176,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = b; break; } - case 13: /* Maximum */ + case NODE_MATH_MAX: { if (a > b) r = a; @@ -184,7 +184,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = b; break; } - case 14: /* Round */ + case NODE_MATH_ROUND: { if (in[0]->hasinput || !in[1]->hasinput) /* This one only takes one input, so we've got to choose. */ r = (a < 0) ? (int)(a - 0.5f) : (int)(a + 0.5f); @@ -192,7 +192,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = (b < 0) ? (int)(b - 0.5f) : (int)(b + 0.5f); break; } - case 15: /* Less Than */ + case NODE_MATH_LESS: { if (a < b) r = 1.0f; @@ -200,7 +200,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = 0.0f; break; } - case 16: /* Greater Than */ + case NODE_MATH_GREATER: { if (a > b) r = 1.0f; @@ -208,7 +208,7 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = 0.0f; break; } - case 17: /* Modulo */ + case NODE_MATH_MOD: { if (b == 0.0f) r = 0.0f; @@ -216,13 +216,15 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode r = fmod(a, b); break; } - case 18: /* Absolute */ + case NODE_MATH_ABS: { r = fabsf(a); break; } } - + if (node->custom2 & SHD_MATH_CLAMP) { + CLAMP(r, 0.0f, 1.0f); + } out[0]->vec[0] = r; } @@ -231,29 +233,30 @@ static int gpu_shader_math(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED( static const char *names[] = {"math_add", "math_subtract", "math_multiply", "math_divide", "math_sine", "math_cosine", "math_tangent", "math_asin", "math_acos", "math_atan", "math_pow", "math_log", "math_min", "math_max", - "math_round", "math_less_than", "math_greater_than", "math_modulo", "math_absolute"}; + "math_round", "math_less_than", "math_greater_than", "math_modulo", "math_abs"}; switch (node->custom1) { - case 0: - case 1: - case 2: - case 3: - case 10: - case 11: - case 12: - case 13: - case 15: - case 16: - case 17: + case NODE_MATH_ADD: + case NODE_MATH_SUB: + case NODE_MATH_MUL: + case NODE_MATH_DIVIDE: + case NODE_MATH_POW: + case NODE_MATH_LOG: + case NODE_MATH_MIN: + case NODE_MATH_MAX: + case NODE_MATH_LESS: + case NODE_MATH_GREATER: + case NODE_MATH_MOD: GPU_stack_link(mat, names[node->custom1], in, out); break; - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 14: + case NODE_MATH_SIN: + case NODE_MATH_COS: + case NODE_MATH_TAN: + case NODE_MATH_ASIN: + case NODE_MATH_ACOS: + case NODE_MATH_ATAN: + case NODE_MATH_ROUND: + case NODE_MATH_ABS: if (in[0].hasinput || !in[1].hasinput) { /* use only first item and terminator */ GPUNodeStack tmp_in[2]; @@ -272,7 +275,13 @@ static int gpu_shader_math(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED( default: return 0; } - + + if (node->custom2 & SHD_MATH_CLAMP) { + float min[3] = {0.0f, 0.0f, 0.0f}; + float max[3] = {1.0f, 1.0f, 1.0f}; + GPU_link(mat, "clamp_val", out[0].link, GPU_uniform(min), GPU_uniform(max), &out[0].link); + } + return 1; } |