Fix T79803: Wrong Distance To Edge 1D Voronoi

The current 1D Voronoi implementation for the Distance to Edge option
computes the distance to the cells instead. This patch fixes that and
compute the distance to the edge.

Reviewed By: JacquesLucke, brecht

Differential Revision: https://developer.blender.org/D8634
This commit is contained in:
Omar Emara 2020-09-03 18:56:27 +02:00
parent d2c52d4de2
commit 340cbc7f15
Notes: blender-bot 2023-02-14 08:06:33 +01:00
Referenced by issue #79803, Shading: Voronoi Texture "Distance To Edge" is broken in 1D case
3 changed files with 21 additions and 24 deletions

View File

@ -175,14 +175,13 @@ void voronoi_distance_to_edge_1d(float w, float randomness, output float outDist
float cellPosition = floor(w);
float localPosition = w - cellPosition;
float minDistance = 8.0;
for (int i = -1; i <= 1; i++) {
float cellOffset = float(i);
float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * randomness;
float distanceToPoint = distance(pointPosition, localPosition);
minDistance = min(distanceToPoint, minDistance);
}
outDistance = minDistance;
float midPointPosition = hash_float_to_float(cellPosition) * randomness;
float leftPointPosition = -1.0 + hash_float_to_float(cellPosition - 1.0) * randomness;
float rightPointPosition = 1.0 + hash_float_to_float(cellPosition + 1.0) * randomness;
float distanceToMidLeft = distance((midPointPosition + leftPointPosition) / 2.0, localPosition);
float distanceToMidRight = distance((midPointPosition + rightPointPosition) / 2.0, localPosition);
outDistance = min(distanceToMidLeft, distanceToMidRight);
}
void voronoi_n_sphere_radius_1d(float w, float randomness, output float outRadius)

View File

@ -144,14 +144,13 @@ ccl_device void voronoi_distance_to_edge_1d(float w, float randomness, float *ou
float cellPosition = floorf(w);
float localPosition = w - cellPosition;
float minDistance = 8.0f;
for (int i = -1; i <= 1; i++) {
float cellOffset = i;
float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * randomness;
float distanceToPoint = fabsf(pointPosition - localPosition);
minDistance = min(distanceToPoint, minDistance);
}
*outDistance = minDistance;
float midPointPosition = hash_float_to_float(cellPosition) * randomness;
float leftPointPosition = -1.0f + hash_float_to_float(cellPosition - 1.0f) * randomness;
float rightPointPosition = 1.0f + hash_float_to_float(cellPosition + 1.0f) * randomness;
float distanceToMidLeft = fabsf((midPointPosition + leftPointPosition) / 2.0f - localPosition);
float distanceToMidRight = fabsf((midPointPosition + rightPointPosition) / 2.0f - localPosition);
*outDistance = min(distanceToMidLeft, distanceToMidRight);
}
ccl_device void voronoi_n_sphere_radius_1d(float w, float randomness, float *outRadius)

View File

@ -158,14 +158,13 @@ void node_tex_voronoi_distance_to_edge_1d(vec3 coord,
float cellPosition = floor(scaledCoord);
float localPosition = scaledCoord - cellPosition;
float minDistance = 8.0;
for (int i = -1; i <= 1; i++) {
float cellOffset = float(i);
float pointPosition = cellOffset + hash_float_to_float(cellPosition + cellOffset) * randomness;
float distanceToPoint = voronoi_distance(pointPosition, localPosition, metric, exponent);
minDistance = min(distanceToPoint, minDistance);
}
outDistance = minDistance;
float midPointPosition = hash_float_to_float(cellPosition) * randomness;
float leftPointPosition = -1.0 + hash_float_to_float(cellPosition - 1.0) * randomness;
float rightPointPosition = 1.0 + hash_float_to_float(cellPosition + 1.0) * randomness;
float distanceToMidLeft = distance((midPointPosition + leftPointPosition) / 2.0, localPosition);
float distanceToMidRight = distance((midPointPosition + rightPointPosition) / 2.0, localPosition);
outDistance = min(distanceToMidLeft, distanceToMidRight);
}
void node_tex_voronoi_n_sphere_radius_1d(vec3 coord,