Fix T92736: Hole in mesh after Set Position
The geometry node port of voronoi_smooth_f1 function has a division by zero when smoothness is set to zero. Using a safe_divide within the function causes issues and was noted in the original patch D12725. Solution in this case is to clamp zero smoothness to FLT_EPSILON. Reviewed By: JacquesLucke Maniphest Tasks: T92736 Differential Revision: https://developer.blender.org/D13069
This commit is contained in:
parent
89c9fa8b73
commit
6981bee2c7
Notes:
blender-bot
2023-02-14 05:53:42 +01:00
Referenced by issue #92736, Geometry Nodes: Hole in mesh after Set Position
|
@ -1548,6 +1548,7 @@ void voronoi_smooth_f1(const float w,
|
|||
{
|
||||
const float cellPosition = floorf(w);
|
||||
const float localPosition = w - cellPosition;
|
||||
const float smoothness_clamped = max_ff(smoothness, FLT_MIN);
|
||||
|
||||
float smoothDistance = 8.0f;
|
||||
float smoothPosition = 0.0f;
|
||||
|
@ -1558,7 +1559,7 @@ void voronoi_smooth_f1(const float w,
|
|||
hash_float_to_float(cellPosition + cellOffset) * randomness;
|
||||
const float distanceToPoint = voronoi_distance(pointPosition, localPosition);
|
||||
const float h = smoothstep(
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness);
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness_clamped);
|
||||
float correctionFactor = smoothness * h * (1.0f - h);
|
||||
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
|
||||
if (r_color != nullptr || r_w != nullptr) {
|
||||
|
@ -1752,6 +1753,7 @@ void voronoi_smooth_f1(const float2 coord,
|
|||
{
|
||||
const float2 cellPosition = float2::floor(coord);
|
||||
const float2 localPosition = coord - cellPosition;
|
||||
const float smoothness_clamped = max_ff(smoothness, FLT_MIN);
|
||||
|
||||
float smoothDistance = 8.0f;
|
||||
float3 smoothColor = float3(0.0f, 0.0f, 0.0f);
|
||||
|
@ -1764,7 +1766,7 @@ void voronoi_smooth_f1(const float2 coord,
|
|||
const float distanceToPoint = voronoi_distance(
|
||||
pointPosition, localPosition, metric, exponent);
|
||||
const float h = smoothstep(
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness);
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness_clamped);
|
||||
float correctionFactor = smoothness * h * (1.0f - h);
|
||||
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
|
||||
if (r_color != nullptr || r_position != nullptr) {
|
||||
|
@ -1999,6 +2001,7 @@ void voronoi_smooth_f1(const float3 coord,
|
|||
{
|
||||
const float3 cellPosition = float3::floor(coord);
|
||||
const float3 localPosition = coord - cellPosition;
|
||||
const float smoothness_clamped = max_ff(smoothness, FLT_MIN);
|
||||
|
||||
float smoothDistance = 8.0f;
|
||||
float3 smoothColor = float3(0.0f, 0.0f, 0.0f);
|
||||
|
@ -2012,7 +2015,7 @@ void voronoi_smooth_f1(const float3 coord,
|
|||
const float distanceToPoint = voronoi_distance(
|
||||
pointPosition, localPosition, metric, exponent);
|
||||
const float h = smoothstep(
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness);
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness_clamped);
|
||||
float correctionFactor = smoothness * h * (1.0f - h);
|
||||
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
|
||||
if (r_color != nullptr || r_position != nullptr) {
|
||||
|
@ -2262,6 +2265,7 @@ void voronoi_smooth_f1(const float4 coord,
|
|||
{
|
||||
const float4 cellPosition = float4::floor(coord);
|
||||
const float4 localPosition = coord - cellPosition;
|
||||
const float smoothness_clamped = max_ff(smoothness, FLT_MIN);
|
||||
|
||||
float smoothDistance = 8.0f;
|
||||
float3 smoothColor = float3(0.0f, 0.0f, 0.0f);
|
||||
|
@ -2277,7 +2281,7 @@ void voronoi_smooth_f1(const float4 coord,
|
|||
const float distanceToPoint = voronoi_distance(
|
||||
pointPosition, localPosition, metric, exponent);
|
||||
const float h = smoothstep(
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness);
|
||||
0.0f, 1.0f, 0.5f + 0.5f * (smoothDistance - distanceToPoint) / smoothness_clamped);
|
||||
float correctionFactor = smoothness * h * (1.0f - h);
|
||||
smoothDistance = mix(smoothDistance, distanceToPoint, h) - correctionFactor;
|
||||
if (r_color != nullptr || r_position != nullptr) {
|
||||
|
|
Loading…
Reference in New Issue