30 node_storage(node).dimensions = 1;
32 b.add_input<
decl::Float>(
"Scale").min(-1000.0f).
max(1000.0f).default_value(5.0f);
38 .
description(
"The number of Voronoi layers to sum");
45 .
description(
"The influence of a Voronoi layer relative to that of the previous layer");
51 .
description(
"The scale of a Voronoi layer relative to that of the previous layer");
73 node_storage(node).dimensions = 1;
75 b.add_output<
decl::Float>(
"Radius").no_muted_links().make_available(
115 "node_tex_voronoi_f1_1d",
116 "node_tex_voronoi_f1_2d",
117 "node_tex_voronoi_f1_3d",
118 "node_tex_voronoi_f1_4d",
122 "node_tex_voronoi_f2_1d",
123 "node_tex_voronoi_f2_2d",
124 "node_tex_voronoi_f2_3d",
125 "node_tex_voronoi_f2_4d",
129 "node_tex_voronoi_smooth_f1_1d",
130 "node_tex_voronoi_smooth_f1_2d",
131 "node_tex_voronoi_smooth_f1_3d",
132 "node_tex_voronoi_smooth_f1_4d",
136 "node_tex_voronoi_distance_to_edge_1d",
137 "node_tex_voronoi_distance_to_edge_2d",
138 "node_tex_voronoi_distance_to_edge_3d",
139 "node_tex_voronoi_distance_to_edge_4d",
143 "node_tex_voronoi_n_sphere_radius_1d",
144 "node_tex_voronoi_n_sphere_radius_2d",
145 "node_tex_voronoi_n_sphere_radius_3d",
146 "node_tex_voronoi_n_sphere_radius_4d",
236 : dimensions_(dimensions), feature_(feature), metric_(metric), normalize_(
normalize)
238 BLI_assert(dimensions >= 1 && dimensions <= 4);
241 static std::array<mf::Signature, 12> signatures{
257 this->
set_signature(&signatures[dimensions + feature * 4 - 1]);
260 static std::array<mf::Signature, 12> signatures{
276 this->
set_signature(&signatures[dimensions + feature * 4 - 1]);
283 mf::SignatureBuilder builder{
"voronoi_metric",
signature};
285 if (
ELEM(dimensions, 2, 3, 4)) {
286 builder.single_input<
float3>(
"Vector");
288 if (
ELEM(dimensions, 1, 4)) {
289 builder.single_input<
float>(
"W");
291 builder.single_input<
float>(
"Scale");
292 builder.single_input<
float>(
"Detail");
293 builder.single_input<
float>(
"Roughness");
294 builder.single_input<
float>(
"Lacunarity");
296 builder.single_input<
float>(
"Smoothness");
299 builder.single_input<
float>(
"Exponent");
301 builder.single_input<
float>(
"Randomness");
303 builder.single_output<
float>(
"Distance", mf::ParamFlag::SupportsUnusedOutput);
304 builder.single_output<
ColorGeometry4f>(
"Color", mf::ParamFlag::SupportsUnusedOutput);
305 if (dimensions != 1) {
306 builder.single_output<
float3>(
"Position", mf::ParamFlag::SupportsUnusedOutput);
308 if (
ELEM(dimensions, 1, 4)) {
309 builder.single_output<
float>(
"W", mf::ParamFlag::SupportsUnusedOutput);
318 return mf_params.readonly_single_input<
float3>(param_index,
"Vector");
321 return mf_params.readonly_single_input<
float>(param_index,
"W");
324 return mf_params.readonly_single_input<
float>(param_index,
"Scale");
327 return mf_params.readonly_single_input<
float>(param_index,
"Detail");
330 return mf_params.readonly_single_input<
float>(param_index,
"Roughness");
332 auto get_lacunarity = [&](
int param_index) ->
VArray<float> {
333 return mf_params.readonly_single_input<
float>(param_index,
"Lacunarity");
335 auto get_smoothness = [&](
int param_index) ->
VArray<float> {
336 return mf_params.readonly_single_input<
float>(param_index,
"Smoothness");
339 return mf_params.readonly_single_input<
float>(param_index,
"Exponent");
341 auto get_randomness = [&](
int param_index) ->
VArray<float> {
342 return mf_params.readonly_single_input<
float>(param_index,
"Randomness");
345 return mf_params.uninitialized_single_output_if_required<
float>(param_index,
"Distance");
348 return mf_params.uninitialized_single_output_if_required<
ColorGeometry4f>(param_index,
352 return mf_params.uninitialized_single_output_if_required<
float3>(param_index,
"Position");
355 return mf_params.uninitialized_single_output_if_required<
float>(param_index,
"W");
367 get_smoothness(param++) :
370 get_exponent(param++) :
378 const bool calc_distance = !r_distance.
is_empty();
379 const bool calc_color = !r_color.
is_empty();
380 const bool calc_position = !r_position.
is_empty();
381 const bool calc_w = !r_w.
is_empty();
384 params.feature = feature_;
386 params.normalize = normalize_;
389 switch (dimensions_) {
394 params.roughness = roughness[
i];
395 params.lacunarity = lacunarity[
i];
397 std::min(std::max(smoothness[
i] / 2.0f, 0.0f), 0.5f) :
400 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
401 params.max_distance = (0.5f + 0.5f *
params.randomness) *
406 r_distance[
i] =
output.distance;
421 params.roughness = roughness[
i];
422 params.lacunarity = lacunarity[
i];
424 std::min(std::max(smoothness[
i] / 2.0f, 0.0f), 0.5f) :
429 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
432 0.5f + 0.5f *
params.randomness),
439 r_distance[
i] =
output.distance;
454 params.roughness = roughness[
i];
455 params.lacunarity = lacunarity[
i];
457 std::min(std::max(smoothness[
i] / 2.0f, 0.0f), 0.5f) :
462 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
465 0.5f + 0.5f *
params.randomness,
466 0.5f + 0.5f *
params.randomness),
473 r_distance[
i] =
output.distance;
488 params.roughness = roughness[
i];
489 params.lacunarity = lacunarity[
i];
491 std::min(std::max(smoothness[
i] / 2.0f, 0.0f), 0.5f) :
496 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
499 0.5f + 0.5f *
params.randomness,
500 0.5f + 0.5f *
params.randomness,
501 0.5f + 0.5f *
params.randomness),
510 r_distance[
i] =
output.distance;
540 : dimensions_(dimensions), normalize_(
normalize)
542 BLI_assert(dimensions >= 1 && dimensions <= 4);
543 static std::array<mf::Signature, 4> signatures{
555 mf::SignatureBuilder builder{
"voronoi_dist_to_edge",
signature};
557 if (
ELEM(dimensions, 2, 3, 4)) {
558 builder.single_input<
float3>(
"Vector");
560 if (
ELEM(dimensions, 1, 4)) {
561 builder.single_input<
float>(
"W");
563 builder.single_input<
float>(
"Scale");
564 builder.single_input<
float>(
"Detail");
565 builder.single_input<
float>(
"Roughness");
566 builder.single_input<
float>(
"Lacunarity");
567 builder.single_input<
float>(
"Randomness");
569 builder.single_output<
float>(
"Distance");
577 return mf_params.readonly_single_input<
float3>(param_index,
"Vector");
580 return mf_params.readonly_single_input<
float>(param_index,
"W");
583 return mf_params.readonly_single_input<
float>(param_index,
"Scale");
586 return mf_params.readonly_single_input<
float>(param_index,
"Detail");
589 return mf_params.readonly_single_input<
float>(param_index,
"Roughness");
591 auto get_lacunarity = [&](
int param_index) ->
VArray<float> {
592 return mf_params.readonly_single_input<
float>(param_index,
"Lacunarity");
594 auto get_randomness = [&](
int param_index) ->
VArray<float> {
595 return mf_params.readonly_single_input<
float>(param_index,
"Randomness");
598 return mf_params.uninitialized_single_output<
float>(param_index,
"Distance");
613 params.normalize = normalize_;
615 switch (dimensions_) {
620 params.roughness = roughness[
i];
621 params.lacunarity = lacunarity[
i];
622 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
634 params.roughness = roughness[
i];
635 params.lacunarity = lacunarity[
i];
636 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
648 params.roughness = roughness[
i];
649 params.lacunarity = lacunarity[
i];
650 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
662 params.roughness = roughness[
i];
663 params.lacunarity = lacunarity[
i];
664 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
688 BLI_assert(dimensions >= 1 && dimensions <= 4);
689 static std::array<mf::Signature, 4> signatures{
701 mf::SignatureBuilder builder{
"voronoi_n_sphere",
signature};
703 if (
ELEM(dimensions, 2, 3, 4)) {
704 builder.single_input<
float3>(
"Vector");
706 if (
ELEM(dimensions, 1, 4)) {
707 builder.single_input<
float>(
"W");
709 builder.single_input<
float>(
"Scale");
710 builder.single_input<
float>(
"Randomness");
712 builder.single_output<
float>(
"Radius");
720 return mf_params.readonly_single_input<
float3>(param_index,
"Vector");
723 return mf_params.readonly_single_input<
float>(param_index,
"W");
726 return mf_params.readonly_single_input<
float>(param_index,
"Scale");
728 auto get_randomness = [&](
int param_index) ->
VArray<float> {
729 return mf_params.readonly_single_input<
float>(param_index,
"Randomness");
732 return mf_params.uninitialized_single_output<
float>(param_index,
"Radius");
745 switch (dimensions_) {
749 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
758 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
768 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
777 params.randomness = std::min(std::max(randomness[
i], 0.0f), 1.0f);
823 ntype.
ui_name =
"Voronoi Texture";
825 "Generate Worley noise based on the distance to random points. Typically used to generate "
826 "textures such as stones, water, or biological cells";
829 ntype.
declare = file_ns::sh_node_tex_voronoi_declare;
830 ntype.
draw_buttons = file_ns::node_shader_buts_tex_voronoi;
831 ntype.
initfunc = file_ns::node_shader_init_tex_voronoi;
834 ntype.
gpu_fn = file_ns::node_shader_gpu_tex_voronoi;
835 ntype.
updatefunc = file_ns::node_shader_update_tex_voronoi;
#define NODE_STORAGE_FUNCS(StorageT)
constexpr int NODE_DEFAULT_MAX_WIDTH
#define NODE_CLASS_TEXTURE
#define SH_NODE_TEX_VORONOI
void BKE_texture_mapping_default(struct TexMapping *texmap, int type)
void BKE_texture_colormapping_default(struct ColorMapping *colormap)
@ NODE_DEFAULT_INPUT_POSITION_FIELD
@ SHD_VORONOI_DISTANCE_TO_EDGE
@ SHD_VORONOI_N_SPHERE_RADIUS
bool GPU_stack_link(GPUMaterial *mat, const bNode *node, const char *name, GPUNodeStack *in, GPUNodeStack *out,...)
GPUNodeLink * GPU_constant(const float *num)
@ UI_ITEM_R_SPLIT_EMPTY_NAME
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
constexpr bool is_empty() const
const Signature & signature() const
void set_signature(const Signature *signature)
void construct_and_set_matching_fn(Args &&...args)
VoronoiDistToEdgeFunction(int dimensions, bool normalize)
ExecutionHints get_execution_hints() const override
void call(const IndexMask &mask, mf::Params mf_params, mf::Context) const override
static mf::Signature create_signature(int dimensions)
ExecutionHints get_execution_hints() const override
void call(const IndexMask &mask, mf::Params mf_params, mf::Context) const override
static mf::Signature create_signature(int dimensions, int feature, int metric)
VoronoiMetricFunction(int dimensions, int feature, int metric, bool normalize)
void call(const IndexMask &mask, mf::Params mf_params, mf::Context) const override
VoronoiNSphereFunction(int dimensions)
static mf::Signature create_signature(int dimensions)
ExecutionHints get_execution_hints() const override
VecBase< float, D > normalize(VecOp< float, D >) RET
void * MEM_callocN(size_t len, const char *str)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
bNodeSocket * node_find_socket(bNode &node, eNodeSocketInOut in_out, StringRef identifier)
void node_type_size(bNodeType &ntype, int width, int minwidth, int maxwidth)
void node_register_type(bNodeType &ntype)
void node_set_socket_availability(bNodeTree &ntree, bNodeSocket &sock, bool is_available)
void node_type_storage(bNodeType &ntype, std::optional< StringRefNull > storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
static const char * gpu_shader_get_name(const int feature, const int dimensions)
static void sh_node_tex_voronoi_declare(NodeDeclarationBuilder &b)
static mf::MultiFunction::ExecutionHints voronoi_execution_hints
static void sh_node_voronoi_build_multi_function(NodeMultiFunctionBuilder &builder)
static void node_shader_update_tex_voronoi(bNodeTree *ntree, bNode *node)
static int node_shader_gpu_tex_voronoi(GPUMaterial *mat, bNode *node, bNodeExecData *, GPUNodeStack *in, GPUNodeStack *out)
static void node_shader_init_tex_voronoi(bNodeTree *, bNode *node)
static void node_shader_buts_tex_voronoi(uiLayout *layout, bContext *, PointerRNA *ptr)
template VoronoiOutput fractal_voronoi_x_fx< float4 >(const VoronoiParams ¶ms, const float4 coord, const bool calc_color)
template float fractal_voronoi_distance_to_edge< float >(const VoronoiParams ¶ms, const float coord)
float voronoi_n_sphere_radius(const VoronoiParams ¶ms, const float coord)
template VoronoiOutput fractal_voronoi_x_fx< float3 >(const VoronoiParams ¶ms, const float3 coord, const bool calc_color)
float voronoi_distance(const float a, const float b)
template VoronoiOutput fractal_voronoi_x_fx< float >(const VoronoiParams ¶ms, const float coord, const bool calc_color)
template float fractal_voronoi_distance_to_edge< float3 >(const VoronoiParams ¶ms, const float3 coord)
template VoronoiOutput fractal_voronoi_x_fx< float2 >(const VoronoiParams ¶ms, const float2 coord, const bool calc_color)
template float fractal_voronoi_distance_to_edge< float4 >(const VoronoiParams ¶ms, const float4 coord)
template float fractal_voronoi_distance_to_edge< float2 >(const VoronoiParams ¶ms, const float2 coord)
VecBase< float, 4 > float4
VecBase< float, 2 > float2
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
VecBase< float, 3 > float3
void register_node_type_sh_tex_voronoi()
void node_shader_gpu_tex_mapping(GPUMaterial *mat, bNode *node, GPUNodeStack *in, GPUNodeStack *)
void node_shader_gpu_default_tex_coord(GPUMaterial *mat, bNode *node, GPUNodeLink **link)
void common_node_type_base(blender::bke::bNodeType *ntype, std::string idname, const std::optional< int16_t > legacy_type)
void node_free_standard_storage(bNode *node)
void node_copy_standard_storage(bNodeTree *, bNode *dest_node, const bNode *src_node)
int RNA_enum_get(PointerRNA *ptr, const char *name)
ColorMapping color_mapping
std::string ui_description
void(* initfunc)(bNodeTree *ntree, bNode *node)
NodeGPUExecFunction gpu_fn
NodeMultiFunctionBuildFunction build_multi_function
const char * enum_name_legacy
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
NodeDeclareFunction declare
void(* updatefunc)(bNodeTree *ntree, bNode *node)
void prop(PointerRNA *ptr, PropertyRNA *prop, int index, int value, eUI_Item_Flag flag, std::optional< blender::StringRef > name_opt, int icon, std::optional< blender::StringRef > placeholder=std::nullopt)