27 b.add_input<
decl::Float>(
"Value").default_value(0.5f).min(-10000.0f).max(10000.0f);
28 b.add_input<
decl::Float>(
"Value",
"Value_001").default_value(0.5f).min(-10000.0f).max(10000.0f);
29 b.add_input<
decl::Float>(
"Value",
"Value_002").default_value(0.5f).min(-10000.0f).max(10000.0f);
47 if (!
params.node_tree().typeinfo->validate_link(
59 if (item->name !=
nullptr && item->identifier[0] !=
'\0') {
61 (is_geometry_node_tree &&
91 if (name !=
nullptr) {
95 float min[3] = {0.0f, 0.0f, 0.0f};
96 float max[3] = {1.0f, 1.0f, 1.0f};
108 const int mode = node.custom1;
113 static auto fn = mf::build::SI1_SO<float, float>(
117 if (base_fn !=
nullptr) {
123 static auto fn = mf::build::SI2_SO<float, float, float>(
127 if (base_fn !=
nullptr) {
133 static auto fn = mf::build::SI3_SO<float, float, float, float>(
137 if (base_fn !=
nullptr) {
159 const int output_param_index = this->
param_amount() - 1;
163 mask.foreach_index_optimized<
int>([&](
const int i) {
164 float &value = results[i];
165 CLAMP(value, 0.0f, 1.0f);
174 const bool clamp_output = builder.
node().
custom2 != 0;
185 using namespace value_elem;
192 FloatElem output_elem =
params.get_input_elem<FloatElem>(
"Value");
193 output_elem.merge(
params.get_input_elem<FloatElem>(
"Value_001"));
194 params.set_output_elem(
"Value", output_elem);
221 const StringRef first_input_id =
"Value";
222 const StringRef second_input_id =
"Value_001";
226 params.set_input(first_input_id,
227 params.get_output<
float>(output_id) -
228 params.get_input<
float>(second_input_id));
232 params.set_input(first_input_id,
233 params.get_output<
float>(output_id) +
234 params.get_input<
float>(second_input_id));
238 params.set_input(first_input_id,
240 params.get_input<
float>(second_input_id)));
244 params.set_input(first_input_id,
245 params.get_output<
float>(output_id) *
246 params.get_input<
float>(second_input_id));
259 NodeItem res = empty();
262 NodeItem x = get_input_value(0, NodeItem::Type::Float);
284 res = (x + val(0.5f)).
floor();
302 res = val(1.0f) / x.sqrt();
311 res = x * val(
float(
M_PI) / 180.0f);
314 res = x * val(180.0f *
float(
M_1_PI));
326 res = x.sign() * x.abs().floor();
331 NodeItem y = get_input_value(1, NodeItem::Type::Float);
350 res = x.ln() / y.ln();
359 res = x.if_else(NodeItem::CompareOp::Less, y, val(1.0f), val(0.0f));
362 res = x.if_else(NodeItem::CompareOp::Greater, y, val(1.0f), val(0.0f));
374 NodeItem fract_part = (x -
y) / (y * val(2.0f));
375 NodeItem if_branch = ((fract_part - fract_part.floor()) * y * val(2.0f) -
y).
abs();
376 res = y.if_else(NodeItem::CompareOp::NotEq, val(0.0f), if_branch, val(0.0f));
381 NodeItem::CompareOp::NotEq, val(0.0f), (x - (x /
y).
floor() *
y), val(0.0f));
386 NodeItem
z = get_input_value(2, NodeItem::Type::Float);
390 NodeItem range = (y -
z);
391 NodeItem if_branch = x - (range * ((x -
z) / range).floor());
392 res = range.if_else(NodeItem::CompareOp::NotEq, val(0.0f), if_branch,
z);
396 res =
z.if_else(NodeItem::CompareOp::Less, (x - y).abs(), val(1.0f), val(0.0f));
403 auto make_smoothmin = [&](NodeItem a, NodeItem
b, NodeItem k) {
404 NodeItem h = (k - (a -
b).
abs()).
max(val(0.0f)) / k;
405 NodeItem if_branch = a.min(
b) - h * h * h * k * val(1.0f / 6.0f);
406 return k.if_else(NodeItem::CompareOp::NotEq, val(0.0f), if_branch, a.min(
b));
409 res = make_smoothmin(x, y,
z);
412 res = -make_smoothmin(-x, -y, -
z);
424 bool clamp_output = node_->custom2 != 0;
425 if (clamp_output && res) {
443 ntype.
declare = file_ns::sh_node_math_declare;
445 ntype.
gpu_fn = file_ns::gpu_shader_math;
450 ntype.
eval_elem = file_ns::node_eval_elem;
#define NODE_CLASS_CONVERTER
#define BLI_assert_unreachable()
#define BLT_I18NCONTEXT_ID_NODETREE
#define CTX_IFACE_(context, msgid)
@ NODE_MATH_FLOORED_MODULO
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
GPUNodeLink * GPU_constant(const float *num)
bool GPU_link(GPUMaterial *mat, const char *name,...)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
constexpr bool is_empty() const
constexpr const char * c_str() const
const Signature & signature() const
void set_signature(const Signature *signature)
virtual void call(const IndexMask &mask, Params params, Context context) const =0
void set_matching_fn(const mf::MultiFunction *fn)
void construct_and_set_matching_fn(Args &&...args)
void call(const IndexMask &mask, mf::Params params, mf::Context context) const override
ClampWrapperFunction(const mf::MultiFunction &fn)
void operator()(LinkSearchOpParams ¶ms)
local_group_size(16, 16) .push_constant(Type b
ccl_device_inline float2 floor(const float2 a)
void node_register_type(bNodeType *ntype)
T safe_divide(const T &a, const T &b)
static int gpu_shader_math(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void node_eval_inverse_elem(value_elem::InverseElemEvalParams ¶ms)
static void sh_node_math_gather_link_searches(GatherLinkSearchOpParams ¶ms)
static void sh_node_math_build_multi_function(NodeMultiFunctionBuilder &builder)
static const char * gpu_shader_get_name(int mode)
static void sh_node_math_declare(NodeDeclarationBuilder &b)
static void node_eval_elem(value_elem::ElemEvalParams ¶ms)
static void node_eval_inverse(inverse_eval::InverseEvalParams ¶ms)
static const mf::MultiFunction * get_base_multi_function(const bNode &node)
bool try_dispatch_float_math_fl_fl_to_fl(const int operation, Callback &&callback)
bool try_dispatch_float_math_fl_to_fl(const int operation, Callback &&callback)
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)
#define NODE_SHADER_MATERIALX_BEGIN
#define NODE_SHADER_MATERIALX_END
void register_node_type_sh_math()
void sh_fn_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
void node_math_label(const bNodeTree *, const bNode *node, char *label, int label_maxncpy)
void node_math_update(bNodeTree *ntree, bNode *node)
const EnumPropertyItem rna_enum_node_math_items[]
NodeInverseElemEvalFunction eval_inverse_elem
NodeMaterialXFunction materialx_fn
NodeInverseEvalFunction eval_inverse
void(* labelfunc)(const bNodeTree *ntree, const bNode *node, char *label, int label_maxncpy)
NodeGPUExecFunction gpu_fn
NodeElemEvalFunction eval_elem
NodeMultiFunctionBuildFunction build_multi_function
NodeGatherSocketLinkOperationsFunction gather_link_search_ops
NodeDeclareFunction declare
void(* updatefunc)(bNodeTree *ntree, bNode *node)
StringRefNull shader_name
StringRefNull title_case_name
ccl_device_inline int abs(int x)