Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/texture/nodes/node_texture_math.c
| Show All 40 Lines | static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, short thread) | ||||
| float in0 = tex_input_value(in[0], p, thread); | float in0 = tex_input_value(in[0], p, thread); | ||||
| float in1 = tex_input_value(in[1], p, thread); | float in1 = tex_input_value(in[1], p, thread); | ||||
| switch (node->custom1) { | switch (node->custom1) { | ||||
| case NODE_MATH_ADD: | case NODE_MATH_ADD: | ||||
| *out = in0 + in1; | *out = in0 + in1; | ||||
| break; | break; | ||||
| case NODE_MATH_SUB: | case NODE_MATH_SUBTRACT: | ||||
| *out = in0 - in1; | *out = in0 - in1; | ||||
| break; | break; | ||||
| case NODE_MATH_MUL: | case NODE_MATH_MULTIPLY: | ||||
| *out = in0 * in1; | *out = in0 * in1; | ||||
| break; | break; | ||||
| case NODE_MATH_DIVIDE: { | case NODE_MATH_DIVIDE: { | ||||
| if (in1 == 0) { | if (in1 == 0) { | ||||
| /* We don't want to divide by zero. */ | /* We don't want to divide by zero. */ | ||||
| *out = 0.0; | *out = 0.0; | ||||
| } | } | ||||
| else { | else { | ||||
| *out = in0 / in1; | *out = in0 / in1; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_SIN: { | case NODE_MATH_SINE: { | ||||
| *out = sinf(in0); | *out = sinf(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_COS: { | case NODE_MATH_COSINE: { | ||||
| *out = cosf(in0); | *out = cosf(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_TAN: { | case NODE_MATH_TANGENT: { | ||||
| *out = tanf(in0); | *out = tanf(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_ASIN: { | case NODE_MATH_ARCSINE: { | ||||
| /* Can't do the impossible... */ | /* Can't do the impossible... */ | ||||
| if (in0 <= 1 && in0 >= -1) { | if (in0 <= 1 && in0 >= -1) { | ||||
| *out = asinf(in0); | *out = asinf(in0); | ||||
| } | } | ||||
| else { | else { | ||||
| *out = 0.0; | *out = 0.0; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_ACOS: { | case NODE_MATH_ARCCOSINE: { | ||||
| /* Can't do the impossible... */ | /* Can't do the impossible... */ | ||||
| if (in0 <= 1 && in0 >= -1) { | if (in0 <= 1 && in0 >= -1) { | ||||
| *out = acosf(in0); | *out = acosf(in0); | ||||
| } | } | ||||
| else { | else { | ||||
| *out = 0.0; | *out = 0.0; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_ATAN: { | case NODE_MATH_ARCTANGENT: { | ||||
| *out = atan(in0); | *out = atan(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_POW: { | case NODE_MATH_POWER: { | ||||
| /* Only raise negative numbers by full integers */ | /* Only raise negative numbers by full integers */ | ||||
| if (in0 >= 0) { | if (in0 >= 0) { | ||||
| out[0] = pow(in0, in1); | out[0] = pow(in0, in1); | ||||
| } | } | ||||
| else { | else { | ||||
| float y_mod_1 = fmod(in1, 1); | float y_mod_1 = fmod(in1, 1); | ||||
| if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) { | if (y_mod_1 > 0.999f || y_mod_1 < 0.001f) { | ||||
| *out = pow(in0, floor(in1 + 0.5f)); | *out = pow(in0, floor(in1 + 0.5f)); | ||||
| } | } | ||||
| else { | else { | ||||
| *out = 0.0; | *out = 0.0; | ||||
| } | } | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_LOG: { | case NODE_MATH_LOGARITHM: { | ||||
| /* Don't want any imaginary numbers... */ | /* Don't want any imaginary numbers... */ | ||||
| if (in0 > 0 && in1 > 0) { | if (in0 > 0 && in1 > 0) { | ||||
| *out = log(in0) / log(in1); | *out = log(in0) / log(in1); | ||||
| } | } | ||||
| else { | else { | ||||
| *out = 0.0; | *out = 0.0; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_MIN: { | case NODE_MATH_MINIMUM: { | ||||
| if (in0 < in1) { | if (in0 < in1) { | ||||
| *out = in0; | *out = in0; | ||||
| } | } | ||||
| else { | else { | ||||
| *out = in1; | *out = in1; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_MAX: { | case NODE_MATH_MAXIMUM: { | ||||
| if (in0 > in1) { | if (in0 > in1) { | ||||
| *out = in0; | *out = in0; | ||||
| } | } | ||||
| else { | else { | ||||
| *out = in1; | *out = in1; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_ROUND: { | case NODE_MATH_ROUND: { | ||||
| *out = (in0 < 0) ? (int)(in0 - 0.5f) : (int)(in0 + 0.5f); | *out = (in0 < 0) ? (int)(in0 - 0.5f) : (int)(in0 + 0.5f); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_LESS: { | case NODE_MATH_LESS_THAN: { | ||||
| if (in0 < in1) { | if (in0 < in1) { | ||||
| *out = 1.0f; | *out = 1.0f; | ||||
| } | } | ||||
| else { | else { | ||||
| *out = 0.0f; | *out = 0.0f; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_GREATER: { | case NODE_MATH_GREATER_THAN: { | ||||
| if (in0 > in1) { | if (in0 > in1) { | ||||
| *out = 1.0f; | *out = 1.0f; | ||||
| } | } | ||||
| else { | else { | ||||
| *out = 0.0f; | *out = 0.0f; | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_MOD: { | case NODE_MATH_MODULO: { | ||||
| if (in1 == 0.0f) { | if (in1 == 0.0f) { | ||||
| *out = 0.0f; | *out = 0.0f; | ||||
| } | } | ||||
| else { | else { | ||||
| *out = fmod(in0, in1); | *out = fmod(in0, in1); | ||||
| } | } | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_ABS: { | case NODE_MATH_ABSOLUTE: { | ||||
| *out = fabsf(in0); | *out = fabsf(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_ATAN2: { | case NODE_MATH_ARCTAN2: { | ||||
| *out = atan2(in0, in1); | *out = atan2(in0, in1); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_FLOOR: { | case NODE_MATH_FLOOR: { | ||||
| *out = floorf(in0); | *out = floorf(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_CEIL: { | case NODE_MATH_CEIL: { | ||||
| *out = ceilf(in0); | *out = ceilf(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_FRACT: { | case NODE_MATH_FRACTION: { | ||||
| *out = in0 - floorf(in0); | *out = in0 - floorf(in0); | ||||
| break; | break; | ||||
| } | } | ||||
| case NODE_MATH_SQRT: { | case NODE_MATH_SQRT: { | ||||
| if (in0 > 0.0f) { | if (in0 > 0.0f) { | ||||
| *out = sqrtf(in0); | *out = sqrtf(in0); | ||||
| } | } | ||||
| Show All 39 Lines | |||||