Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/nodes')
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_math.c39
-rw-r--r--source/blender/nodes/shader/nodes/node_shader_math.c37
-rw-r--r--source/blender/nodes/texture/nodes/node_texture_math.c141
3 files changed, 216 insertions, 1 deletions
diff --git a/source/blender/nodes/composite/nodes/node_composite_math.c b/source/blender/nodes/composite/nodes/node_composite_math.c
index 21a85b2168f..741c0e48806 100644
--- a/source/blender/nodes/composite/nodes/node_composite_math.c
+++ b/source/blender/nodes/composite/nodes/node_composite_math.c
@@ -27,10 +27,48 @@
static bNodeSocketTemplate cmp_node_math_in[] = {
{SOCK_FLOAT, 1, N_("Value"), 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
{SOCK_FLOAT, 1, N_("Value"), 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
+ {SOCK_FLOAT, 1, N_("Value"), 0.0f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
{-1, 0, ""}};
static bNodeSocketTemplate cmp_node_math_out[] = {{SOCK_FLOAT, 0, N_("Value")}, {-1, 0, ""}};
+static void node_shader_update_math(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ bNodeSocket *sock = BLI_findlink(&node->inputs, 1);
+ nodeSetSocketAvailability(sock,
+ !ELEM(node->custom1,
+ NODE_MATH_SQRT,
+ NODE_MATH_SIGN,
+ NODE_MATH_CEIL,
+ NODE_MATH_SINE,
+ NODE_MATH_ROUND,
+ NODE_MATH_FLOOR,
+ NODE_MATH_COSINE,
+ NODE_MATH_ARCSINE,
+ NODE_MATH_TANGENT,
+ NODE_MATH_ABSOLUTE,
+ NODE_MATH_RADIANS,
+ NODE_MATH_DEGREES,
+ NODE_MATH_FRACTION,
+ NODE_MATH_ARCCOSINE,
+ NODE_MATH_ARCTANGENT) &&
+ !ELEM(node->custom1,
+ NODE_MATH_INV_SQRT,
+ NODE_MATH_TRUNC,
+ NODE_MATH_EXPONENT,
+ NODE_MATH_COSH,
+ NODE_MATH_SINH,
+ NODE_MATH_TANH));
+ bNodeSocket *sock2 = BLI_findlink(&node->inputs, 2);
+ nodeSetSocketAvailability(sock2,
+ ELEM(node->custom1,
+ NODE_MATH_COMPARE,
+ NODE_MATH_MULTIPLY_ADD,
+ NODE_MATH_WRAP,
+ NODE_MATH_SMOOTH_MIN,
+ NODE_MATH_SMOOTH_MAX));
+}
+
void register_node_type_cmp_math(void)
{
static bNodeType ntype;
@@ -38,6 +76,7 @@ void register_node_type_cmp_math(void)
cmp_node_type_base(&ntype, CMP_NODE_MATH, "Math", NODE_CLASS_CONVERTOR, 0);
node_type_socket_templates(&ntype, cmp_node_math_in, cmp_node_math_out);
node_type_label(&ntype, node_math_label);
+ node_type_update(&ntype, node_shader_update_math);
nodeRegisterType(&ntype);
}
diff --git a/source/blender/nodes/shader/nodes/node_shader_math.c b/source/blender/nodes/shader/nodes/node_shader_math.c
index 0f1113920c9..5d9da7788ee 100644
--- a/source/blender/nodes/shader/nodes/node_shader_math.c
+++ b/source/blender/nodes/shader/nodes/node_shader_math.c
@@ -27,6 +27,7 @@
static bNodeSocketTemplate sh_node_math_in[] = {
{SOCK_FLOAT, 1, N_("Value"), 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
{SOCK_FLOAT, 1, N_("Value"), 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
+ {SOCK_FLOAT, 1, N_("Value"), 0.0f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE},
{-1, 0, ""}};
static bNodeSocketTemplate sh_node_math_out[] = {{SOCK_FLOAT, 0, N_("Value")}, {-1, 0, ""}};
@@ -42,26 +43,42 @@ static int gpu_shader_math(GPUMaterial *mat,
[NODE_MATH_SUBTRACT] = "math_subtract",
[NODE_MATH_MULTIPLY] = "math_multiply",
[NODE_MATH_DIVIDE] = "math_divide",
+ [NODE_MATH_MULTIPLY_ADD] = "math_multiply_add",
[NODE_MATH_POWER] = "math_power",
[NODE_MATH_LOGARITHM] = "math_logarithm",
+ [NODE_MATH_EXPONENT] = "math_exponent",
[NODE_MATH_SQRT] = "math_sqrt",
+ [NODE_MATH_INV_SQRT] = "math_inversesqrt",
[NODE_MATH_ABSOLUTE] = "math_absolute",
+ [NODE_MATH_RADIANS] = "math_radians",
+ [NODE_MATH_DEGREES] = "math_degrees",
[NODE_MATH_MINIMUM] = "math_minimum",
[NODE_MATH_MAXIMUM] = "math_maximum",
[NODE_MATH_LESS_THAN] = "math_less_than",
[NODE_MATH_GREATER_THAN] = "math_greater_than",
+ [NODE_MATH_SIGN] = "math_sign",
+ [NODE_MATH_COMPARE] = "math_compare",
+ [NODE_MATH_SMOOTH_MIN] = "math_smoothmin",
+ [NODE_MATH_SMOOTH_MAX] = "math_smoothmax",
[NODE_MATH_ROUND] = "math_round",
[NODE_MATH_FLOOR] = "math_floor",
[NODE_MATH_CEIL] = "math_ceil",
[NODE_MATH_FRACTION] = "math_fraction",
[NODE_MATH_MODULO] = "math_modulo",
+ [NODE_MATH_TRUNC] = "math_trunc",
+ [NODE_MATH_SNAP] = "math_snap",
+ [NODE_MATH_WRAP] = "math_wrap",
+ [NODE_MATH_PINGPONG] = "math_pingpong",
[NODE_MATH_SINE] = "math_sine",
[NODE_MATH_COSINE] = "math_cosine",
[NODE_MATH_TANGENT] = "math_tangent",
+ [NODE_MATH_SINH] = "math_sinh",
+ [NODE_MATH_COSH] = "math_cosh",
+ [NODE_MATH_TANH] = "math_tanh",
[NODE_MATH_ARCSINE] = "math_arcsine",
[NODE_MATH_ARCCOSINE] = "math_arccosine",
[NODE_MATH_ARCTANGENT] = "math_arctangent",
@@ -90,6 +107,7 @@ static void node_shader_update_math(bNodeTree *UNUSED(ntree), bNode *node)
nodeSetSocketAvailability(sock,
!ELEM(node->custom1,
NODE_MATH_SQRT,
+ NODE_MATH_SIGN,
NODE_MATH_CEIL,
NODE_MATH_SINE,
NODE_MATH_ROUND,
@@ -98,9 +116,26 @@ static void node_shader_update_math(bNodeTree *UNUSED(ntree), bNode *node)
NODE_MATH_ARCSINE,
NODE_MATH_TANGENT,
NODE_MATH_ABSOLUTE,
+ NODE_MATH_RADIANS,
+ NODE_MATH_DEGREES,
NODE_MATH_FRACTION,
NODE_MATH_ARCCOSINE,
- NODE_MATH_ARCTANGENT));
+ NODE_MATH_ARCTANGENT) &&
+ !ELEM(node->custom1,
+ NODE_MATH_INV_SQRT,
+ NODE_MATH_TRUNC,
+ NODE_MATH_EXPONENT,
+ NODE_MATH_COSH,
+ NODE_MATH_SINH,
+ NODE_MATH_TANH));
+ bNodeSocket *sock2 = BLI_findlink(&node->inputs, 2);
+ nodeSetSocketAvailability(sock2,
+ ELEM(node->custom1,
+ NODE_MATH_COMPARE,
+ NODE_MATH_MULTIPLY_ADD,
+ NODE_MATH_WRAP,
+ NODE_MATH_SMOOTH_MIN,
+ NODE_MATH_SMOOTH_MAX));
}
void register_node_type_sh_math(void)
diff --git a/source/blender/nodes/texture/nodes/node_texture_math.c b/source/blender/nodes/texture/nodes/node_texture_math.c
index b1d67a5a953..310300df204 100644
--- a/source/blender/nodes/texture/nodes/node_texture_math.c
+++ b/source/blender/nodes/texture/nodes/node_texture_math.c
@@ -28,6 +28,7 @@
static bNodeSocketTemplate inputs[] = {
{SOCK_FLOAT, 1, N_("Value"), 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{SOCK_FLOAT, 1, N_("Value"), 0.5f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
+ {SOCK_FLOAT, 1, N_("Value"), 0.0f, 0.5f, 0.5f, 1.0f, -100.0f, 100.0f, PROP_NONE},
{-1, 0, ""},
};
@@ -74,6 +75,18 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
*out = tanf(in0);
break;
}
+ case NODE_MATH_SINH: {
+ *out = sinhf(in0);
+ break;
+ }
+ case NODE_MATH_COSH: {
+ *out = coshf(in0);
+ break;
+ }
+ case NODE_MATH_TANH: {
+ *out = tanhf(in0);
+ break;
+ }
case NODE_MATH_ARCSINE: {
/* Can't do the impossible... */
if (in0 <= 1 && in0 >= -1) {
@@ -182,11 +195,31 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
break;
}
+ case NODE_MATH_RADIANS: {
+ *out = DEG2RADF(in0);
+ break;
+ }
+
+ case NODE_MATH_DEGREES: {
+ *out = RAD2DEGF(in0);
+ break;
+ }
+
case NODE_MATH_ARCTAN2: {
*out = atan2(in0, in1);
break;
}
+ case NODE_MATH_SIGN: {
+ *out = compatible_signf(in0);
+ break;
+ }
+
+ case NODE_MATH_EXPONENT: {
+ *out = expf(in0);
+ break;
+ }
+
case NODE_MATH_FLOOR: {
*out = floorf(in0);
break;
@@ -212,6 +245,76 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
break;
}
+ case NODE_MATH_INV_SQRT: {
+ if (in0 > 0.0f) {
+ *out = 1.0f / sqrtf(in0);
+ }
+ else {
+ *out = 0.0f;
+ }
+ break;
+ }
+
+ case NODE_MATH_TRUNC: {
+ if (in0 > 0.0f) {
+ *out = floorf(in0);
+ }
+ else {
+ *out = ceilf(in0);
+ }
+ break;
+ }
+
+ case NODE_MATH_SNAP: {
+ if (in1 == 0) {
+ *out = 0.0;
+ }
+ else {
+ *out = floorf(in0 / in1) * in1;
+ }
+ break;
+ }
+
+ case NODE_MATH_WRAP: {
+ float in2 = tex_input_value(in[2], p, thread);
+ *out = wrapf(in0, in1, in2);
+ break;
+ }
+
+ case NODE_MATH_PINGPONG: {
+ if (in1 == 0.0f) {
+ *out = 0.0f;
+ }
+ else {
+ *out = fabsf(fractf((in0 - in1) / (in1 * 2.0f)) * in1 * 2.0f - in1);
+ }
+ break;
+ }
+
+ case NODE_MATH_COMPARE: {
+ float in2 = tex_input_value(in[2], p, thread);
+ *out = (fabsf(in0 - in1) <= MAX2(in2, 1e-5f)) ? 1.0f : 0.0f;
+ break;
+ }
+
+ case NODE_MATH_MULTIPLY_ADD: {
+ float in2 = tex_input_value(in[2], p, thread);
+ *out = in0 * in1 + in2;
+ break;
+ }
+
+ case NODE_MATH_SMOOTH_MIN: {
+ float in2 = tex_input_value(in[2], p, thread);
+ *out = smoothminf(in0, in1, in2);
+ break;
+ }
+
+ case NODE_MATH_SMOOTH_MAX: {
+ float in2 = tex_input_value(in[2], p, thread);
+ *out = -smoothminf(-in0, -in1, in2);
+ break;
+ }
+
default: {
BLI_assert(0);
break;
@@ -233,6 +336,43 @@ static void exec(void *data,
tex_output(node, execdata, in, out[0], &valuefn, data);
}
+static void node_shader_update_math(bNodeTree *UNUSED(ntree), bNode *node)
+{
+ bNodeSocket *sock = BLI_findlink(&node->inputs, 1);
+ nodeSetSocketAvailability(sock,
+ !ELEM(node->custom1,
+ NODE_MATH_SQRT,
+ NODE_MATH_SIGN,
+ NODE_MATH_CEIL,
+ NODE_MATH_SINE,
+ NODE_MATH_ROUND,
+ NODE_MATH_FLOOR,
+ NODE_MATH_COSINE,
+ NODE_MATH_ARCSINE,
+ NODE_MATH_TANGENT,
+ NODE_MATH_ABSOLUTE,
+ NODE_MATH_RADIANS,
+ NODE_MATH_DEGREES,
+ NODE_MATH_FRACTION,
+ NODE_MATH_ARCCOSINE,
+ NODE_MATH_ARCTANGENT) &&
+ !ELEM(node->custom1,
+ NODE_MATH_INV_SQRT,
+ NODE_MATH_TRUNC,
+ NODE_MATH_EXPONENT,
+ NODE_MATH_COSH,
+ NODE_MATH_SINH,
+ NODE_MATH_TANH));
+ bNodeSocket *sock2 = BLI_findlink(&node->inputs, 2);
+ nodeSetSocketAvailability(sock2,
+ ELEM(node->custom1,
+ NODE_MATH_COMPARE,
+ NODE_MATH_MULTIPLY_ADD,
+ NODE_MATH_WRAP,
+ NODE_MATH_SMOOTH_MIN,
+ NODE_MATH_SMOOTH_MAX));
+}
+
void register_node_type_tex_math(void)
{
static bNodeType ntype;
@@ -242,6 +382,7 @@ void register_node_type_tex_math(void)
node_type_label(&ntype, node_math_label);
node_type_storage(&ntype, "", NULL, NULL);
node_type_exec(&ntype, NULL, NULL, exec);
+ node_type_update(&ntype, node_shader_update_math);
nodeRegisterType(&ntype);
}