Blender V5.0
math_functions.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7namespace blender::nodes {
8
9static const mf::MultiFunction *get_base_multi_function(const bNode &node)
10{
11 const int mode = node.custom1;
12 const mf::MultiFunction *base_fn = nullptr;
13
15 mode, [&](auto devi_fn, auto function, const FloatMathOperationInfo &info) {
16 static auto fn = mf::build::SI1_SO<float, float>(
17 info.title_case_name.c_str(), function, devi_fn);
18 base_fn = &fn;
19 });
20 if (base_fn != nullptr) {
21 return base_fn;
22 }
23
25 mode, [&](auto devi_fn, auto function, const FloatMathOperationInfo &info) {
26 static auto fn = mf::build::SI2_SO<float, float, float>(
27 info.title_case_name.c_str(), function, devi_fn);
28 base_fn = &fn;
29 });
30 if (base_fn != nullptr) {
31 return base_fn;
32 }
33
35 mode, [&](auto devi_fn, auto function, const FloatMathOperationInfo &info) {
36 static auto fn = mf::build::SI3_SO<float, float, float, float>(
37 info.title_case_name.c_str(), function, devi_fn);
38 base_fn = &fn;
39 });
40 if (base_fn != nullptr) {
41 return base_fn;
42 }
43
44 return nullptr;
45}
46
47class ClampWrapperFunction : public mf::MultiFunction {
48 private:
49 const mf::MultiFunction &fn_;
50
51 public:
52 ClampWrapperFunction(const mf::MultiFunction &fn) : fn_(fn)
53 {
54 this->set_signature(&fn.signature());
55 }
56
57 void call(const IndexMask &mask, mf::Params params, mf::Context context) const override
58 {
59 fn_.call(mask, params, context);
60
61 /* Assumes the output parameter is the last one. */
62 const int output_param_index = this->param_amount() - 1;
63 /* This has actually been initialized in the call above. */
64 MutableSpan<float> results = params.uninitialized_single_output<float>(output_param_index);
65
66 mask.foreach_index_optimized<int>([&](const int i) {
67 float &value = results[i];
68 CLAMP(value, 0.0f, 1.0f);
69 });
70 }
71};
72
74{
75 const mf::MultiFunction *base_function = get_base_multi_function(builder.node());
76
77 const bool clamp_output = builder.node().custom2 != 0;
78 if (clamp_output) {
80 }
81 else {
82 builder.set_matching_fn(base_function);
83 }
84}
85
87{
88
89#define RETURN_OPERATION_INFO(title_case_name, shader_name) \
90 { \
91 static const FloatMathOperationInfo info{title_case_name, shader_name}; \
92 return &info; \
93 } \
94 ((void)0)
95
96 switch (operation) {
97 case NODE_MATH_ADD:
98 RETURN_OPERATION_INFO("Add", "math_add");
100 RETURN_OPERATION_INFO("Subtract", "math_subtract");
102 RETURN_OPERATION_INFO("Multiply", "math_multiply");
103 case NODE_MATH_DIVIDE:
104 RETURN_OPERATION_INFO("Divide", "math_divide");
105 case NODE_MATH_SINE:
106 RETURN_OPERATION_INFO("Sine", "math_sine");
107 case NODE_MATH_COSINE:
108 RETURN_OPERATION_INFO("Cosine", "math_cosine");
110 RETURN_OPERATION_INFO("Tangent", "math_tangent");
112 RETURN_OPERATION_INFO("Arc Sine", "math_arcsine");
114 RETURN_OPERATION_INFO("Arc Cosine", "math_arccosine");
116 RETURN_OPERATION_INFO("Arc Tangent", "math_arctangent");
117 case NODE_MATH_POWER:
118 RETURN_OPERATION_INFO("Power", "math_power");
120 RETURN_OPERATION_INFO("Logarithm", "math_logarithm");
122 RETURN_OPERATION_INFO("Minimum", "math_minimum");
124 RETURN_OPERATION_INFO("Maximum", "math_maximum");
125 case NODE_MATH_ROUND:
126 RETURN_OPERATION_INFO("Round", "math_round");
128 RETURN_OPERATION_INFO("Less Than", "math_less_than");
130 RETURN_OPERATION_INFO("Greater Than", "math_greater_than");
131 case NODE_MATH_MODULO:
132 RETURN_OPERATION_INFO("Modulo", "math_modulo");
134 RETURN_OPERATION_INFO("Floored Modulo", "math_floored_modulo");
136 RETURN_OPERATION_INFO("Absolute", "math_absolute");
138 RETURN_OPERATION_INFO("Arc Tangent 2", "math_arctan2");
139 case NODE_MATH_FLOOR:
140 RETURN_OPERATION_INFO("Floor", "math_floor");
141 case NODE_MATH_CEIL:
142 RETURN_OPERATION_INFO("Ceil", "math_ceil");
144 RETURN_OPERATION_INFO("Fraction", "math_fraction");
145 case NODE_MATH_SQRT:
146 RETURN_OPERATION_INFO("Sqrt", "math_sqrt");
148 RETURN_OPERATION_INFO("Inverse Sqrt", "math_inversesqrt");
149 case NODE_MATH_SIGN:
150 RETURN_OPERATION_INFO("Sign", "math_sign");
152 RETURN_OPERATION_INFO("Exponent", "math_exponent");
154 RETURN_OPERATION_INFO("Radians", "math_radians");
156 RETURN_OPERATION_INFO("Degrees", "math_degrees");
157 case NODE_MATH_SINH:
158 RETURN_OPERATION_INFO("Hyperbolic Sine", "math_sinh");
159 case NODE_MATH_COSH:
160 RETURN_OPERATION_INFO("Hyperbolic Cosine", "math_cosh");
161 case NODE_MATH_TANH:
162 RETURN_OPERATION_INFO("Hyperbolic Tangent", "math_tanh");
163 case NODE_MATH_TRUNC:
164 RETURN_OPERATION_INFO("Truncate", "math_trunc");
165 case NODE_MATH_SNAP:
166 RETURN_OPERATION_INFO("Snap", "math_snap");
167 case NODE_MATH_WRAP:
168 RETURN_OPERATION_INFO("Wrap", "math_wrap");
170 RETURN_OPERATION_INFO("Compare", "math_compare");
172 RETURN_OPERATION_INFO("Multiply Add", "math_multiply_add");
174 RETURN_OPERATION_INFO("Ping Pong", "math_pingpong");
176 RETURN_OPERATION_INFO("Smooth Min", "math_smoothmin");
178 RETURN_OPERATION_INFO("Smooth Max", "math_smoothmax");
179 }
180
181#undef RETURN_OPERATION_INFO
182
183 return nullptr;
184}
185
187{
188
189#define RETURN_OPERATION_INFO(title_case_name, shader_name) \
190 { \
191 static const FloatMathOperationInfo info{title_case_name, shader_name}; \
192 return &info; \
193 } \
194 ((void)0)
195
196 switch (operation) {
198 RETURN_OPERATION_INFO("Less Than", "math_less_than");
200 RETURN_OPERATION_INFO("Less Than or Equal", "math_less_equal");
202 RETURN_OPERATION_INFO("Greater Than", "math_greater_than");
204 RETURN_OPERATION_INFO("Greater Than or Equal", "math_greater_equal");
206 RETURN_OPERATION_INFO("Equal", "math_equal");
208 RETURN_OPERATION_INFO("Not Equal", "math_not_equal");
209 }
210
211#undef RETURN_OPERATION_INFO
212
213 return nullptr;
214}
215
217{
218
219#define RETURN_OPERATION_INFO(title_case_name, shader_name) \
220 { \
221 static const FloatMathOperationInfo info{title_case_name, shader_name}; \
222 return &info; \
223 } \
224 ((void)0)
225
226 switch (operation) {
228 RETURN_OPERATION_INFO("Add", "vector_math_add");
230 RETURN_OPERATION_INFO("Subtract", "vector_math_subtract");
232 RETURN_OPERATION_INFO("Multiply", "vector_math_multiply");
234 RETURN_OPERATION_INFO("Divide", "vector_math_divide");
236 RETURN_OPERATION_INFO("Cross Product", "vector_math_cross");
238 RETURN_OPERATION_INFO("Project", "vector_math_project");
240 RETURN_OPERATION_INFO("Reflect", "vector_math_reflect");
242 RETURN_OPERATION_INFO("Dot Product", "vector_math_dot");
244 RETURN_OPERATION_INFO("Distance", "vector_math_distance");
246 RETURN_OPERATION_INFO("Length", "vector_math_length");
248 RETURN_OPERATION_INFO("Scale", "vector_math_scale");
250 RETURN_OPERATION_INFO("Normalize", "vector_math_normalize");
252 RETURN_OPERATION_INFO("Snap", "vector_math_snap");
254 RETURN_OPERATION_INFO("Floor", "vector_math_floor");
256 RETURN_OPERATION_INFO("Ceiling", "vector_math_ceil");
258 RETURN_OPERATION_INFO("Modulo", "vector_math_modulo");
260 RETURN_OPERATION_INFO("Fraction", "vector_math_fraction");
262 RETURN_OPERATION_INFO("Absolute", "vector_math_absolute");
264 RETURN_OPERATION_INFO("Minimum", "vector_math_minimum");
266 RETURN_OPERATION_INFO("Maximum", "vector_math_maximum");
268 RETURN_OPERATION_INFO("Wrap", "vector_math_wrap");
270 RETURN_OPERATION_INFO("Sine", "vector_math_sine");
272 RETURN_OPERATION_INFO("Cosine", "vector_math_cosine");
274 RETURN_OPERATION_INFO("Tangent", "vector_math_tangent");
276 RETURN_OPERATION_INFO("Refract", "vector_math_refract");
278 RETURN_OPERATION_INFO("Faceforward", "vector_math_faceforward");
280 RETURN_OPERATION_INFO("Multiply Add", "vector_math_multiply_add");
282 RETURN_OPERATION_INFO("Power", "vector_math_power");
284 RETURN_OPERATION_INFO("Sign", "vector_math_sign");
285 }
286
287#undef RETURN_OPERATION_INFO
288
289 return nullptr;
290}
291
292} // namespace blender::nodes
#define CLAMP(a, b, c)
@ NODE_VECTOR_MATH_NORMALIZE
@ NODE_VECTOR_MATH_LENGTH
@ NODE_VECTOR_MATH_SIGN
@ NODE_VECTOR_MATH_CROSS_PRODUCT
@ NODE_VECTOR_MATH_CEIL
@ NODE_VECTOR_MATH_MODULO
@ NODE_VECTOR_MATH_ADD
@ NODE_VECTOR_MATH_COSINE
@ NODE_VECTOR_MATH_REFLECT
@ NODE_VECTOR_MATH_WRAP
@ NODE_VECTOR_MATH_REFRACT
@ NODE_VECTOR_MATH_POWER
@ NODE_VECTOR_MATH_DOT_PRODUCT
@ NODE_VECTOR_MATH_ABSOLUTE
@ NODE_VECTOR_MATH_DIVIDE
@ NODE_VECTOR_MATH_TANGENT
@ NODE_VECTOR_MATH_DISTANCE
@ NODE_VECTOR_MATH_FLOOR
@ NODE_VECTOR_MATH_SNAP
@ NODE_VECTOR_MATH_SINE
@ NODE_VECTOR_MATH_FRACTION
@ NODE_VECTOR_MATH_PROJECT
@ NODE_VECTOR_MATH_MULTIPLY
@ NODE_VECTOR_MATH_SCALE
@ NODE_VECTOR_MATH_MAXIMUM
@ NODE_VECTOR_MATH_FACEFORWARD
@ NODE_VECTOR_MATH_SUBTRACT
@ NODE_VECTOR_MATH_MULTIPLY_ADD
@ NODE_VECTOR_MATH_MINIMUM
@ NODE_MATH_SINH
@ NODE_MATH_SMOOTH_MIN
@ NODE_MATH_TRUNC
@ NODE_MATH_COSH
@ NODE_MATH_SIGN
@ NODE_MATH_DEGREES
@ NODE_MATH_MODULO
@ NODE_MATH_ABSOLUTE
@ NODE_MATH_DIVIDE
@ NODE_MATH_SINE
@ NODE_MATH_FLOORED_MODULO
@ NODE_MATH_ARCTAN2
@ NODE_MATH_ARCCOSINE
@ NODE_MATH_MULTIPLY_ADD
@ NODE_MATH_POWER
@ NODE_MATH_WRAP
@ NODE_MATH_ARCTANGENT
@ NODE_MATH_MINIMUM
@ NODE_MATH_SQRT
@ NODE_MATH_CEIL
@ NODE_MATH_TANH
@ NODE_MATH_GREATER_THAN
@ NODE_MATH_ADD
@ NODE_MATH_FRACTION
@ NODE_MATH_EXPONENT
@ NODE_MATH_LESS_THAN
@ NODE_MATH_ARCSINE
@ NODE_MATH_MAXIMUM
@ NODE_MATH_LOGARITHM
@ NODE_MATH_COMPARE
@ NODE_MATH_INV_SQRT
@ NODE_MATH_MULTIPLY
@ NODE_MATH_PINGPONG
@ NODE_MATH_ROUND
@ NODE_MATH_FLOOR
@ NODE_MATH_SUBTRACT
@ NODE_MATH_COSINE
@ NODE_MATH_SNAP
@ NODE_MATH_TANGENT
@ NODE_MATH_SMOOTH_MAX
@ NODE_MATH_RADIANS
@ NODE_COMPARE_NOT_EQUAL
@ NODE_COMPARE_LESS_EQUAL
@ NODE_COMPARE_EQUAL
@ NODE_COMPARE_GREATER_EQUAL
@ NODE_COMPARE_GREATER_THAN
@ NODE_COMPARE_LESS_THAN
constexpr const char * c_str() const
void set_signature(const Signature *signature)
void call(const IndexMask &mask, mf::Params params, mf::Context context) const override
ClampWrapperFunction(const mf::MultiFunction &fn)
void set_matching_fn(const mf::MultiFunction *fn)
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
#define RETURN_OPERATION_INFO(title_case_name, shader_name)
void node_math_build_multi_function(NodeMultiFunctionBuilder &builder)
bool try_dispatch_float_math_fl_fl_to_fl(const int operation, Callback &&callback)
const FloatMathOperationInfo * get_float3_math_operation_info(const int operation)
static const mf::MultiFunction * get_base_multi_function(const bNode &node)
bool try_dispatch_float_math_fl_to_fl(const int operation, Callback &&callback)
const FloatMathOperationInfo * get_float_compare_operation_info(const int operation)
const FloatMathOperationInfo * get_float_math_operation_info(const int operation)
bool try_dispatch_float_math_fl_fl_fl_to_fl(const int operation, Callback &&callback)
int16_t custom1
int16_t custom2
i
Definition text_draw.cc:230