Fix #109254: Voronoi distance output is clamped at 8

The Voronoi distance output is clamped at 8, which is apparent for distance
metrics like Minkowski with low exponents.

This patch fixes that by setting the initial distance of the search loop to
FLT_MAX instead of 8. And for the Smooth variant of F1, the "h" parameter is set
to 1 for the first iteration using a signal value, effectively ignoring the
initial distance and using the computed distance at the first iteration instead.

Pull Request: https://projects.blender.org/blender/blender/pulls/109286
This commit is contained in:
Hoshinova 2023-07-10 17:42:24 +02:00 committed by Omar Emara
parent b65dfb26f9
commit 41335edf22
5 changed files with 211 additions and 152 deletions

@ -156,7 +156,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, float coord)
float cellPosition = floor(coord);
float localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
float targetOffset = 0.0;
float targetPosition = 0.0;
for (int i = -1; i <= 1; i++) {
@ -183,16 +183,19 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, float coord)
float cellPosition = floor(coord);
float localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
float smoothPosition = 0.0;
vector3 smoothColor = vector3(0.0, 0.0, 0.0);
float h = -1.0;
for (int i = -2; i <= 2; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
hash_float_to_float(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ? 1.0 :
smoothstep(0.0,
1.0,
0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -213,8 +216,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, float coord)
float cellPosition = floor(coord);
float localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float offsetF1 = 0.0;
float positionF1 = 0.0;
float offsetF2 = 0.0;
@ -267,7 +270,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord)
float closestPoint = 0.0;
float closestPointOffset = 0.0;
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int i = -1; i <= 1; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
@ -280,7 +283,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
float closestPointToClosestPoint = 0.0;
for (int i = -1; i <= 1; i++) {
if (i == 0) {
@ -311,7 +314,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vector2 coord)
vector2 cellPosition = floor(coord);
vector2 localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
vector2 targetOffset = vector2(0.0, 0.0);
vector2 targetPosition = vector2(0.0, 0.0);
for (int j = -1; j <= 1; j++) {
@ -340,17 +343,20 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector2 coord)
vector2 cellPosition = floor(coord);
vector2 localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
vector3 smoothColor = vector3(0.0, 0.0, 0.0);
vector2 smoothPosition = vector2(0.0, 0.0);
float h = -1.0;
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
vector2 cellOffset = vector2(i, j);
vector2 pointPosition = cellOffset + hash_vector2_to_vector2(cellPosition + cellOffset) *
params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ?
1.0 :
smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -372,8 +378,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vector2 coord)
vector2 cellPosition = floor(coord);
vector2 localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
vector2 offsetF1 = vector2(0.0, 0.0);
vector2 positionF1 = vector2(0.0, 0.0);
vector2 offsetF2 = vector2(0.0, 0.0);
@ -413,7 +419,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector2 coord)
vector2 localPosition = coord - cellPosition;
vector2 vectorToClosest = vector2(0.0, 0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
vector2 cellOffset = vector2(i, j);
@ -429,7 +435,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector2 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
vector2 cellOffset = vector2(i, j);
@ -456,7 +462,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector2 coord)
vector2 closestPoint = vector2(0.0, 0.0);
vector2 closestPointOffset = vector2(0.0, 0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
vector2 cellOffset = vector2(i, j);
@ -471,7 +477,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector2 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
vector2 closestPointToClosestPoint = vector2(0.0, 0.0);
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -504,7 +510,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vector3 coord)
vector3 cellPosition = floor(coord);
vector3 localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
vector3 targetOffset = vector3(0.0, 0.0, 0.0);
vector3 targetPosition = vector3(0.0, 0.0, 0.0);
for (int k = -1; k <= 1; k++) {
@ -535,9 +541,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector3 coord)
vector3 cellPosition = floor(coord);
vector3 localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
vector3 smoothColor = vector3(0.0, 0.0, 0.0);
vector3 smoothPosition = vector3(0.0, 0.0, 0.0);
float h = -1.0;
for (int k = -2; k <= 2; k++) {
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
@ -545,8 +552,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector3 coord)
vector3 pointPosition = cellOffset + hash_vector3_to_vector3(cellPosition + cellOffset) *
params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ?
1.0 :
smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -569,8 +578,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vector3 coord)
vector3 cellPosition = floor(coord);
vector3 localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
vector3 offsetF1 = vector3(0.0, 0.0, 0.0);
vector3 positionF1 = vector3(0.0, 0.0, 0.0);
vector3 offsetF2 = vector3(0.0, 0.0, 0.0);
@ -612,7 +621,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector3 coord)
vector3 localPosition = coord - cellPosition;
vector3 vectorToClosest = vector3(0.0, 0.0, 0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -630,7 +639,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector3 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -659,7 +668,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector3 coord)
vector3 closestPoint = vector3(0.0, 0.0, 0.0);
vector3 closestPointOffset = vector3(0.0, 0.0, 0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -676,7 +685,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector3 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
vector3 closestPointToClosestPoint = vector3(0.0, 0.0, 0.0);
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -711,7 +720,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vector4 coord)
vector4 cellPosition = floor(coord);
vector4 localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
vector4 targetOffset = vector4(0.0, 0.0, 0.0, 0.0);
vector4 targetPosition = vector4(0.0, 0.0, 0.0, 0.0);
for (int u = -1; u <= 1; u++) {
@ -744,9 +753,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector4 coord)
vector4 cellPosition = floor(coord);
vector4 localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
vector3 smoothColor = vector3(0.0, 0.0, 0.0);
vector4 smoothPosition = vector4(0.0, 0.0, 0.0, 0.0);
float h = -1.0;
for (int u = -2; u <= 2; u++) {
for (int k = -2; k <= 2; k++) {
for (int j = -2; j <= 2; j++) {
@ -755,8 +765,11 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vector4 coord)
vector4 pointPosition = cellOffset + hash_vector4_to_vector4(cellPosition + cellOffset) *
params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ?
1.0 :
smoothstep(0.0,
1.0,
0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -780,8 +793,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vector4 coord)
vector4 cellPosition = floor(coord);
vector4 localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
vector4 offsetF1 = vector4(0.0, 0.0, 0.0, 0.0);
vector4 positionF1 = vector4(0.0, 0.0, 0.0, 0.0);
vector4 offsetF2 = vector4(0.0, 0.0, 0.0, 0.0);
@ -825,7 +838,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector4 coord)
vector4 localPosition = coord - cellPosition;
vector4 vectorToClosest = vector4(0.0, 0.0, 0.0, 0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -845,7 +858,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vector4 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -876,7 +889,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector4 coord)
vector4 closestPoint = vector4(0.0, 0.0, 0.0, 0.0);
vector4 closestPointOffset = vector4(0.0, 0.0, 0.0, 0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -895,7 +908,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vector4 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
vector4 closestPointToClosestPoint = vector4(0.0, 0.0, 0.0, 0.0);
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {

@ -10,6 +10,9 @@
#include "stdosl.h"
// Constants
#define FLT_MAX 3.402823466e+38 // max value
// Declaration of built-in functions and closures, stdosl.h does not make
// these available so we have to redefine them.
#define BUILTIN [[int builtin = 1]]

@ -82,7 +82,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams &params, con
float cellPosition = floorf(coord);
float localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float targetOffset = 0.0f;
float targetPosition = 0.0f;
for (int i = -1; i <= 1; i++) {
@ -110,16 +110,19 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams &para
float cellPosition = floorf(coord);
float localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float smoothPosition = 0.0f;
float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f);
float h = -1.0f;
for (int i = -2; i <= 2; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
hash_float_to_float(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -140,8 +143,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams &params, con
float cellPosition = floorf(coord);
float localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float offsetF1 = 0.0f;
float positionF1 = 0.0f;
float offsetF2 = 0.0f;
@ -196,7 +199,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
float closestPoint = 0.0f;
float closestPointOffset = 0.0f;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int i = -1; i <= 1; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
@ -209,7 +212,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float closestPointToClosestPoint = 0.0f;
for (int i = -1; i <= 1; i++) {
if (i == 0) {
@ -240,7 +243,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams &params, con
float2 cellPosition = floor(coord);
float2 localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float2 targetOffset = make_float2(0.0f, 0.0f);
float2 targetPosition = make_float2(0.0f, 0.0f);
for (int j = -1; j <= 1; j++) {
@ -270,17 +273,21 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams &para
float2 cellPosition = floor(coord);
float2 localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f);
float2 smoothPosition = make_float2(0.0f, 0.0f);
float h = -1.0f;
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
float2 cellOffset = make_float2(i, j);
float2 pointPosition = cellOffset +
hash_float2_to_float2(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(0.0f,
1.0f,
0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -302,8 +309,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams &params, con
float2 cellPosition = floor(coord);
float2 localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float2 offsetF1 = make_float2(0.0f, 0.0f);
float2 positionF1 = make_float2(0.0f, 0.0f);
float2 offsetF2 = make_float2(0.0f, 0.0f);
@ -344,7 +351,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams &param
float2 localPosition = coord - cellPosition;
float2 vectorToClosest = make_float2(0.0f, 0.0f);
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
float2 cellOffset = make_float2(i, j);
@ -359,7 +366,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams &param
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
float2 cellOffset = make_float2(i, j);
@ -386,7 +393,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
float2 closestPoint = make_float2(0.0f, 0.0f);
float2 closestPointOffset = make_float2(0.0f, 0.0f);
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
float2 cellOffset = make_float2(i, j);
@ -401,7 +408,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float2 closestPointToClosestPoint = make_float2(0.0f, 0.0f);
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -434,7 +441,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams &params, con
float3 cellPosition = floor(coord);
float3 localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float3 targetOffset = make_float3(0.0f, 0.0f, 0.0f);
float3 targetPosition = make_float3(0.0f, 0.0f, 0.0f);
for (int k = -1; k <= 1; k++) {
@ -466,9 +473,10 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams &para
float3 cellPosition = floor(coord);
float3 localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f);
float3 smoothPosition = make_float3(0.0f, 0.0f, 0.0f);
float h = -1.0f;
for (int k = -2; k <= 2; k++) {
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
@ -476,8 +484,11 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams &para
float3 pointPosition = cellOffset + hash_float3_to_float3(cellPosition + cellOffset) *
params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(0.0f,
1.0f,
0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -500,8 +511,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams &params, con
float3 cellPosition = floor(coord);
float3 localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float3 offsetF1 = make_float3(0.0f, 0.0f, 0.0f);
float3 positionF1 = make_float3(0.0f, 0.0f, 0.0f);
float3 offsetF2 = make_float3(0.0f, 0.0f, 0.0f);
@ -544,7 +555,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams &param
float3 localPosition = coord - cellPosition;
float3 vectorToClosest = make_float3(0.0f, 0.0f, 0.0f);
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -562,7 +573,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams &param
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -592,7 +603,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
float3 closestPoint = make_float3(0.0f, 0.0f, 0.0f);
float3 closestPointOffset = make_float3(0.0f, 0.0f, 0.0f);
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -609,7 +620,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float3 closestPointToClosestPoint = make_float3(0.0f, 0.0f, 0.0f);
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -644,7 +655,7 @@ ccl_device VoronoiOutput voronoi_f1(ccl_private const VoronoiParams &params, con
float4 cellPosition = floor(coord);
float4 localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float4 targetOffset = zero_float4();
float4 targetPosition = zero_float4();
for (int u = -1; u <= 1; u++) {
@ -679,9 +690,10 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams &para
float4 cellPosition = floor(coord);
float4 localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float3 smoothColor = make_float3(0.0f, 0.0f, 0.0f);
float4 smoothPosition = zero_float4();
float h = -1.0f;
for (int u = -2; u <= 2; u++) {
for (int k = -2; k <= 2; k++) {
ccl_loop_no_unroll for (int j = -2; j <= 2; j++)
@ -691,8 +703,11 @@ ccl_device VoronoiOutput voronoi_smooth_f1(ccl_private const VoronoiParams &para
float4 pointPosition = cellOffset + hash_float4_to_float4(cellPosition + cellOffset) *
params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(0.0f,
1.0f,
0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -716,8 +731,8 @@ ccl_device VoronoiOutput voronoi_f2(ccl_private const VoronoiParams &params, con
float4 cellPosition = floor(coord);
float4 localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float4 offsetF1 = zero_float4();
float4 positionF1 = zero_float4();
float4 offsetF2 = zero_float4();
@ -763,7 +778,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams &param
float4 localPosition = coord - cellPosition;
float4 vectorToClosest = zero_float4();
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
ccl_loop_no_unroll for (int j = -1; j <= 1; j++)
@ -784,7 +799,7 @@ ccl_device float voronoi_distance_to_edge(ccl_private const VoronoiParams &param
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
ccl_loop_no_unroll for (int j = -1; j <= 1; j++)
@ -817,7 +832,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
float4 closestPoint = zero_float4();
float4 closestPointOffset = zero_float4();
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
ccl_loop_no_unroll for (int j = -1; j <= 1; j++)
@ -837,7 +852,7 @@ ccl_device float voronoi_n_sphere_radius(ccl_private const VoronoiParams &params
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float4 closestPointToClosestPoint = zero_float4();
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {

@ -1464,7 +1464,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams &params, const float coord)
float cellPosition = floorf(coord);
float localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float targetOffset = 0.0f;
float targetPosition = 0.0f;
for (int i = -1; i <= 1; i++) {
@ -1493,16 +1493,19 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams &params,
float cellPosition = floorf(coord);
float localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float smoothPosition = 0.0f;
float3 smoothColor = {0.0f, 0.0f, 0.0f};
float h = -1.0f;
for (int i = -2; i <= 2; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
hash_float_to_float(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -1526,8 +1529,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams &params, const float coord)
float cellPosition = floorf(coord);
float localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float offsetF1 = 0.0f;
float positionF1 = 0.0f;
float offsetF2 = 0.0f;
@ -1580,7 +1583,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float coord)
float closestPoint = 0.0f;
float closestPointOffset = 0.0f;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int i = -1; i <= 1; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
@ -1593,7 +1596,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float coord)
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float closestPointToClosestPoint = 0.0f;
for (int i = -1; i <= 1; i++) {
if (i == 0) {
@ -1624,7 +1627,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams &params, const float2 coord)
float2 cellPosition = math::floor(coord);
float2 localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float2 targetOffset = {0.0f, 0.0f};
float2 targetPosition = {0.0f, 0.0f};
for (int j = -1; j <= 1; j++) {
@ -1655,17 +1658,21 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams &params,
float2 cellPosition = math::floor(coord);
float2 localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float3 smoothColor = {0.0f, 0.0f, 0.0f};
float2 smoothPosition = {0.0f, 0.0f};
float h = -1.0f;
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
float2 cellOffset(i, j);
float2 pointPosition = cellOffset +
hash_float_to_float2(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(0.0f,
1.0f,
0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -1690,8 +1697,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams &params, const float2 coord)
float2 cellPosition = math::floor(coord);
float2 localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float2 offsetF1 = {0.0f, 0.0f};
float2 positionF1 = {0.0f, 0.0f};
float2 offsetF2 = {0.0f, 0.0f};
@ -1731,7 +1738,7 @@ float voronoi_distance_to_edge(const VoronoiParams &params, const float2 coord)
float2 localPosition = coord - cellPosition;
float2 vectorToClosest = {0.0f, 0.0f};
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
float2 cellOffset(i, j);
@ -1746,7 +1753,7 @@ float voronoi_distance_to_edge(const VoronoiParams &params, const float2 coord)
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
float2 cellOffset(i, j);
@ -1772,7 +1779,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float2 coord)
float2 closestPoint = {0.0f, 0.0f};
float2 closestPointOffset = {0.0f, 0.0f};
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
float2 cellOffset(i, j);
@ -1787,7 +1794,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float2 coord)
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float2 closestPointToClosestPoint = {0.0f, 0.0f};
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -1820,7 +1827,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams &params, const float3 coord)
float3 cellPosition = math::floor(coord);
float3 localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float3 targetOffset = {0.0f, 0.0f, 0.0f};
float3 targetPosition = {0.0f, 0.0f, 0.0f};
for (int k = -1; k <= 1; k++) {
@ -1853,9 +1860,10 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams &params,
float3 cellPosition = math::floor(coord);
float3 localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float3 smoothColor = {0.0f, 0.0f, 0.0f};
float3 smoothPosition = {0.0f, 0.0f, 0.0f};
float h = -1.0f;
for (int k = -2; k <= 2; k++) {
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
@ -1863,8 +1871,11 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams &params,
float3 pointPosition = cellOffset +
hash_float_to_float3(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(0.0f,
1.0f,
0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -1890,8 +1901,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams &params, const float3 coord)
float3 cellPosition = math::floor(coord);
float3 localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float3 offsetF1 = {0.0f, 0.0f, 0.0f};
float3 positionF1 = {0.0f, 0.0f, 0.0f};
float3 offsetF2 = {0.0f, 0.0f, 0.0f};
@ -1933,7 +1944,7 @@ float voronoi_distance_to_edge(const VoronoiParams &params, const float3 coord)
float3 localPosition = coord - cellPosition;
float3 vectorToClosest = {0.0f, 0.0f, 0.0f};
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -1951,7 +1962,7 @@ float voronoi_distance_to_edge(const VoronoiParams &params, const float3 coord)
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -1980,7 +1991,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float3 coord)
float3 closestPoint = {0.0f, 0.0f, 0.0f};
float3 closestPointOffset = {0.0f, 0.0f, 0.0f};
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -1997,7 +2008,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float3 coord)
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float3 closestPointToClosestPoint = {0.0f, 0.0f, 0.0f};
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -2032,7 +2043,7 @@ VoronoiOutput voronoi_f1(const VoronoiParams &params, const float4 coord)
float4 cellPosition = math::floor(coord);
float4 localPosition = coord - cellPosition;
float minDistance = 8.0f;
float minDistance = FLT_MAX;
float4 targetOffset = {0.0f, 0.0f, 0.0f, 0.0f};
float4 targetPosition = {0.0f, 0.0f, 0.0f, 0.0f};
for (int u = -1; u <= 1; u++) {
@ -2067,9 +2078,10 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams &params,
float4 cellPosition = math::floor(coord);
float4 localPosition = coord - cellPosition;
float smoothDistance = 8.0f;
float smoothDistance = 0.0f;
float3 smoothColor = {0.0f, 0.0f, 0.0f};
float4 smoothPosition = {0.0f, 0.0f, 0.0f, 0.0f};
float h = -1.0f;
for (int u = -2; u <= 2; u++) {
for (int k = -2; k <= 2; k++) {
for (int j = -2; j <= 2; j++) {
@ -2078,8 +2090,11 @@ VoronoiOutput voronoi_smooth_f1(const VoronoiParams &params,
float4 pointPosition = cellOffset + hash_float_to_float4(cellPosition + cellOffset) *
params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0f ?
1.0f :
smoothstep(0.0f,
1.0f,
0.5f + 0.5f * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0f - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0f + 3.0f * params.smoothness;
@ -2106,8 +2121,8 @@ VoronoiOutput voronoi_f2(const VoronoiParams &params, const float4 coord)
float4 cellPosition = math::floor(coord);
float4 localPosition = coord - cellPosition;
float distanceF1 = 8.0f;
float distanceF2 = 8.0f;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float4 offsetF1 = {0.0f, 0.0f, 0.0f, 0.0f};
float4 positionF1 = {0.0f, 0.0f, 0.0f, 0.0f};
float4 offsetF2 = {0.0f, 0.0f, 0.0f, 0.0f};
@ -2151,7 +2166,7 @@ float voronoi_distance_to_edge(const VoronoiParams &params, const float4 coord)
float4 localPosition = coord - cellPosition;
float4 vectorToClosest = {0.0f, 0.0f, 0.0f, 0.0f};
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -2171,7 +2186,7 @@ float voronoi_distance_to_edge(const VoronoiParams &params, const float4 coord)
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -2202,7 +2217,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float4 coord)
float4 closestPoint = {0.0f, 0.0f, 0.0f, 0.0f};
float4 closestPointOffset = {0.0f, 0.0f, 0.0f, 0.0f};
float minDistance = 8.0f;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -2221,7 +2236,7 @@ float voronoi_n_sphere_radius(const VoronoiParams &params, const float4 coord)
}
}
minDistance = 8.0f;
minDistance = FLT_MAX;
float4 closestPointToClosestPoint = {0.0f, 0.0f, 0.0f, 0.0f};
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {

@ -129,7 +129,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, float coord)
float cellPosition = floor(coord);
float localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
float targetOffset = 0.0;
float targetPosition = 0.0;
for (int i = -1; i <= 1; i++) {
@ -156,16 +156,19 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, float coord)
float cellPosition = floor(coord);
float localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
float smoothPosition = 0.0;
vec3 smoothColor = vec3(0.0);
float h = -1.0;
for (int i = -2; i <= 2; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
hash_float_to_float(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ? 1.0 :
smoothstep(0.0,
1.0,
0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -186,8 +189,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, float coord)
float cellPosition = floor(coord);
float localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
float offsetF1 = 0.0;
float positionF1 = 0.0;
float offsetF2 = 0.0;
@ -240,7 +243,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord)
float closestPoint = 0.0;
float closestPointOffset = 0.0;
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int i = -1; i <= 1; i++) {
float cellOffset = i;
float pointPosition = cellOffset +
@ -253,7 +256,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, float coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
float closestPointToClosestPoint = 0.0;
for (int i = -1; i <= 1; i++) {
if (i == 0) {
@ -284,7 +287,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vec2 coord)
vec2 cellPosition = floor(coord);
vec2 localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
vec2 targetOffset = vec2(0.0);
vec2 targetPosition = vec2(0.0);
for (int j = -1; j <= 1; j++) {
@ -313,17 +316,20 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec2 coord)
vec2 cellPosition = floor(coord);
vec2 localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
vec3 smoothColor = vec3(0.0);
vec2 smoothPosition = vec2(0.0);
float h = -1.0;
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
vec2 cellOffset = vec2(i, j);
vec2 pointPosition = cellOffset +
hash_vec2_to_vec2(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ?
1.0 :
smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -345,8 +351,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vec2 coord)
vec2 cellPosition = floor(coord);
vec2 localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
vec2 offsetF1 = vec2(0.0);
vec2 positionF1 = vec2(0.0);
vec2 offsetF2 = vec2(0.0);
@ -386,7 +392,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec2 coord)
vec2 localPosition = coord - cellPosition;
vec2 vectorToClosest = vec2(0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
vec2 cellOffset = vec2(i, j);
@ -401,7 +407,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec2 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
vec2 cellOffset = vec2(i, j);
@ -427,7 +433,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec2 coord)
vec2 closestPoint = vec2(0.0);
vec2 closestPointOffset = vec2(0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
vec2 cellOffset = vec2(i, j);
@ -442,7 +448,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec2 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
vec2 closestPointToClosestPoint = vec2(0.0);
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -475,7 +481,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vec3 coord)
vec3 cellPosition = floor(coord);
vec3 localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
vec3 targetOffset = vec3(0.0);
vec3 targetPosition = vec3(0.0);
for (int k = -1; k <= 1; k++) {
@ -506,9 +512,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec3 coord)
vec3 cellPosition = floor(coord);
vec3 localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
vec3 smoothColor = vec3(0.0);
vec3 smoothPosition = vec3(0.0);
float h = -1.0;
for (int k = -2; k <= 2; k++) {
for (int j = -2; j <= 2; j++) {
for (int i = -2; i <= 2; i++) {
@ -516,8 +523,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec3 coord)
vec3 pointPosition = cellOffset +
hash_vec3_to_vec3(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ?
1.0 :
smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -540,8 +549,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vec3 coord)
vec3 cellPosition = floor(coord);
vec3 localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
vec3 offsetF1 = vec3(0.0);
vec3 positionF1 = vec3(0.0);
vec3 offsetF2 = vec3(0.0);
@ -583,7 +592,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec3 coord)
vec3 localPosition = coord - cellPosition;
vec3 vectorToClosest = vec3(0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -600,7 +609,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec3 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -628,7 +637,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec3 coord)
vec3 closestPoint = vec3(0.0);
vec3 closestPointOffset = vec3(0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
for (int i = -1; i <= 1; i++) {
@ -645,7 +654,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec3 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
vec3 closestPointToClosestPoint = vec3(0.0);
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -680,7 +689,7 @@ VoronoiOutput voronoi_f1(VoronoiParams params, vec4 coord)
vec4 cellPosition = floor(coord);
vec4 localPosition = coord - cellPosition;
float minDistance = 8.0;
float minDistance = FLT_MAX;
vec4 targetOffset = vec4(0.0);
vec4 targetPosition = vec4(0.0);
for (int u = -1; u <= 1; u++) {
@ -713,9 +722,10 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec4 coord)
vec4 cellPosition = floor(coord);
vec4 localPosition = coord - cellPosition;
float smoothDistance = 8.0;
float smoothDistance = 0.0;
vec3 smoothColor = vec3(0.0);
vec4 smoothPosition = vec4(0.0);
float h = -1.0;
for (int u = -2; u <= 2; u++) {
for (int k = -2; k <= 2; k++) {
for (int j = -2; j <= 2; j++) {
@ -724,8 +734,11 @@ VoronoiOutput voronoi_smooth_f1(VoronoiParams params, vec4 coord)
vec4 pointPosition = cellOffset +
hash_vec4_to_vec4(cellPosition + cellOffset) * params.randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, params);
float h = smoothstep(
0.0, 1.0, 0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
h = h == -1.0 ?
1.0 :
smoothstep(0.0,
1.0,
0.5 + 0.5 * (smoothDistance - distanceToPoint) / params.smoothness);
float correctionFactor = params.smoothness * h * (1.0 - h);
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
correctionFactor /= 1.0 + 3.0 * params.smoothness;
@ -749,8 +762,8 @@ VoronoiOutput voronoi_f2(VoronoiParams params, vec4 coord)
vec4 cellPosition = floor(coord);
vec4 localPosition = coord - cellPosition;
float distanceF1 = 8.0;
float distanceF2 = 8.0;
float distanceF1 = FLT_MAX;
float distanceF2 = FLT_MAX;
vec4 offsetF1 = vec4(0.0);
vec4 positionF1 = vec4(0.0);
vec4 offsetF2 = vec4(0.0);
@ -794,7 +807,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec4 coord)
vec4 localPosition = coord - cellPosition;
vec4 vectorToClosest = vec4(0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -813,7 +826,7 @@ float voronoi_distance_to_edge(VoronoiParams params, vec4 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -843,7 +856,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec4 coord)
vec4 closestPoint = vec4(0.0);
vec4 closestPointOffset = vec4(0.0);
float minDistance = 8.0;
float minDistance = FLT_MAX;
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {
for (int j = -1; j <= 1; j++) {
@ -862,7 +875,7 @@ float voronoi_n_sphere_radius(VoronoiParams params, vec4 coord)
}
}
minDistance = 8.0;
minDistance = FLT_MAX;
vec4 closestPointToClosestPoint = vec4(0.0);
for (int u = -1; u <= 1; u++) {
for (int k = -1; k <= 1; k++) {