[Bf-blender-cvs] [6981bee2c77] blender-v3.0-release: Fix T92736: Hole in mesh after Set Position

Charlie Jolly noreply at git.blender.org
Tue Nov 2 16:58:57 CET 2021


Commit: 6981bee2c77f826570df36e9e7cf90adfae4d409
Author: Charlie Jolly
Date:   Tue Nov 2 15:58:13 2021 +0000
Branches: blender-v3.0-release
https://developer.blender.org/rB6981bee2c77f826570df36e9e7cf90adfae4d409

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

===================================================================

M	source/blender/blenlib/intern/noise.cc

===================================================================

diff --git a/source/blender/blenlib/intern/noise.cc b/source/blender/blenlib/intern/noise.cc
index 4259237af6e..bc78ded63a0 100644
--- a/source/blender/blenlib/intern/noise.cc
+++ b/source/blender/blenlib/intern/noise.cc
@@ -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) {



More information about the Bf-blender-cvs mailing list