[Bf-blender-cvs] [fbfcbc740eb] soc-2021-curve-fillet: Refactored limit radius

dilithjay noreply at git.blender.org
Tue Aug 24 19:53:59 CEST 2021


Commit: fbfcbc740eb3df0191619bd1c12d0f99b2b32907
Author: dilithjay
Date:   Tue Aug 17 11:21:45 2021 +0530
Branches: soc-2021-curve-fillet
https://developer.blender.org/rBfbfcbc740eb3df0191619bd1c12d0f99b2b32907

Refactored limit radius

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

M	source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc
index 44dbf401641..8b7ca3e8f3a 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc
@@ -216,11 +216,13 @@ static void limit_radii(FilletData &fd, const bool cyclic)
 
   const int size = radii.size();
   int fillet_count, start;
-  Array<float> max_radii(size, FLT_MAX);
+  float prev_radius, last_radius;
 
   if (cyclic) {
     fillet_count = size;
     start = 0;
+    prev_radius = radii[0];
+    last_radius = radii[size - 1];
 
     /* Calculate lengths between adjacent control points. */
     const float len_prev = float3::distance(positions[0], positions[size - 1]);
@@ -240,19 +242,26 @@ static void limit_radii(FilletData &fd, const bool cyclic)
     }
 
     /* Scale max radii by calculated factors. */
-    max_radii[0] = radii[0] * min_ff(factor_next, factor_prev);
-    max_radii[size - 1] = radii[size - 1] * factor_prev;
+    radii[0] *= min_ff(factor_next, factor_prev);
+    radii[size - 1] *= factor_prev;
   }
   else {
     fillet_count = size - 2;
     start = 1;
+    prev_radius = radii[1];
   }
 
   /* Max radii calculations for each index. */
   for (const int i : IndexRange(start, fillet_count - 1)) {
     const float len_next = float3::distance(positions[i], positions[i + 1]);
-    const float tan_len = radii[i] * tanf(angles[i] / 2);
-    const float tan_len_next = radii[i + 1] * tanf(angles[i + 1] / 2);
+    const float tan_len = prev_radius * tanf(angles[i] / 2);
+    float tan_len_next;
+    if (i + 1 < size - 1) {
+      tan_len_next = radii[i + 1] * tanf(angles[i + 1] / 2);
+    }
+    else {
+      tan_len_next = last_radius * tanf(angles[i + 1] / 2);
+    }
 
     /* Scale down radii if too large for segment. */
     float factor = 1.0f;
@@ -266,20 +275,21 @@ static void limit_radii(FilletData &fd, const bool cyclic)
                           float3::distance(positions[i], positions[i + 1])) /
                    tanf(angles[i] / 2);
     }
-    max_radii[i] = min_fff(max_radii[i], radii[i] * factor, max_radius);
+    radii[i] = min_fff(radii[i], prev_radius * factor, max_radius);
 
     max_radius = FLT_MAX;
+    prev_radius = radii[i + 1];
     if (i + 1 > 0 && i + 1 < size - 1) {
       max_radius = min_ff(float3::distance(positions[i + 1], positions[i]),
                           float3::distance(positions[i + 1], positions[i + 2])) /
                    tanf(angles[i + 1] / 2);
     }
-    max_radii[i + 1] = min_fff(max_radii[i + 1], radii[i + 1] * factor, max_radius);
-  }
-
-  /* Assign the max_radii to the fillet data's radii. */
-  for (const int i : IndexRange(size)) {
-    radii[i] = max_radii[i];
+    if (i + 1 < size - 1) {
+      radii[i + 1] = min_fff(radii[i + 1], prev_radius * factor, max_radius);
+    }
+    else {
+      radii[i + 1] = min_fff(radii[i + 1], last_radius * factor, max_radius);
+    }
   }
 }
 
@@ -540,7 +550,7 @@ static SplinePtr fillet_spline(const Spline &spline,
     start = 1;
   }
 
-  if (fillet_count <= 0) {
+  if (size < 3) {
     return spline.copy();
   }



More information about the Bf-blender-cvs mailing list