diff options
Diffstat (limited to 'source/blender/nodes/shader/nodes')
21 files changed, 675 insertions, 256 deletions
diff --git a/source/blender/nodes/shader/nodes/node_shader_clamp.cc b/source/blender/nodes/shader/nodes/node_shader_clamp.cc index e8d4239937f..57a992a4275 100644 --- a/source/blender/nodes/shader/nodes/node_shader_clamp.cc +++ b/source/blender/nodes/shader/nodes/node_shader_clamp.cc @@ -28,10 +28,10 @@ namespace blender::nodes { static void sh_node_clamp_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Value").min(0.0f).max(1.0f).default_value(1.0f); - b.add_input<decl::Float>("Min").default_value(0.0f).min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("Max").default_value(1.0f).min(-10000.0f).max(10000.0f); - b.add_output<decl::Float>("Result"); + b.add_input<decl::Float>(N_("Value")).min(0.0f).max(1.0f).default_value(1.0f); + b.add_input<decl::Float>(N_("Min")).default_value(0.0f).min(-10000.0f).max(10000.0f); + b.add_input<decl::Float>(N_("Max")).default_value(1.0f).min(-10000.0f).max(10000.0f); + b.add_output<decl::Float>(N_("Result")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_curves.cc b/source/blender/nodes/shader/nodes/node_shader_curves.cc index 875e6fa0c35..f8f0ee97eae 100644 --- a/source/blender/nodes/shader/nodes/node_shader_curves.cc +++ b/source/blender/nodes/shader/nodes/node_shader_curves.cc @@ -28,9 +28,9 @@ namespace blender::nodes { static void sh_node_curve_vec_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Fac").min(0.0f).max(1.0f).default_value(1.0f).subtype(PROP_FACTOR); - b.add_input<decl::Vector>("Vector").min(-1.0f).max(1.0f); - b.add_output<decl::Vector>("Vector"); + b.add_input<decl::Float>(N_("Fac")).min(0.0f).max(1.0f).default_value(1.0f).subtype(PROP_FACTOR); + b.add_input<decl::Vector>(N_("Vector")).min(-1.0f).max(1.0f); + b.add_output<decl::Vector>(N_("Vector")); }; } // namespace blender::nodes @@ -175,9 +175,9 @@ namespace blender::nodes { static void sh_node_curve_rgb_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Fac").min(0.0f).max(1.0f).default_value(1.0f).subtype(PROP_FACTOR); - b.add_input<decl::Color>("Color").default_value({1.0f, 1.0f, 1.0f, 1.0f}); - b.add_output<decl::Color>("Color"); + b.add_input<decl::Float>(N_("Fac")).min(0.0f).max(1.0f).default_value(1.0f).subtype(PROP_FACTOR); + b.add_input<decl::Color>(N_("Color")).default_value({1.0f, 1.0f, 1.0f, 1.0f}); + b.add_output<decl::Color>(N_("Color")); }; } // namespace blender::nodes @@ -352,9 +352,13 @@ namespace blender::nodes { static void sh_node_curve_float_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Factor").min(0.0f).max(1.0f).default_value(1.0f).subtype(PROP_FACTOR); - b.add_input<decl::Float>("Value").default_value(1.0f); - b.add_output<decl::Float>("Value"); + b.add_input<decl::Float>(N_("Factor")) + .min(0.0f) + .max(1.0f) + .default_value(1.0f) + .subtype(PROP_FACTOR); + b.add_input<decl::Float>(N_("Value")).default_value(1.0f); + b.add_output<decl::Float>(N_("Value")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_map_range.cc b/source/blender/nodes/shader/nodes/node_shader_map_range.cc index 5ea194ddc83..c866a154e8c 100644 --- a/source/blender/nodes/shader/nodes/node_shader_map_range.cc +++ b/source/blender/nodes/shader/nodes/node_shader_map_range.cc @@ -30,13 +30,13 @@ namespace blender::nodes { static void sh_node_map_range_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Value").min(-10000.0f).max(10000.0f).default_value(1.0f); - b.add_input<decl::Float>("From Min").min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("From Max").min(-10000.0f).max(10000.0f).default_value(1.0f); - b.add_input<decl::Float>("To Min").min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("To Max").min(-10000.0f).max(10000.0f).default_value(1.0f); - b.add_input<decl::Float>("Steps").min(-10000.0f).max(10000.0f).default_value(4.0f); - b.add_output<decl::Float>("Result"); + b.add_input<decl::Float>(N_("Value")).min(-10000.0f).max(10000.0f).default_value(1.0f); + b.add_input<decl::Float>(N_("From Min")).min(-10000.0f).max(10000.0f); + b.add_input<decl::Float>(N_("From Max")).min(-10000.0f).max(10000.0f).default_value(1.0f); + b.add_input<decl::Float>(N_("To Min")).min(-10000.0f).max(10000.0f); + b.add_input<decl::Float>(N_("To Max")).min(-10000.0f).max(10000.0f).default_value(1.0f); + b.add_input<decl::Float>(N_("Steps")).min(-10000.0f).max(10000.0f).default_value(4.0f); + b.add_output<decl::Float>(N_("Result")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_math.cc b/source/blender/nodes/shader/nodes/node_shader_math.cc index 96d1be49c04..284a5f1189f 100644 --- a/source/blender/nodes/shader/nodes/node_shader_math.cc +++ b/source/blender/nodes/shader/nodes/node_shader_math.cc @@ -32,10 +32,16 @@ namespace blender::nodes { static void sh_node_math_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Value").default_value(0.5f).min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("Value", "Value_001").default_value(0.5f).min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("Value", "Value_002").default_value(0.5f).min(-10000.0f).max(10000.0f); - b.add_output<decl::Float>("Value"); + b.add_input<decl::Float>(N_("Value")).default_value(0.5f).min(-10000.0f).max(10000.0f); + b.add_input<decl::Float>(N_("Value"), "Value_001") + .default_value(0.5f) + .min(-10000.0f) + .max(10000.0f); + b.add_input<decl::Float>(N_("Value"), "Value_002") + .default_value(0.5f) + .min(-10000.0f) + .max(10000.0f); + b.add_output<decl::Float>(N_("Value")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_mixRgb.cc b/source/blender/nodes/shader/nodes/node_shader_mixRgb.cc index d4d02e80ada..06fafff578e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_mixRgb.cc +++ b/source/blender/nodes/shader/nodes/node_shader_mixRgb.cc @@ -28,10 +28,10 @@ namespace blender::nodes { static void sh_node_mix_rgb_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Fac").default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); - b.add_input<decl::Color>("Color1").default_value({0.5f, 0.5f, 0.5f, 1.0f}); - b.add_input<decl::Color>("Color2").default_value({0.5f, 0.5f, 0.5f, 1.0f}); - b.add_output<decl::Color>("Color"); + b.add_input<decl::Float>(N_("Fac")).default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); + b.add_input<decl::Color>(N_("Color1")).default_value({0.5f, 0.5f, 0.5f, 1.0f}); + b.add_input<decl::Color>(N_("Color2")).default_value({0.5f, 0.5f, 0.5f, 1.0f}); + b.add_output<decl::Color>(N_("Color")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.cc b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.cc index 24c5dcf7ba3..08a9e01786e 100644 --- a/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.cc +++ b/source/blender/nodes/shader/nodes/node_shader_sepcombRGB.cc @@ -28,10 +28,10 @@ namespace blender::nodes { static void sh_node_seprgb_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Color>("Image").default_value({0.8f, 0.8f, 0.8f, 1.0f}); - b.add_output<decl::Float>("R"); - b.add_output<decl::Float>("G"); - b.add_output<decl::Float>("B"); + b.add_input<decl::Color>(N_("Image")).default_value({0.8f, 0.8f, 0.8f, 1.0f}); + b.add_output<decl::Float>(N_("R")); + b.add_output<decl::Float>(N_("G")); + b.add_output<decl::Float>(N_("B")); }; } // namespace blender::nodes @@ -121,10 +121,10 @@ namespace blender::nodes { static void sh_node_combrgb_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("R").min(0.0f).max(1.0f); - b.add_input<decl::Float>("G").min(0.0f).max(1.0f); - b.add_input<decl::Float>("B").min(0.0f).max(1.0f); - b.add_output<decl::Color>("Image"); + b.add_input<decl::Float>(N_("R")).min(0.0f).max(1.0f); + b.add_input<decl::Float>(N_("G")).min(0.0f).max(1.0f); + b.add_input<decl::Float>(N_("B")).min(0.0f).max(1.0f); + b.add_output<decl::Color>(N_("Image")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_sepcombXYZ.cc b/source/blender/nodes/shader/nodes/node_shader_sepcombXYZ.cc index 8ca8fc19521..1bbfa629462 100644 --- a/source/blender/nodes/shader/nodes/node_shader_sepcombXYZ.cc +++ b/source/blender/nodes/shader/nodes/node_shader_sepcombXYZ.cc @@ -28,10 +28,10 @@ namespace blender::nodes { static void sh_node_sepxyz_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").min(-10000.0f).max(10000.0f); - b.add_output<decl::Float>("X"); - b.add_output<decl::Float>("Y"); - b.add_output<decl::Float>("Z"); + b.add_input<decl::Vector>(N_("Vector")).min(-10000.0f).max(10000.0f); + b.add_output<decl::Float>(N_("X")); + b.add_output<decl::Float>(N_("Y")); + b.add_output<decl::Float>(N_("Z")); }; } // namespace blender::nodes @@ -105,10 +105,10 @@ namespace blender::nodes { static void sh_node_combxyz_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("X").min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("Y").min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("Z").min(-10000.0f).max(10000.0f); - b.add_output<decl::Vector>("Vector"); + b.add_input<decl::Float>(N_("X")).min(-10000.0f).max(10000.0f); + b.add_input<decl::Float>(N_("Y")).min(-10000.0f).max(10000.0f); + b.add_input<decl::Float>(N_("Z")).min(-10000.0f).max(10000.0f); + b.add_output<decl::Vector>(N_("Vector")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_brick.cc b/source/blender/nodes/shader/nodes/node_shader_tex_brick.cc index e90dae60189..b840bd75e42 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_brick.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_brick.cc @@ -19,39 +19,42 @@ #include "../node_shader_util.h" +#include "BLI_float2.hh" +#include "BLI_float4.hh" + namespace blender::nodes { static void sh_node_tex_brick_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").min(-10000.0f).max(10000.0f).implicit_field(); - b.add_input<decl::Color>("Color1").default_value({0.8f, 0.8f, 0.8f, 1.0f}); - b.add_input<decl::Color>("Color2").default_value({0.2f, 0.2f, 0.2f, 1.0f}); - b.add_input<decl::Color>("Mortar").default_value({0.0f, 0.0f, 0.0f, 1.0f}).no_muted_links(); - b.add_input<decl::Float>("Scale") + b.add_input<decl::Vector>(N_("Vector")).min(-10000.0f).max(10000.0f).implicit_field(); + b.add_input<decl::Color>(N_("Color1")).default_value({0.8f, 0.8f, 0.8f, 1.0f}); + b.add_input<decl::Color>(N_("Color2")).default_value({0.2f, 0.2f, 0.2f, 1.0f}); + b.add_input<decl::Color>(N_("Mortar")).default_value({0.0f, 0.0f, 0.0f, 1.0f}).no_muted_links(); + b.add_input<decl::Float>(N_("Scale")) .min(-1000.0f) .max(1000.0f) .default_value(5.0f) .no_muted_links(); - b.add_input<decl::Float>("Mortar Size") + b.add_input<decl::Float>(N_("Mortar Size")) .min(0.0f) .max(0.125f) .default_value(0.02f) .no_muted_links(); - b.add_input<decl::Float>("Mortar Smooth").min(0.0f).max(1.0f).no_muted_links(); - b.add_input<decl::Float>("Bias").min(-1.0f).max(1.0f).no_muted_links(); - b.add_input<decl::Float>("Brick Width") + b.add_input<decl::Float>(N_("Mortar Smooth")).min(0.0f).max(1.0f).no_muted_links(); + b.add_input<decl::Float>(N_("Bias")).min(-1.0f).max(1.0f).no_muted_links(); + b.add_input<decl::Float>(N_("Brick Width")) .min(0.01f) .max(100.0f) .default_value(0.5f) .no_muted_links(); - b.add_input<decl::Float>("Row Height") + b.add_input<decl::Float>(N_("Row Height")) .min(0.01f) .max(100.0f) .default_value(0.25f) .no_muted_links(); - b.add_output<decl::Color>("Color"); - b.add_output<decl::Float>("Fac"); + b.add_output<decl::Color>(N_("Color")); + b.add_output<decl::Float>(N_("Fac")); }; } // namespace blender::nodes @@ -98,18 +101,185 @@ static int node_shader_gpu_tex_brick(GPUMaterial *mat, GPU_constant(&squash_freq)); } -/* node type definition */ +namespace blender::nodes { + +class BrickFunction : public fn::MultiFunction { + private: + const float offset_; + const int offset_freq_; + const float squash_; + const int squash_freq_; + + public: + BrickFunction(const float offset, + const int offset_freq, + const float squash, + const int squash_freq) + : offset_(offset), offset_freq_(offset_freq), squash_(squash), squash_freq_(squash_freq) + { + static fn::MFSignature signature = create_signature(); + this->set_signature(&signature); + } + + static fn::MFSignature create_signature() + { + fn::MFSignatureBuilder signature{"BrickTexture"}; + signature.single_input<float3>("Vector"); + signature.single_input<ColorGeometry4f>("Color1"); + signature.single_input<ColorGeometry4f>("Color2"); + signature.single_input<ColorGeometry4f>("Mortar"); + signature.single_input<float>("Scale"); + signature.single_input<float>("Mortar Size"); + signature.single_input<float>("Mortar Smooth"); + signature.single_input<float>("Bias"); + signature.single_input<float>("Brick Width"); + signature.single_input<float>("Row Height"); + signature.single_output<ColorGeometry4f>("Color"); + signature.single_output<float>("Fac"); + return signature.build(); + } + + /* Fast integer noise. */ + static float brick_noise(uint n) + { + n = (n + 1013) & 0x7fffffff; + n = (n >> 13) ^ n; + const uint nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff; + return 0.5f * ((float)nn / 1073741824.0f); + } + + static float smoothstepf(const float f) + { + const float ff = f * f; + return (3.0f * ff - 2.0f * ff * f); + } + + static float2 brick(float3 p, + float mortar_size, + float mortar_smooth, + float bias, + float brick_width, + float row_height, + float offset_amount, + int offset_frequency, + float squash_amount, + int squash_frequency) + { + float offset = 0.0f; + + const int rownum = (int)floorf(p.y / row_height); + + if (offset_frequency && squash_frequency) { + brick_width *= (rownum % squash_frequency) ? 1.0f : squash_amount; + offset = (rownum % offset_frequency) ? 0.0f : (brick_width * offset_amount); + } + + const int bricknum = (int)floorf((p.x + offset) / brick_width); + + const float x = (p.x + offset) - brick_width * bricknum; + const float y = p.y - row_height * rownum; + + const float tint = clamp_f( + brick_noise((rownum << 16) + (bricknum & 0xFFFF)) + bias, 0.0f, 1.0f); + float min_dist = std::min(std::min(x, y), std::min(brick_width - x, row_height - y)); + + float mortar; + if (min_dist >= mortar_size) { + mortar = 0.0f; + } + else if (mortar_smooth == 0.0f) { + mortar = 1.0f; + } + else { + min_dist = 1.0f - min_dist / mortar_size; + mortar = (min_dist < mortar_smooth) ? smoothstepf(min_dist / mortar_smooth) : 1.0f; + } + + return float2(tint, mortar); + } + + void call(IndexMask mask, fn::MFParams params, fn::MFContext UNUSED(context)) const override + { + const VArray<float3> &vector = params.readonly_single_input<float3>(0, "Vector"); + const VArray<ColorGeometry4f> &color1_values = params.readonly_single_input<ColorGeometry4f>( + 1, "Color1"); + const VArray<ColorGeometry4f> &color2_values = params.readonly_single_input<ColorGeometry4f>( + 2, "Color2"); + const VArray<ColorGeometry4f> &mortar_values = params.readonly_single_input<ColorGeometry4f>( + 3, "Mortar"); + const VArray<float> &scale = params.readonly_single_input<float>(4, "Scale"); + const VArray<float> &mortar_size = params.readonly_single_input<float>(5, "Mortar Size"); + const VArray<float> &mortar_smooth = params.readonly_single_input<float>(6, "Mortar Smooth"); + const VArray<float> &bias = params.readonly_single_input<float>(7, "Bias"); + const VArray<float> &brick_width = params.readonly_single_input<float>(8, "Brick Width"); + const VArray<float> &row_height = params.readonly_single_input<float>(9, "Row Height"); + + MutableSpan<ColorGeometry4f> r_color = + params.uninitialized_single_output_if_required<ColorGeometry4f>(10, "Color"); + MutableSpan<float> r_fac = params.uninitialized_single_output_if_required<float>(11, "Fac"); + + const bool store_fac = !r_fac.is_empty(); + const bool store_color = !r_color.is_empty(); + + for (int64_t i : mask) { + const float2 f2 = brick(vector[i] * scale[i], + mortar_size[i], + mortar_smooth[i], + bias[i], + brick_width[i], + row_height[i], + offset_, + offset_freq_, + squash_, + squash_freq_); + + float4 color_data, color1, color2, mortar; + copy_v4_v4(color_data, color1_values[i]); + copy_v4_v4(color1, color1_values[i]); + copy_v4_v4(color2, color2_values[i]); + copy_v4_v4(mortar, mortar_values[i]); + const float tint = f2.x; + const float f = f2.y; + + if (f != 1.0f) { + const float facm = 1.0f - tint; + color_data = color1 * facm + color2 * tint; + } + + if (store_color) { + color_data = color_data * (1.0f - f) + mortar * f; + copy_v4_v4(r_color[i], color_data); + } + if (store_fac) { + r_fac[i] = f; + } + } + } +}; + +static void sh_node_brick_build_multi_function(blender::nodes::NodeMultiFunctionBuilder &builder) +{ + bNode &node = builder.node(); + NodeTexBrick *tex = (NodeTexBrick *)node.storage; + + builder.construct_and_set_matching_fn<BrickFunction>( + tex->offset, tex->offset_freq, tex->squash, tex->squash_freq); +} + +} // namespace blender::nodes + void register_node_type_sh_tex_brick(void) { static bNodeType ntype; - sh_node_type_base(&ntype, SH_NODE_TEX_BRICK, "Brick Texture", NODE_CLASS_TEXTURE, 0); + sh_fn_node_type_base(&ntype, SH_NODE_TEX_BRICK, "Brick Texture", NODE_CLASS_TEXTURE, 0); ntype.declare = blender::nodes::sh_node_tex_brick_declare; node_type_size_preset(&ntype, NODE_SIZE_MIDDLE); node_type_init(&ntype, node_shader_init_tex_brick); node_type_storage( &ntype, "NodeTexBrick", node_free_standard_storage, node_copy_standard_storage); node_type_gpu(&ntype, node_shader_gpu_tex_brick); + ntype.build_multi_function = blender::nodes::sh_node_brick_build_multi_function; nodeRegisterType(&ntype); } diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_checker.cc b/source/blender/nodes/shader/nodes/node_shader_tex_checker.cc index 7ba468a93e0..7c1223a6a32 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_checker.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_checker.cc @@ -24,16 +24,16 @@ namespace blender::nodes { static void sh_node_tex_checker_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").min(-10000.0f).max(10000.0f).implicit_field(); - b.add_input<decl::Color>("Color1").default_value({0.8f, 0.8f, 0.8f, 1.0f}); - b.add_input<decl::Color>("Color2").default_value({0.2f, 0.2f, 0.2f, 1.0f}); - b.add_input<decl::Float>("Scale") + b.add_input<decl::Vector>(N_("Vector")).min(-10000.0f).max(10000.0f).implicit_field(); + b.add_input<decl::Color>(N_("Color1")).default_value({0.8f, 0.8f, 0.8f, 1.0f}); + b.add_input<decl::Color>(N_("Color2")).default_value({0.2f, 0.2f, 0.2f, 1.0f}); + b.add_input<decl::Float>(N_("Scale")) .min(-10000.0f) .max(10000.0f) .default_value(5.0f) .no_muted_links(); - b.add_output<decl::Color>("Color"); - b.add_output<decl::Float>("Fac"); + b.add_output<decl::Color>(N_("Color")); + b.add_output<decl::Float>(N_("Fac")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc index 4796af02361..33832c42b3c 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_gradient.cc @@ -24,9 +24,9 @@ namespace blender::nodes { static void sh_node_tex_gradient_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").hide_value().implicit_field(); - b.add_output<decl::Color>("Color").no_muted_links(); - b.add_output<decl::Float>("Fac").no_muted_links(); + b.add_input<decl::Vector>(N_("Vector")).hide_value().implicit_field(); + b.add_output<decl::Color>(N_("Color")).no_muted_links(); + b.add_output<decl::Float>(N_("Fac")).no_muted_links(); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_image.cc b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc index df1051c07b4..f20fc85cbe0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_image.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_image.cc @@ -24,9 +24,9 @@ namespace blender::nodes { static void sh_node_tex_image_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").implicit_field(); - b.add_output<decl::Color>("Color").no_muted_links(); - b.add_output<decl::Float>("Alpha").no_muted_links(); + b.add_input<decl::Vector>(N_("Vector")).implicit_field(); + b.add_output<decl::Color>(N_("Color")).no_muted_links(); + b.add_output<decl::Float>(N_("Alpha")).no_muted_links(); }; }; // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_magic.cc b/source/blender/nodes/shader/nodes/node_shader_tex_magic.cc index b6cdcf86528..62e68d53d03 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_magic.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_magic.cc @@ -24,11 +24,11 @@ namespace blender::nodes { static void sh_node_tex_magic_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").implicit_field(); - b.add_input<decl::Float>("Scale").min(-1000.0f).max(1000.0f).default_value(5.0f); - b.add_input<decl::Float>("Distortion").min(-1000.0f).max(1000.0f).default_value(1.0f); - b.add_output<decl::Color>("Color").no_muted_links(); - b.add_output<decl::Float>("Fac").no_muted_links(); + b.add_input<decl::Vector>(N_("Vector")).implicit_field(); + b.add_input<decl::Float>(N_("Scale")).min(-1000.0f).max(1000.0f).default_value(5.0f); + b.add_input<decl::Float>(N_("Distortion")).min(-1000.0f).max(1000.0f).default_value(1.0f); + b.add_output<decl::Color>(N_("Color")).no_muted_links(); + b.add_output<decl::Float>(N_("Fac")).no_muted_links(); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.cc b/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.cc index 61c26d07e2f..3bf4e24ed53 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_musgrave.cc @@ -26,15 +26,15 @@ namespace blender::nodes { static void sh_node_tex_musgrave_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").hide_value().implicit_field(); - b.add_input<decl::Float>("W").min(-1000.0f).max(1000.0f); - b.add_input<decl::Float>("Scale").min(-1000.0f).max(1000.0f).default_value(5.0f); - b.add_input<decl::Float>("Detail").min(0.0f).max(16.0f).default_value(2.0f); - b.add_input<decl::Float>("Dimension").min(0.0f).max(1000.0f).default_value(2.0f); - b.add_input<decl::Float>("Lacunarity").min(0.0f).max(1000.0f).default_value(2.0f); - b.add_input<decl::Float>("Offset").min(-1000.0f).max(1000.0f); - b.add_input<decl::Float>("Gain").min(0.0f).max(1000.0f).default_value(1.0f); - b.add_output<decl::Float>("Fac").no_muted_links(); + b.add_input<decl::Vector>(N_("Vector")).hide_value().implicit_field(); + b.add_input<decl::Float>(N_("W")).min(-1000.0f).max(1000.0f); + b.add_input<decl::Float>(N_("Scale")).min(-1000.0f).max(1000.0f).default_value(5.0f); + b.add_input<decl::Float>(N_("Detail")).min(0.0f).max(16.0f).default_value(2.0f); + b.add_input<decl::Float>(N_("Dimension")).min(0.0f).max(1000.0f).default_value(2.0f); + b.add_input<decl::Float>(N_("Lacunarity")).min(0.0f).max(1000.0f).default_value(2.0f); + b.add_input<decl::Float>(N_("Offset")).min(-1000.0f).max(1000.0f); + b.add_input<decl::Float>(N_("Gain")).min(0.0f).max(1000.0f).default_value(1.0f); + b.add_output<decl::Float>(N_("Fac")).no_muted_links(); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc b/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc index 6ffc8979815..72892c32795 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_noise.cc @@ -26,18 +26,18 @@ namespace blender::nodes { static void sh_node_tex_noise_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").implicit_field(); - b.add_input<decl::Float>("W").min(-1000.0f).max(1000.0f); - b.add_input<decl::Float>("Scale").min(-1000.0f).max(1000.0f).default_value(5.0f); - b.add_input<decl::Float>("Detail").min(0.0f).max(16.0f).default_value(2.0f); - b.add_input<decl::Float>("Roughness") + b.add_input<decl::Vector>(N_("Vector")).implicit_field(); + b.add_input<decl::Float>(N_("W")).min(-1000.0f).max(1000.0f); + b.add_input<decl::Float>(N_("Scale")).min(-1000.0f).max(1000.0f).default_value(5.0f); + b.add_input<decl::Float>(N_("Detail")).min(0.0f).max(16.0f).default_value(2.0f); + b.add_input<decl::Float>(N_("Roughness")) .min(0.0f) .max(1.0f) .default_value(0.5f) .subtype(PROP_FACTOR); - b.add_input<decl::Float>("Distortion").min(-1000.0f).max(1000.0f).default_value(0.0f); - b.add_output<decl::Float>("Fac").no_muted_links(); - b.add_output<decl::Color>("Color").no_muted_links(); + b.add_input<decl::Float>(N_("Distortion")).min(-1000.0f).max(1000.0f).default_value(0.0f); + b.add_output<decl::Float>(N_("Fac")).no_muted_links(); + b.add_output<decl::Color>(N_("Color")).no_muted_links(); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc index 574260f3c36..422268b98c3 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_voronoi.cc @@ -26,25 +26,25 @@ namespace blender::nodes { static void sh_node_tex_voronoi_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").hide_value().implicit_field(); - b.add_input<decl::Float>("W").min(-1000.0f).max(1000.0f); - b.add_input<decl::Float>("Scale").min(-1000.0f).max(1000.0f).default_value(5.0f); - b.add_input<decl::Float>("Smoothness") + b.add_input<decl::Vector>(N_("Vector")).hide_value().implicit_field(); + b.add_input<decl::Float>(N_("W")).min(-1000.0f).max(1000.0f); + b.add_input<decl::Float>(N_("Scale")).min(-1000.0f).max(1000.0f).default_value(5.0f); + b.add_input<decl::Float>(N_("Smoothness")) .min(0.0f) .max(1.0f) .default_value(1.0f) .subtype(PROP_FACTOR); - b.add_input<decl::Float>("Exponent").min(0.0f).max(32.0f).default_value(0.5f); - b.add_input<decl::Float>("Randomness") + b.add_input<decl::Float>(N_("Exponent")).min(0.0f).max(32.0f).default_value(0.5f); + b.add_input<decl::Float>(N_("Randomness")) .min(0.0f) .max(1.0f) .default_value(1.0f) .subtype(PROP_FACTOR); - b.add_output<decl::Float>("Distance").no_muted_links(); - b.add_output<decl::Color>("Color").no_muted_links(); - b.add_output<decl::Vector>("Position").no_muted_links(); - b.add_output<decl::Float>("W").no_muted_links(); - b.add_output<decl::Float>("Radius").no_muted_links(); + b.add_output<decl::Float>(N_("Distance")).no_muted_links(); + b.add_output<decl::Color>(N_("Color")).no_muted_links(); + b.add_output<decl::Vector>(N_("Position")).no_muted_links(); + b.add_output<decl::Float>(N_("W")).no_muted_links(); + b.add_output<decl::Float>(N_("Radius")).no_muted_links(); }; } // namespace blender::nodes @@ -239,16 +239,16 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { return params.readonly_single_input<float>(param_index, "Randomness"); }; auto get_r_distance = [&](int param_index) -> MutableSpan<float> { - return params.uninitialized_single_output<float>(param_index, "Distance"); + return params.uninitialized_single_output_if_required<float>(param_index, "Distance"); }; auto get_r_color = [&](int param_index) -> MutableSpan<ColorGeometry4f> { - return params.uninitialized_single_output<ColorGeometry4f>(param_index, "Color"); + return params.uninitialized_single_output_if_required<ColorGeometry4f>(param_index, "Color"); }; auto get_r_position = [&](int param_index) -> MutableSpan<float3> { - return params.uninitialized_single_output<float3>(param_index, "Position"); + return params.uninitialized_single_output_if_required<float3>(param_index, "Position"); }; auto get_r_w = [&](int param_index) -> MutableSpan<float> { - return params.uninitialized_single_output<float>(param_index, "W"); + return params.uninitialized_single_output_if_required<float>(param_index, "W"); }; int param = 0; @@ -263,6 +263,9 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; @@ -271,12 +274,16 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { exponent[i], rand, SHD_VORONOI_MINKOWSKI, - &r_distance[i], - &col, - &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float2::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, 0.0f); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + pos = float2::safe_divide(pos, scale[i]); + r_position[i] = float3(pos.x, pos.y, 0.0f); + } } break; } @@ -288,6 +295,9 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; @@ -296,12 +306,16 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { exponent[i], rand, SHD_VORONOI_MINKOWSKI, - &r_distance[i], - &col, - &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float2::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, 0.0f); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + pos = float2::safe_divide(pos, scale[i]); + r_position[i] = float3(pos.x, pos.y, 0.0f); + } } break; } @@ -314,6 +328,9 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); @@ -324,12 +341,16 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { exponent[i], rand, SHD_VORONOI_MINKOWSKI, - &r_distance[i], - &col, - &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float2::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, 0.0f); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + pos = float2::safe_divide(pos, scale[i]); + r_position[i] = float3(pos.x, pos.y, 0.0f); + } } break; } @@ -346,6 +367,9 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; @@ -353,11 +377,15 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { exponent[i], rand, SHD_VORONOI_MINKOWSKI, - &r_distance[i], - &col, - &r_position[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_position[i] = float3::safe_divide(r_position[i], scale[i]); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &r_position[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + r_position[i] = float3::safe_divide(r_position[i], scale[i]); + } } break; } @@ -369,6 +397,9 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; @@ -376,11 +407,15 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { exponent[i], rand, SHD_VORONOI_MINKOWSKI, - &r_distance[i], - &col, - &r_position[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_position[i] = float3::safe_divide(r_position[i], scale[i]); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &r_position[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + r_position[i] = float3::safe_divide(r_position[i], scale[i]); + } } break; } @@ -393,6 +428,9 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); @@ -402,11 +440,15 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { exponent[i], rand, SHD_VORONOI_MINKOWSKI, - &r_distance[i], - &col, - &r_position[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_position[i] = float3::safe_divide(r_position[i], scale[i]); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &r_position[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + r_position[i] = float3::safe_divide(r_position[i], scale[i]); + } } break; } @@ -425,16 +467,34 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); const float4 p = float4(vector[i].x, vector[i].y, vector[i].z, w[i]) * scale[i]; float3 col; float4 pos; - noise::voronoi_f1(p, exponent[i], rand, SHD_VORONOI_F1, &r_distance[i], &col, &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float4::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, pos.z); - r_w[i] = pos.w; + noise::voronoi_f1(p, + exponent[i], + rand, + SHD_VORONOI_F1, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position || calc_w ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position || calc_w) { + pos = float4::safe_divide(pos, scale[i]); + if (calc_position) { + r_position[i] = float3(pos.x, pos.y, pos.z); + } + if (calc_w) { + r_w[i] = pos.w; + } + } } break; } @@ -448,17 +508,34 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); const float4 p = float4(vector[i].x, vector[i].y, vector[i].z, w[i]) * scale[i]; float3 col; float4 pos; - noise::voronoi_f2( - p, exponent[i], rand, SHD_VORONOI_MINKOWSKI, &r_distance[i], &col, &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float4::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, pos.z); - r_w[i] = pos.w; + noise::voronoi_f2(p, + exponent[i], + rand, + SHD_VORONOI_MINKOWSKI, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position || calc_w ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position || calc_w) { + pos = float4::safe_divide(pos, scale[i]); + if (calc_position) { + r_position[i] = float3(pos.x, pos.y, pos.z); + } + if (calc_w) { + r_w[i] = pos.w; + } + } } break; } @@ -473,18 +550,36 @@ class VoronoiMinowskiFunction : public fn::MultiFunction { MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); const float4 p = float4(vector[i].x, vector[i].y, vector[i].z, w[i]) * scale[i]; float3 col; float4 pos; - noise::voronoi_smooth_f1( - p, smth, exponent[i], rand, SHD_VORONOI_MINKOWSKI, &r_distance[i], &col, &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float4::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, pos.z); - r_w[i] = pos.w; + noise::voronoi_smooth_f1(p, + smth, + exponent[i], + rand, + SHD_VORONOI_MINKOWSKI, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position || calc_w ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position || calc_w) { + pos = float4::safe_divide(pos, scale[i]); + if (calc_position) { + r_position[i] = float3(pos.x, pos.y, pos.z); + } + if (calc_w) { + r_w[i] = pos.w; + } + } } break; } @@ -572,16 +667,16 @@ class VoronoiMetricFunction : public fn::MultiFunction { return params.readonly_single_input<float>(param_index, "Randomness"); }; auto get_r_distance = [&](int param_index) -> MutableSpan<float> { - return params.uninitialized_single_output<float>(param_index, "Distance"); + return params.uninitialized_single_output_if_required<float>(param_index, "Distance"); }; auto get_r_color = [&](int param_index) -> MutableSpan<ColorGeometry4f> { - return params.uninitialized_single_output<ColorGeometry4f>(param_index, "Color"); + return params.uninitialized_single_output_if_required<ColorGeometry4f>(param_index, "Color"); }; auto get_r_position = [&](int param_index) -> MutableSpan<float3> { - return params.uninitialized_single_output<float3>(param_index, "Position"); + return params.uninitialized_single_output_if_required<float3>(param_index, "Position"); }; auto get_r_w = [&](int param_index) -> MutableSpan<float> { - return params.uninitialized_single_output<float>(param_index, "W"); + return params.uninitialized_single_output_if_required<float>(param_index, "W"); }; int param = 0; @@ -595,13 +690,24 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float p = w[i] * scale[i]; const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; - noise::voronoi_f1(p, rand, &r_distance[i], &col, &r_w[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_w[i] = safe_divide(r_w[i], scale[i]); + noise::voronoi_f1(p, + rand, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_w ? &r_w[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_w) { + r_w[i] = safe_divide(r_w[i], scale[i]); + } } break; } @@ -612,13 +718,24 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float p = w[i] * scale[i]; const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; - noise::voronoi_f2(p, rand, &r_distance[i], &col, &r_w[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_w[i] = safe_divide(r_w[i], scale[i]); + noise::voronoi_f2(p, + rand, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_w ? &r_w[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_w) { + r_w[i] = safe_divide(r_w[i], scale[i]); + } } break; } @@ -630,14 +747,26 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float p = w[i] * scale[i]; const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; - noise::voronoi_smooth_f1(p, smth, rand, &r_distance[i], &col, &r_w[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_w[i] = safe_divide(r_w[i], scale[i]); + noise::voronoi_smooth_f1(p, + smth, + rand, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_w ? &r_w[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_w) { + r_w[i] = safe_divide(r_w[i], scale[i]); + } } break; } @@ -653,6 +782,9 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; @@ -661,12 +793,16 @@ class VoronoiMetricFunction : public fn::MultiFunction { 0.0f, rand, metric_, - &r_distance[i], - &col, - &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float2::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, 0.0f); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + pos = float2::safe_divide(pos, scale[i]); + r_position[i] = float3(pos.x, pos.y, 0.0f); + } } break; } @@ -677,6 +813,9 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; @@ -685,12 +824,16 @@ class VoronoiMetricFunction : public fn::MultiFunction { 0.0f, rand, metric_, - &r_distance[i], - &col, - &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float2::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, 0.0f); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + pos = float2::safe_divide(pos, scale[i]); + r_position[i] = float3(pos.x, pos.y, 0.0f); + } } break; } @@ -702,6 +845,9 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); @@ -712,12 +858,16 @@ class VoronoiMetricFunction : public fn::MultiFunction { 0.0f, rand, metric_, - &r_distance[i], - &col, - &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float2::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, 0.0f); + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + pos = float2::safe_divide(pos, scale[i]); + r_position[i] = float3(pos.x, pos.y, 0.0f); + } } break; } @@ -733,13 +883,25 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; - noise::voronoi_f1( - vector[i] * scale[i], 0.0f, rand, metric_, &r_distance[i], &col, &r_position[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_position[i] = float3::safe_divide(r_position[i], scale[i]); + noise::voronoi_f1(vector[i] * scale[i], + 0.0f, + rand, + metric_, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &r_position[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + r_position[i] = float3::safe_divide(r_position[i], scale[i]); + } } break; } @@ -750,13 +912,25 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); float3 col; - noise::voronoi_f2( - vector[i] * scale[i], 0.0f, rand, metric_, &r_distance[i], &col, &r_position[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_position[i] = float3::safe_divide(r_position[i], scale[i]); + noise::voronoi_f2(vector[i] * scale[i], + 0.0f, + rand, + metric_, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &r_position[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + r_position[i] = float3::safe_divide(r_position[i], scale[i]); + } } break; } @@ -768,21 +942,31 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<float> r_distance = get_r_distance(param++); MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); - for (int64_t i : mask) { - const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); - const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); - float3 col; - noise::voronoi_smooth_f1(vector[i] * scale[i], - smth, - 0.0f, - rand, - metric_, - &r_distance[i], - &col, - &r_position[i]); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - r_position[i] = float3::safe_divide(r_position[i], scale[i]); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); + { + for (int64_t i : mask) { + const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); + const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); + float3 col; + noise::voronoi_smooth_f1(vector[i] * scale[i], + smth, + 0.0f, + rand, + metric_, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position ? &r_position[i] : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position) { + r_position[i] = float3::safe_divide(r_position[i], scale[i]); + } + } } + break; } } @@ -799,16 +983,34 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); const float4 p = float4(vector[i].x, vector[i].y, vector[i].z, w[i]) * scale[i]; float3 col; float4 pos; - noise::voronoi_f1(p, 0.0f, rand, metric_, &r_distance[i], &col, &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float4::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, pos.z); - r_w[i] = pos.w; + noise::voronoi_f1(p, + 0.0f, + rand, + metric_, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position || calc_w ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position || calc_w) { + pos = float4::safe_divide(pos, scale[i]); + if (calc_position) { + r_position[i] = float3(pos.x, pos.y, pos.z); + } + if (calc_w) { + r_w[i] = pos.w; + } + } } break; } @@ -821,16 +1023,34 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); const float4 p = float4(vector[i].x, vector[i].y, vector[i].z, w[i]) * scale[i]; float3 col; float4 pos; - noise::voronoi_f2(p, 0.0f, rand, metric_, &r_distance[i], &col, &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float4::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, pos.z); - r_w[i] = pos.w; + noise::voronoi_f2(p, + 0.0f, + rand, + metric_, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position || calc_w ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position || calc_w) { + pos = float4::safe_divide(pos, scale[i]); + if (calc_position) { + r_position[i] = float3(pos.x, pos.y, pos.z); + } + if (calc_w) { + r_w[i] = pos.w; + } + } } break; } @@ -844,17 +1064,36 @@ class VoronoiMetricFunction : public fn::MultiFunction { MutableSpan<ColorGeometry4f> r_color = get_r_color(param++); MutableSpan<float3> r_position = get_r_position(param++); MutableSpan<float> r_w = get_r_w(param++); + const bool calc_distance = !r_distance.is_empty(); + const bool calc_color = !r_color.is_empty(); + const bool calc_position = !r_position.is_empty(); + const bool calc_w = !r_w.is_empty(); for (int64_t i : mask) { const float smth = std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f); const float rand = std::min(std::max(randomness[i], 0.0f), 1.0f); const float4 p = float4(vector[i].x, vector[i].y, vector[i].z, w[i]) * scale[i]; float3 col; float4 pos; - noise::voronoi_smooth_f1(p, smth, 0.0f, rand, metric_, &r_distance[i], &col, &pos); - r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); - pos = float4::safe_divide(pos, scale[i]); - r_position[i] = float3(pos.x, pos.y, pos.z); - r_w[i] = pos.w; + noise::voronoi_smooth_f1(p, + smth, + 0.0f, + rand, + metric_, + calc_distance ? &r_distance[i] : nullptr, + calc_color ? &col : nullptr, + calc_position || calc_w ? &pos : nullptr); + if (calc_color) { + r_color[i] = ColorGeometry4f(col[0], col[1], col[2], 1.0f); + } + if (calc_position || calc_w) { + pos = float4::safe_divide(pos, scale[i]); + if (calc_position) { + r_position[i] = float3(pos.x, pos.y, pos.z); + } + if (calc_w) { + r_w[i] = pos.w; + } + } } break; } diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_wave.cc b/source/blender/nodes/shader/nodes/node_shader_tex_wave.cc index 25e65e3d3f0..144aa1885bd 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_wave.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_wave.cc @@ -26,19 +26,19 @@ namespace blender::nodes { static void sh_node_tex_wave_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").implicit_field(); - b.add_input<decl::Float>("Scale").min(-1000.0f).max(1000.0f).default_value(5.0f); - b.add_input<decl::Float>("Distortion").min(-1000.0f).max(1000.0f).default_value(0.0f); - b.add_input<decl::Float>("Detail").min(0.0f).max(16.0f).default_value(2.0f); - b.add_input<decl::Float>("Detail Scale").min(-1000.0f).max(1000.0f).default_value(1.0f); - b.add_input<decl::Float>("Detail Roughness") + b.add_input<decl::Vector>(N_("Vector")).implicit_field(); + b.add_input<decl::Float>(N_("Scale")).min(-1000.0f).max(1000.0f).default_value(5.0f); + b.add_input<decl::Float>(N_("Distortion")).min(-1000.0f).max(1000.0f).default_value(0.0f); + b.add_input<decl::Float>(N_("Detail")).min(0.0f).max(16.0f).default_value(2.0f); + b.add_input<decl::Float>(N_("Detail Scale")).min(-1000.0f).max(1000.0f).default_value(1.0f); + b.add_input<decl::Float>(N_("Detail Roughness")) .min(0.0f) .max(1.0f) .default_value(0.5f) .subtype(PROP_FACTOR); - b.add_input<decl::Float>("Phase Offset").min(-1000.0f).max(1000.0f).default_value(0.0f); - b.add_output<decl::Color>("Color").no_muted_links(); - b.add_output<decl::Float>("Fac").no_muted_links(); + b.add_input<decl::Float>(N_("Phase Offset")).min(-1000.0f).max(1000.0f).default_value(0.0f); + b.add_output<decl::Color>(N_("Color")).no_muted_links(); + b.add_output<decl::Float>(N_("Fac")).no_muted_links(); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_tex_white_noise.cc b/source/blender/nodes/shader/nodes/node_shader_tex_white_noise.cc index 445b201e419..43ee9400551 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tex_white_noise.cc +++ b/source/blender/nodes/shader/nodes/node_shader_tex_white_noise.cc @@ -26,10 +26,10 @@ namespace blender::nodes { static void sh_node_tex_white_noise_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").min(-10000.0f).max(10000.0f).implicit_field(); - b.add_input<decl::Float>("W").min(-10000.0f).max(10000.0f); - b.add_output<decl::Float>("Value"); - b.add_output<decl::Color>("Color"); + b.add_input<decl::Vector>(N_("Vector")).min(-10000.0f).max(10000.0f).implicit_field(); + b.add_input<decl::Float>(N_("W")).min(-10000.0f).max(10000.0f); + b.add_output<decl::Float>(N_("Value")); + b.add_output<decl::Color>(N_("Color")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_valToRgb.cc b/source/blender/nodes/shader/nodes/node_shader_valToRgb.cc index 2544ea1921c..e4f1b2c76f0 100644 --- a/source/blender/nodes/shader/nodes/node_shader_valToRgb.cc +++ b/source/blender/nodes/shader/nodes/node_shader_valToRgb.cc @@ -34,9 +34,9 @@ namespace blender::nodes { static void sh_node_valtorgb_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Float>("Fac").default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); - b.add_output<decl::Color>("Color"); - b.add_output<decl::Float>("Alpha"); + b.add_input<decl::Float>(N_("Fac")).default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR); + b.add_output<decl::Color>(N_("Color")); + b.add_output<decl::Float>(N_("Alpha")); }; } // namespace blender::nodes @@ -192,8 +192,8 @@ namespace blender::nodes { static void sh_node_rgbtobw_declare(NodeDeclarationBuilder &b) { - b.add_input<decl::Color>("Color").default_value({0.5f, 0.5f, 0.5f, 1.0f}); - b.add_output<decl::Float>("Val"); + b.add_input<decl::Color>(N_("Color")).default_value({0.5f, 0.5f, 0.5f, 1.0f}); + b.add_output<decl::Float>(N_("Val")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_value.cc b/source/blender/nodes/shader/nodes/node_shader_value.cc index 1344ce5c5d9..b0f152d8526 100644 --- a/source/blender/nodes/shader/nodes/node_shader_value.cc +++ b/source/blender/nodes/shader/nodes/node_shader_value.cc @@ -27,7 +27,7 @@ namespace blender::nodes { static void sh_node_value_declare(NodeDeclarationBuilder &b) { - b.add_output<decl::Float>("Value"); + b.add_output<decl::Float>(N_("Value")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_math.cc b/source/blender/nodes/shader/nodes/node_shader_vector_math.cc index f49ff06cef1..ca5aeea9a7d 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_math.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_math.cc @@ -30,12 +30,12 @@ namespace blender::nodes { static void sh_node_vector_math_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").min(-10000.0f).max(10000.0f); - b.add_input<decl::Vector>("Vector", "Vector_001").min(-10000.0f).max(10000.0f); - b.add_input<decl::Vector>("Vector", "Vector_002").min(-10000.0f).max(10000.0f); - b.add_input<decl::Float>("Scale").default_value(1.0f).min(-10000.0f).max(10000.0f); - b.add_output<decl::Vector>("Vector"); - b.add_output<decl::Float>("Value"); + b.add_input<decl::Vector>(N_("Vector")).min(-10000.0f).max(10000.0f); + b.add_input<decl::Vector>(N_("Vector"), "Vector_001").min(-10000.0f).max(10000.0f); + b.add_input<decl::Vector>(N_("Vector"), "Vector_002").min(-10000.0f).max(10000.0f); + b.add_input<decl::Float>(N_("Scale")).default_value(1.0f).min(-10000.0f).max(10000.0f); + b.add_output<decl::Vector>(N_("Vector")); + b.add_output<decl::Float>(N_("Value")); }; } // namespace blender::nodes diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc index c9b26fa5199..1ab643bc3fa 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc +++ b/source/blender/nodes/shader/nodes/node_shader_vector_rotate.cc @@ -28,12 +28,12 @@ namespace blender::nodes { static void sh_node_vector_rotate_declare(NodeDeclarationBuilder &b) { b.is_function_node(); - b.add_input<decl::Vector>("Vector").min(0.0f).max(1.0f).hide_value(); - b.add_input<decl::Vector>("Center"); - b.add_input<decl::Vector>("Axis").min(-1.0f).max(1.0f).default_value({0.0f, 0.0f, 1.0f}); - b.add_input<decl::Float>("Angle").subtype(PROP_ANGLE); - b.add_input<decl::Vector>("Rotation").subtype(PROP_EULER); - b.add_output<decl::Vector>("Vector"); + b.add_input<decl::Vector>(N_("Vector")).min(0.0f).max(1.0f).hide_value(); + b.add_input<decl::Vector>(N_("Center")); + b.add_input<decl::Vector>(N_("Axis")).min(-1.0f).max(1.0f).default_value({0.0f, 0.0f, 1.0f}); + b.add_input<decl::Float>(N_("Angle")).subtype(PROP_ANGLE); + b.add_input<decl::Vector>(N_("Rotation")).subtype(PROP_EULER); + b.add_output<decl::Vector>(N_("Vector")); }; } // namespace blender::nodes |