diff options
Diffstat (limited to 'source/blender/nodes/shader')
-rw-r--r-- | source/blender/nodes/shader/node_shader_util.c | 2 | ||||
-rw-r--r-- | source/blender/nodes/shader/nodes/node_shader_math.cc | 314 |
2 files changed, 39 insertions, 277 deletions
diff --git a/source/blender/nodes/shader/node_shader_util.c b/source/blender/nodes/shader/node_shader_util.c index 4464a61c48c..25d6aef69e5 100644 --- a/source/blender/nodes/shader/node_shader_util.c +++ b/source/blender/nodes/shader/node_shader_util.c @@ -34,7 +34,7 @@ bool sh_node_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree) static bool sh_fn_poll_default(bNodeType *UNUSED(ntype), bNodeTree *ntree) { - return STREQ(ntree->idname, "ShaderNodeTree") || STREQ(ntree->idname, "SimulationNodeTree"); + return STREQ(ntree->idname, "ShaderNodeTree") || STREQ(ntree->idname, "GeometryNodeTree"); } void sh_node_type_base( diff --git a/source/blender/nodes/shader/nodes/node_shader_math.cc b/source/blender/nodes/shader/nodes/node_shader_math.cc index e7bbadfbcb0..f54914ceba9 100644 --- a/source/blender/nodes/shader/nodes/node_shader_math.cc +++ b/source/blender/nodes/shader/nodes/node_shader_math.cc @@ -23,6 +23,8 @@ #include "node_shader_util.h" +#include "NOD_math_functions.hh" + /* **************** SCALAR MATH ******************** */ static bNodeSocketTemplate sh_node_math_in[] = { {SOCK_FLOAT, N_("Value"), 0.5f, 0.5f, 0.5f, 1.0f, -10000.0f, 10000.0f, PROP_NONE}, @@ -34,93 +36,15 @@ static bNodeSocketTemplate sh_node_math_out[] = {{SOCK_FLOAT, N_("Value")}, {-1, static const char *gpu_shader_get_name(int mode) { - switch (mode) { - case NODE_MATH_ADD: - return "math_add"; - case NODE_MATH_SUBTRACT: - return "math_subtract"; - case NODE_MATH_MULTIPLY: - return "math_multiply"; - case NODE_MATH_DIVIDE: - return "math_divide"; - case NODE_MATH_MULTIPLY_ADD: - return "math_multiply_add"; - - case NODE_MATH_POWER: - return "math_power"; - case NODE_MATH_LOGARITHM: - return "math_logarithm"; - case NODE_MATH_EXPONENT: - return "math_exponent"; - case NODE_MATH_SQRT: - return "math_sqrt"; - case NODE_MATH_INV_SQRT: - return "math_inversesqrt"; - case NODE_MATH_ABSOLUTE: - return "math_absolute"; - case NODE_MATH_RADIANS: - return "math_radians"; - case NODE_MATH_DEGREES: - return "math_degrees"; - - case NODE_MATH_MINIMUM: - return "math_minimum"; - case NODE_MATH_MAXIMUM: - return "math_maximum"; - case NODE_MATH_LESS_THAN: - return "math_less_than"; - case NODE_MATH_GREATER_THAN: - return "math_greater_than"; - case NODE_MATH_SIGN: - return "math_sign"; - case NODE_MATH_COMPARE: - return "math_compare"; - case NODE_MATH_SMOOTH_MIN: - return "math_smoothmin"; - case NODE_MATH_SMOOTH_MAX: - return "math_smoothmax"; - - case NODE_MATH_ROUND: - return "math_round"; - case NODE_MATH_FLOOR: - return "math_floor"; - case NODE_MATH_CEIL: - return "math_ceil"; - case NODE_MATH_FRACTION: - return "math_fraction"; - case NODE_MATH_MODULO: - return "math_modulo"; - case NODE_MATH_TRUNC: - return "math_trunc"; - case NODE_MATH_SNAP: - return "math_snap"; - case NODE_MATH_WRAP: - return "math_wrap"; - case NODE_MATH_PINGPONG: - return "math_pingpong"; - - case NODE_MATH_SINE: - return "math_sine"; - case NODE_MATH_COSINE: - return "math_cosine"; - case NODE_MATH_TANGENT: - return "math_tangent"; - case NODE_MATH_SINH: - return "math_sinh"; - case NODE_MATH_COSH: - return "math_cosh"; - case NODE_MATH_TANH: - return "math_tanh"; - case NODE_MATH_ARCSINE: - return "math_arcsine"; - case NODE_MATH_ARCCOSINE: - return "math_arccosine"; - case NODE_MATH_ARCTANGENT: - return "math_arctangent"; - case NODE_MATH_ARCTAN2: - return "math_arctan2"; + const blender::nodes::FloatMathOperationInfo *info = + blender::nodes::get_float_math_operation_info(mode); + if (!info) { + return nullptr; + } + if (info->shader_name.is_empty()) { + return nullptr; } - return nullptr; + return info->shader_name.c_str(); } static int gpu_shader_math(GPUMaterial *mat, @@ -149,201 +73,39 @@ static const blender::fn::MultiFunction &get_base_multi_function( blender::nodes::NodeMFNetworkBuilder &builder) { const int mode = builder.bnode().custom1; - switch (mode) { - case NODE_MATH_ADD: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Add", [](float a, float b) { return a + b; }}; - return fn; - } - case NODE_MATH_SUBTRACT: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Subtract", [](float a, float b) { return a - b; }}; - return fn; - } - case NODE_MATH_MULTIPLY: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Multiply", [](float a, float b) { return a * b; }}; - return fn; - } - case NODE_MATH_DIVIDE: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{"Divide", safe_divide}; - return fn; - } - case NODE_MATH_MULTIPLY_ADD: { - static blender::fn::CustomMF_SI_SI_SI_SO<float, float, float, float> fn{ - "Multiply Add", [](float a, float b, float c) { return a * b + c; }}; - return fn; - } - case NODE_MATH_POWER: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{"Power", safe_powf}; - return fn; - } - case NODE_MATH_LOGARITHM: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{"Logarithm", safe_logf}; - return fn; - } - case NODE_MATH_EXPONENT: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Exponent", expf}; - return fn; - } - case NODE_MATH_SQRT: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Sqrt", safe_sqrtf}; - return fn; - } - case NODE_MATH_INV_SQRT: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Inverse Sqrt", safe_inverse_sqrtf}; - return fn; - }; - case NODE_MATH_ABSOLUTE: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Absolute", - [](float a) { return fabs(a); }}; - return fn; - } - case NODE_MATH_RADIANS: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Radians", - [](float a) { return DEG2RAD(a); }}; - return fn; - } - case NODE_MATH_DEGREES: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Degrees", - [](float a) { return RAD2DEG(a); }}; - return fn; - } + const blender::fn::MultiFunction *base_fn = nullptr; - case NODE_MATH_MINIMUM: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Minimum", [](float a, float b) { return std::min(a, b); }}; - return fn; - } - case NODE_MATH_MAXIMUM: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Maximum", [](float a, float b) { return std::max(a, b); }}; - return fn; - } - case NODE_MATH_LESS_THAN: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Less Than", [](float a, float b) { return (float)(a < b); }}; - return fn; - } - case NODE_MATH_GREATER_THAN: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Greater Than", [](float a, float b) { return (float)(a > b); }}; - return fn; - } - case NODE_MATH_SIGN: { - static blender::fn::CustomMF_SI_SO<float, float> fn{ - "Sign", [](float a) { return compatible_signf(a); }}; - return fn; - } - case NODE_MATH_COMPARE: { - static blender::fn::CustomMF_SI_SI_SI_SO<float, float, float, float> fn{ - "Compare", [](float a, float b, float c) -> float { - return ((a == b) || (fabsf(a - b) <= fmaxf(c, FLT_EPSILON))) ? 1.0f : 0.0f; - }}; - return fn; - } - case NODE_MATH_SMOOTH_MIN: { - return builder.get_not_implemented_fn(); - } - case NODE_MATH_SMOOTH_MAX: { - return builder.get_not_implemented_fn(); - } - - case NODE_MATH_ROUND: { - static blender::fn::CustomMF_SI_SO<float, float> fn{ - "Round", [](float a) { return floorf(a + 0.5f); }}; - return fn; - } - case NODE_MATH_FLOOR: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Floor", - [](float a) { return floorf(a); }}; - return fn; - } - case NODE_MATH_CEIL: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Ceil", - [](float a) { return ceilf(a); }}; - return fn; - } - case NODE_MATH_FRACTION: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Fraction", - [](float a) { return a - floorf(a); }}; - return fn; - } - case NODE_MATH_MODULO: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Modulo", [](float a, float b) { return safe_modf(a, b); }}; - return fn; - } - case NODE_MATH_TRUNC: { - static blender::fn::CustomMF_SI_SO<float, float> fn{ - "Trunc", [](float a) { return a >= 0.0f ? floorf(a) : ceilf(a); }}; - return fn; - } - case NODE_MATH_SNAP: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Snap", [](float a, float b) { return floorf(safe_divide(a, b)) * b; }}; - return fn; - } - case NODE_MATH_WRAP: { - return builder.get_not_implemented_fn(); - } - case NODE_MATH_PINGPONG: { - return builder.get_not_implemented_fn(); - } + blender::nodes::try_dispatch_float_math_fl_to_fl( + mode, [&](auto function, const blender::nodes::FloatMathOperationInfo &info) { + static blender::fn::CustomMF_SI_SO<float, float> fn{info.title_case_name, function}; + base_fn = &fn; + }); + if (base_fn != nullptr) { + return *base_fn; + } - case NODE_MATH_SINE: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Sine", [](float a) { return sinf(a); }}; - return fn; - } - case NODE_MATH_COSINE: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Cosine", - [](float a) { return cosf(a); }}; - return fn; - } - case NODE_MATH_TANGENT: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Tangent", - [](float a) { return tanf(a); }}; - return fn; - } - case NODE_MATH_SINH: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Hyperbolic Sine", - [](float a) { return sinhf(a); }}; - return fn; - } - case NODE_MATH_COSH: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Hyperbolic Cosine", - [](float a) { return coshf(a); }}; - return fn; - } - case NODE_MATH_TANH: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Hyperbolic Tangent", - [](float a) { return tanhf(a); }}; - return fn; - } - case NODE_MATH_ARCSINE: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Arc Sine", safe_asinf}; - return fn; - } - case NODE_MATH_ARCCOSINE: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Arc Cosine", safe_acosf}; - return fn; - } - case NODE_MATH_ARCTANGENT: { - static blender::fn::CustomMF_SI_SO<float, float> fn{"Arc Tangent", - [](float a) { return atanf(a); }}; - return fn; - } - case NODE_MATH_ARCTAN2: { - static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{ - "Arc Tangent 2", [](float a, float b) { return atan2f(a, b); }}; - return fn; - } + blender::nodes::try_dispatch_float_math_fl_fl_to_fl( + mode, [&](auto function, const blender::nodes::FloatMathOperationInfo &info) { + static blender::fn::CustomMF_SI_SI_SO<float, float, float> fn{info.title_case_name, + function}; + base_fn = &fn; + }); + if (base_fn != nullptr) { + return *base_fn; + } - default: - BLI_assert(false); - return builder.get_not_implemented_fn(); + blender::nodes::try_dispatch_float_math_fl_fl_fl_to_fl( + mode, [&](auto function, const blender::nodes::FloatMathOperationInfo &info) { + static blender::fn::CustomMF_SI_SI_SI_SO<float, float, float, float> fn{ + info.title_case_name, function}; + base_fn = &fn; + }); + if (base_fn != nullptr) { + return *base_fn; } + + return builder.get_not_implemented_fn(); } static void sh_node_math_expand_in_mf_network(blender::nodes::NodeMFNetworkBuilder &builder) |