[Bf-blender-cvs] [a9488cead94] soc-2021-curve-fillet: Improved limit radius algorithm in curve fillet

dilithjay noreply at git.blender.org
Mon Aug 2 08:03:01 CEST 2021


Commit: a9488cead94211ea5861b196d5c5cb340adaad42
Author: dilithjay
Date:   Mon Aug 2 11:32:19 2021 +0530
Branches: soc-2021-curve-fillet
https://developer.blender.org/rBa9488cead94211ea5861b196d5c5cb340adaad42

Improved limit radius algorithm in curve fillet

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

M	release/scripts/addons
M	release/scripts/addons_contrib
M	source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc

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

diff --git a/release/scripts/addons b/release/scripts/addons
index 89ce3f1e1ca..6fb64557179 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 89ce3f1e1ca9f715b790cb3901001782d27bebea
+Subproject commit 6fb64557179b3783fffae5bf704ad2ab8f7046a6
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
index 788441f2930..32040a4a0ca 160000
--- a/release/scripts/addons_contrib
+++ b/release/scripts/addons_contrib
@@ -1 +1 @@
-Subproject commit 788441f2930465bbfba8f0797b12dcef1d46694d
+Subproject commit 32040a4a0ca1537057612590194b54ed511462c8
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 e95aa25f6f2..eddd080f293 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc
@@ -167,61 +167,66 @@ static FilletData calculate_fillet_data_per_vertex(const float3 prev_pos,
 
 static void limit_radii(Array<FilletData> &fds, const int size, const bool cyclic)
 {
-  int fillet_count, start = 0;
+  int fillet_count, start = 0, radii_calc_count = 0;
   Array<float> max_radii(size, {-1});
 
   /* Handle the corner cases if cyclic. */
   if (cyclic) {
     fillet_count = size;
+    radii_calc_count = fillet_count - 2;
 
-    float len_prev, len_next, radius, radius_next, radius_prev, max_radius_prev, max_radius_next;
+    float len_prev, tan_len, tan_len_prev, max_radius_prev;
 
-    /* Distance to previous and next control points. */
     len_prev = len_v3v3(fds[0].pos, fds[size - 1].pos);
-    len_next = len_v3v3(fds[0].pos, fds[1].pos);
-
-    /* Radii of adjacent control points. */
-    radius = fds[0].radius;
-    radius_next = fds[1].radius;
-    radius_prev = fds[size - 1].radius;
-
-    /* Max distance the fillet can expand to based on radii. */
-    max_radius_prev = len_prev * radius / (radius + radius_prev);
-    max_radius_next = len_next * radius / (radius + radius_next);
-
-    /* Max radius of index 0 and 1. */
-    max_radii[0] = min_ff(max_radius_prev, max_radius_next);
-    max_radii[1] = len_next * radius_next / (radius + radius_next);
-
-    /* Max radius of index size - 2 (one before the last) */
-    float len_prev_end = len_v3v3(fds[size - 2].pos, fds[size - 1].pos);
-    float radius_prev_end = fds[size - 2].radius;
-    max_radii[size - 1] = min_ff(len_prev_end * radius_prev / (radius_prev + radius_prev_end),
-                                 len_prev * radius_prev / (radius + radius_prev));
+    tan_len = fds[0].radius * tanf(fds[0].angle / 2);
+    tan_len_prev = fds[size - 1].radius * tanf(fds[size - 1].angle / 2);
+
+    max_radii[0] = fds[0].radius;
+    max_radii[size - 1] = fds[size - 1].radius;
+
+    if (tan_len + tan_len_prev > len_prev) {
+      float factor = len_prev / (tan_len + tan_len_prev);
+      max_radii[0] *= factor;
+      max_radii[size - 1] *= factor;
+    }
   }
   else {
     fillet_count = size - 2;
+    radii_calc_count = fillet_count - 1;
     start = 1;
   }
 
   /* Max radii calculations of the remaining indices. */
-  for (const int i : IndexRange(1, fillet_count - start)) {
-    float len_next = len_v3v3(fds[i - start].pos, fds[i - start + 1].pos);
-    float radius = fds[i - start].radius;
-    float radius_next = fds[i - start + 1].radius;
+  for (const int i : IndexRange(start, fillet_count - 1)) {
+    int fillet_i = i - start;
+    float len = len_v3v3(fds[fillet_i].pos, fds[fillet_i + 1].pos);
+    float tan_len_1 = fds[fillet_i].radius * tanf(fds[fillet_i].angle / 2);
+    float tan_len_2 = fds[fillet_i + 1].radius * tanf(fds[fillet_i + 1].angle / 2);
+
     if (max_radii[i] < 0) {
-      max_radii[i] = len_next * radius / (radius + radius_next);
+      max_radii[i] = fds[fillet_i].radius;
     }
     else {
-      max_radii[i] = min_ff(max_radii[i], len_next * radius / (radius + radius_next));
+      max_radii[i] = min_ff(max_radii[i], fds[fillet_i].radius);
+    }
+
+    if (max_radii[i + 1] < 0) {
+      max_radii[i + 1] = fds[fillet_i + 1].radius;
+    }
+    else {
+      max_radii[i + 1] = min_ff(max_radii[i + 1], fds[fillet_i + 1].radius);
+    }
+    if (tan_len_1 + tan_len_2 > len) {
+      float factor = len / (tan_len_1 + tan_len_2);
+      max_radii[i] *= factor;
+      max_radii[i + 1] *= factor;
     }
-    max_radii[i + 1] = len_next * radius_next / (radius + radius_next);
   }
 
-  /* Divide each max_radius by ran of angle/2 because the current lengths are the lengths of
+  /* Divide each max_radius by tan of angle/2 because the current lengths are the lengths of
    * tangents. */
   for (const int i : IndexRange(fillet_count)) {
-    fds[i].radius = min_ff(fds[i].radius, max_radii[start + i] / tanf(fds[i].angle / 2));
+    fds[i].radius = min_ff(fds[i].radius, max_radii[start + i]);
   }
 }



More information about the Bf-blender-cvs mailing list