[Bf-blender-cvs] [8742bbd607a] geometry-nodes: Nodes: simplify Math code by using new abstraction layer
Jacques Lucke
noreply at git.blender.org
Wed Nov 25 15:40:47 CET 2020
Commit: 8742bbd607a8c8c1f2d99a23d56993fee99cfd26
Author: Jacques Lucke
Date: Wed Nov 25 15:39:42 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB8742bbd607a8c8c1f2d99a23d56993fee99cfd26
Nodes: simplify Math code by using new abstraction layer
===================================================================
M source/blender/nodes/shader/nodes/node_shader_math.cc
===================================================================
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: {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list