29 node_storage(node).dimensions = 1;
37 .description(
"The number of Voronoi layers to sum");
44 .description(
"The influence of a Voronoi layer relative to that of the previous layer");
50 .description(
"The scale of a Voronoi layer relative to that of the previous layer");
72 node_storage(node).dimensions = 1;
101 tex->normalize =
false;
114 "node_tex_voronoi_f1_1d",
115 "node_tex_voronoi_f1_2d",
116 "node_tex_voronoi_f1_3d",
117 "node_tex_voronoi_f1_4d",
121 "node_tex_voronoi_f2_1d",
122 "node_tex_voronoi_f2_2d",
123 "node_tex_voronoi_f2_3d",
124 "node_tex_voronoi_f2_4d",
128 "node_tex_voronoi_smooth_f1_1d",
129 "node_tex_voronoi_smooth_f1_2d",
130 "node_tex_voronoi_smooth_f1_3d",
131 "node_tex_voronoi_smooth_f1_4d",
135 "node_tex_voronoi_distance_to_edge_1d",
136 "node_tex_voronoi_distance_to_edge_2d",
137 "node_tex_voronoi_distance_to_edge_3d",
138 "node_tex_voronoi_distance_to_edge_4d",
142 "node_tex_voronoi_n_sphere_radius_1d",
143 "node_tex_voronoi_n_sphere_radius_2d",
144 "node_tex_voronoi_n_sphere_radius_3d",
145 "node_tex_voronoi_n_sphere_radius_4d",
161 float metric =
tex->distance;
235 : dimensions_(dimensions), feature_(feature), metric_(metric), normalize_(
normalize)
237 BLI_assert(dimensions >= 1 && dimensions <= 4);
240 static std::array<mf::Signature, 12> signatures{
256 this->
set_signature(&signatures[dimensions + feature * 4 - 1]);
259 static std::array<mf::Signature, 12> signatures{
275 this->
set_signature(&signatures[dimensions + feature * 4 - 1]);
284 if (
ELEM(dimensions, 2, 3, 4)) {
285 builder.single_input<
float3>(
"Vector");
287 if (
ELEM(dimensions, 1, 4)) {
288 builder.single_input<
float>(
"W");
290 builder.single_input<
float>(
"Scale");
291 builder.single_input<
float>(
"Detail");
292 builder.single_input<
float>(
"Roughness");
293 builder.single_input<
float>(
"Lacunarity");
295 builder.single_input<
float>(
"Smoothness");
298 builder.single_input<
float>(
"Exponent");
300 builder.single_input<
float>(
"Randomness");
302 builder.single_output<
float>(
"Distance", mf::ParamFlag::SupportsUnusedOutput);
303 builder.single_output<
ColorGeometry4f>(
"Color", mf::ParamFlag::SupportsUnusedOutput);
304 if (dimensions != 1) {
305 builder.single_output<
float3>(
"Position", mf::ParamFlag::SupportsUnusedOutput);
307 if (
ELEM(dimensions, 1, 4)) {
308 builder.single_output<
float>(
"W", mf::ParamFlag::SupportsUnusedOutput);
331 auto get_lacunarity = [&](
int param_index) ->
VArray<float> {
334 auto get_smoothness = [&](
int param_index) ->
VArray<float> {
340 auto get_randomness = [&](
int param_index) ->
VArray<float> {
366 get_smoothness(param++) :
369 get_exponent(param++) :
377 const bool calc_distance = !r_distance.
is_empty();
378 const bool calc_color = !r_color.
is_empty();
379 const bool calc_position = !r_position.
is_empty();
380 const bool calc_w = !r_w.
is_empty();
383 params.feature = feature_;
385 params.normalize = normalize_;
388 switch (dimensions_) {
390 mask.foreach_index([&](
const int64_t i) {
392 params.detail = detail[i];
393 params.roughness = roughness[i];
394 params.lacunarity = lacunarity[i];
396 std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f) :
399 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
400 params.max_distance = (0.5f + 0.5f *
params.randomness) *
405 r_distance[i] = output.distance;
408 r_color[i] =
ColorGeometry4f(output.color.x, output.color.y, output.color.z, 1.0f);
411 r_w[i] = output.position.w;
417 mask.foreach_index([&](
const int64_t i) {
419 params.detail = detail[i];
420 params.roughness = roughness[i];
421 params.lacunarity = lacunarity[i];
423 std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f) :
428 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
431 0.5f + 0.5f *
params.randomness),
438 r_distance[i] = output.distance;
441 r_color[i] =
ColorGeometry4f(output.color.x, output.color.y, output.color.z, 1.0f);
444 r_position[i] =
float3{output.position.x, output.position.y, 0.0f};
450 mask.foreach_index([&](
const int64_t i) {
452 params.detail = detail[i];
453 params.roughness = roughness[i];
454 params.lacunarity = lacunarity[i];
456 std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f) :
461 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
464 0.5f + 0.5f *
params.randomness,
465 0.5f + 0.5f *
params.randomness),
472 r_distance[i] = output.distance;
475 r_color[i] =
ColorGeometry4f(output.color.x, output.color.y, output.color.z, 1.0f);
478 r_position[i] =
float3{output.position.x, output.position.y, output.position.z};
484 mask.foreach_index([&](
const int64_t i) {
486 params.detail = detail[i];
487 params.roughness = roughness[i];
488 params.lacunarity = lacunarity[i];
490 std::min(std::max(smoothness[i] / 2.0f, 0.0f), 0.5f) :
495 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
498 0.5f + 0.5f *
params.randomness,
499 0.5f + 0.5f *
params.randomness,
500 0.5f + 0.5f *
params.randomness),
509 r_distance[i] = output.distance;
512 r_color[i] =
ColorGeometry4f(output.color.x, output.color.y, output.color.z, 1.0f);
515 r_position[i] =
float3{output.position.x, output.position.y, output.position.z};
518 r_w[i] = output.position.w;
539 : dimensions_(dimensions), normalize_(
normalize)
541 BLI_assert(dimensions >= 1 && dimensions <= 4);
542 static std::array<mf::Signature, 4> signatures{
556 if (
ELEM(dimensions, 2, 3, 4)) {
557 builder.single_input<
float3>(
"Vector");
559 if (
ELEM(dimensions, 1, 4)) {
560 builder.single_input<
float>(
"W");
562 builder.single_input<
float>(
"Scale");
563 builder.single_input<
float>(
"Detail");
564 builder.single_input<
float>(
"Roughness");
565 builder.single_input<
float>(
"Lacunarity");
566 builder.single_input<
float>(
"Randomness");
568 builder.single_output<
float>(
"Distance");
590 auto get_lacunarity = [&](
int param_index) ->
VArray<float> {
593 auto get_randomness = [&](
int param_index) ->
VArray<float> {
612 params.normalize = normalize_;
614 switch (dimensions_) {
616 mask.foreach_index([&](
const int64_t i) {
618 params.detail = detail[i];
619 params.roughness = roughness[i];
620 params.lacunarity = lacunarity[i];
621 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
630 mask.foreach_index([&](
const int64_t i) {
632 params.detail = detail[i];
633 params.roughness = roughness[i];
634 params.lacunarity = lacunarity[i];
635 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
644 mask.foreach_index([&](
const int64_t i) {
646 params.detail = detail[i];
647 params.roughness = roughness[i];
648 params.lacunarity = lacunarity[i];
649 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
658 mask.foreach_index([&](
const int64_t i) {
660 params.detail = detail[i];
661 params.roughness = roughness[i];
662 params.lacunarity = lacunarity[i];
663 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
687 BLI_assert(dimensions >= 1 && dimensions <= 4);
688 static std::array<mf::Signature, 4> signatures{
702 if (
ELEM(dimensions, 2, 3, 4)) {
703 builder.single_input<
float3>(
"Vector");
705 if (
ELEM(dimensions, 1, 4)) {
706 builder.single_input<
float>(
"W");
708 builder.single_input<
float>(
"Scale");
709 builder.single_input<
float>(
"Randomness");
711 builder.single_output<
float>(
"Radius");
727 auto get_randomness = [&](
int param_index) ->
VArray<float> {
744 switch (dimensions_) {
746 mask.foreach_index([&](
const int64_t i) {
748 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
755 mask.foreach_index([&](
const int64_t i) {
757 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
765 mask.foreach_index([&](
const int64_t i) {
767 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
774 mask.foreach_index([&](
const int64_t i) {
776 params.randomness = std::min(std::max(randomness[i], 0.0f), 1.0f);
822 ntype.
declare = file_ns::sh_node_tex_voronoi_declare;
823 ntype.
draw_buttons = file_ns::node_shader_buts_tex_voronoi;
824 ntype.
initfunc = file_ns::node_shader_init_tex_voronoi;
827 ntype.
gpu_fn = file_ns::node_shader_gpu_tex_voronoi;
828 ntype.
updatefunc = file_ns::node_shader_update_tex_voronoi;
#define NODE_STORAGE_FUNCS(StorageT)
#define SH_NODE_TEX_VORONOI
#define NODE_CLASS_TEXTURE
void BKE_texture_mapping_default(struct TexMapping *texmap, int type)
void BKE_texture_colormapping_default(struct ColorMapping *colormap)
@ 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)
void uiItemR(uiLayout *layout, PointerRNA *ptr, const char *propname, eUI_Item_Flag flag, const char *name, int icon)
@ UI_ITEM_R_SPLIT_EMPTY_NAME
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
SIMD_FORCE_INLINE btVector3 & normalize()
Normalize this vector x^2 + y^2 + z^2 = 1.
constexpr bool is_empty() const
const Signature & signature() const
void set_signature(const Signature *signature)
MutableSpan< T > uninitialized_single_output_if_required(int param_index, StringRef name="")
MutableSpan< T > uninitialized_single_output(int param_index, StringRef name="")
VArray< T > readonly_single_input(int param_index, StringRef name="")
void construct_and_set_matching_fn(Args &&...args)
void make_available(bNode &node) const
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
local_group_size(16, 16) .push_constant(Type b
void node_set_socket_availability(bNodeTree *ntree, bNodeSocket *sock, bool is_available)
void node_type_storage(bNodeType *ntype, const char *storagename, void(*freefunc)(bNode *node), void(*copyfunc)(bNodeTree *dest_ntree, bNode *dest_node, const bNode *src_node))
void node_register_type(bNodeType *ntype)
bNodeSocket * node_find_socket(bNode *node, eNodeSocketInOut in_out, StringRef identifier)
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 sh_fn_node_type_base(blender::bke::bNodeType *ntype, int type, const char *name, short nclass)
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)
void(* initfunc)(bNodeTree *ntree, bNode *node)
NodeGPUExecFunction gpu_fn
NodeMultiFunctionBuildFunction build_multi_function
void(* draw_buttons)(uiLayout *, bContext *C, PointerRNA *ptr)
NodeDeclareFunction declare
void(* updatefunc)(bNodeTree *ntree, bNode *node)