[Bf-blender-cvs] [2a7b2bf41b4] soc-2021-curve-fillet: Changes according to revision suggestions

dilithjay noreply at git.blender.org
Fri Sep 10 19:41:31 CEST 2021


Commit: 2a7b2bf41b42836cfc7770744f628ff26ad8b411
Author: dilithjay
Date:   Fri Sep 10 12:08:21 2021 +0530
Branches: soc-2021-curve-fillet
https://developer.blender.org/rB2a7b2bf41b42836cfc7770744f628ff26ad8b411

Changes according to revision suggestions

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

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

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

diff --git a/release/datafiles/locale b/release/datafiles/locale
index 326997b913d..4d67fb6e277 160000
--- a/release/datafiles/locale
+++ b/release/datafiles/locale
@@ -1 +1 @@
-Subproject commit 326997b913d04bc5bc4656973d1e1a819f860dd2
+Subproject commit 4d67fb6e2773619392b3d2099188ae742ef9662a
diff --git a/release/scripts/addons b/release/scripts/addons
index 87d1c3811f8..32baafe44dc 160000
--- a/release/scripts/addons
+++ b/release/scripts/addons
@@ -1 +1 @@
-Subproject commit 87d1c3811f86e257c5721e60124002c0e4a15887
+Subproject commit 32baafe44dc56edd1baf6e5a16b4439ded8238f2
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 a93e573f6bb..fa582d0edba 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_fillet.cc
@@ -75,14 +75,15 @@ struct FilletParam {
 
 /* A data structure used to store fillet data about all vertices to be filleted. */
 struct FilletData {
-  Array<float3> directions, positions, axes;
+  Span<float3> positions;
+  Array<float3> directions, axes;
   Array<float> radii, angles;
   Array<int> counts;
 
   FilletData(const int size)
   {
     directions.reinitialize(size);
-    positions.reinitialize(size);
+    // positions.reinitialize(size);
     axes.reinitialize(size);
     radii.reinitialize(size);
     angles.reinitialize(size);
@@ -110,7 +111,7 @@ static float3 get_center(const float3 vec_pos2prev,
                          const float angle)
 {
   float3 vec_pos2center;
-  rotate_v3_v3v3fl(vec_pos2center, vec_pos2prev, axis, M_PI_2 - angle / 2.0f);
+  rotate_normalized_v3_v3v3fl(vec_pos2center, vec_pos2prev, axis, M_PI_2 - angle / 2.0f);
   vec_pos2center *= 1.0f / sinf(angle / 2.0f);
 
   return vec_pos2center + pos;
@@ -146,9 +147,9 @@ static Array<float3> calculate_axes(const Span<float3> directions)
   const int size = directions.size();
   Array<float3> axes(size);
 
-  axes[0] = float3::cross(-directions[size - 1], directions[0]);
+  axes[0] = float3::cross(-directions[size - 1], directions[0]).normalized();
   for (const int i : IndexRange(1, size - 1)) {
-    axes[i] = float3::cross(-directions[i - 1], directions[i]);
+    axes[i] = float3::cross(-directions[i - 1], directions[i]).normalized();
   }
 
   return axes;
@@ -184,13 +185,18 @@ static Array<int> calculate_counts(const std::optional<int> count,
 /* Calculate the radii for the vertices to be filleted. */
 static Array<float> calculate_radii(const FilletParam &fillet_param,
                                     const int size,
-                                    const int spline_index)
+                                    const int spline_offset)
 {
   Array<float> radii(size, 0.0f);
-
-  for (const int i : IndexRange(size)) {
-    const float radius = (*fillet_param.radii)[spline_index + i];
-    radii[i] = fillet_param.limit_radius && radius < 0.0f ? 0.0f : radius;
+  if (fillet_param.limit_radius) {
+    for (const int i : IndexRange(size)) {
+      radii[i] = std::max((*fillet_param.radii)[spline_offset + i], 0.0f);
+    }
+  }
+  else {
+    for (const int i : IndexRange(size)) {
+      radii[i] = (*fillet_param.radii)[spline_offset + i];
+    }
   }
 
   return radii;
@@ -218,7 +224,7 @@ static FilletData calculate_fillet_data(const Spline &spline,
                                         const FilletParam &fillet_param,
                                         int &added_count,
                                         MutableSpan<int> point_counts,
-                                        const int spline_index)
+                                        const int spline_offset)
 {
   const int size = spline.size();
 
@@ -228,7 +234,7 @@ static FilletData calculate_fillet_data(const Spline &spline,
   fd.axes = calculate_axes(fd.directions);
   fd.angles = calculate_angles(fd.directions);
   fd.counts = calculate_counts(fillet_param.count, size, spline.is_cyclic());
-  fd.radii = calculate_radii(fillet_param, size, spline_index);
+  fd.radii = calculate_radii(fillet_param, size, spline_offset);
 
   added_count = calculate_point_counts(point_counts, fd.radii, fd.counts);
 
@@ -243,21 +249,19 @@ static void limit_radii(FilletData &fd, const bool cyclic)
   Span<float3> positions(fd.positions);
 
   const int size = radii.size();
-  int fillet_count, start;
+  const int fillet_count = cyclic ? size : size - 2;
+  const int start = cyclic ? 0 : 1;
   Array<float> max_radii(size, FLT_MAX);
 
   if (cyclic) {
-    fillet_count = size;
-    start = 0;
-
     /* Calculate lengths between adjacent control points. */
     const float len_prev = float3::distance(positions[0], positions[size - 1]);
     const float len_next = float3::distance(positions[0], positions[1]);
 
     /* Calculate tangent lengths of fillets in control points. */
-    const float tan_len = radii[0] * tanf(angles[0] / 2.0f);
-    const float tan_len_prev = radii[size - 1] * tanf(angles[size - 1] / 2.0f);
-    const float tan_len_next = radii[1] * tanf(angles[1] / 2.0f);
+    const float tan_len = radii[0] * tan(angles[0] / 2.0f);
+    const float tan_len_prev = radii[size - 1] * tan(angles[size - 1] / 2.0f);
+    const float tan_len_next = radii[1] * tan(angles[1] / 2.0f);
 
     float factor_prev = 1.0f, factor_next = 1.0f;
     if (tan_len + tan_len_prev > len_prev) {
@@ -268,36 +272,32 @@ 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[0] = radii[0] * std::min(factor_next, factor_prev);
     max_radii[1] = radii[1] * factor_next;
     max_radii[size - 1] = radii[size - 1] * factor_prev;
   }
-  else {
-    fillet_count = size - 2;
-    start = 1;
-  }
 
   /* Initialize max_radii to largest possible radii. */
   float prev_dist = float3::distance(positions[1], positions[0]);
   for (const int i : IndexRange(1, size - 2)) {
     const float temp_dist = float3::distance(positions[i], positions[i + 1]);
-    max_radii[i] = min_ff(prev_dist, temp_dist) / tanf(angles[i] / 2.0f);
+    max_radii[i] = std::min(prev_dist, temp_dist) / tan(angles[i] / 2.0f);
     prev_dist = temp_dist;
   }
 
   /* 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.0f);
-    const float tan_len_next = radii[i + 1] * tanf(angles[i + 1] / 2.0f);
+    const float tan_len = radii[i] * tan(angles[i] / 2.0f);
+    const float tan_len_next = radii[i + 1] * tan(angles[i + 1] / 2.0f);
 
     /* Scale down radii if too large for segment. */
     float factor = 1.0f;
     if (tan_len + tan_len_next > len_next) {
       factor = len_next / (tan_len + tan_len_next);
     }
-    max_radii[i] = min_ff(max_radii[i], radii[i] * factor);
-    max_radii[i + 1] = min_ff(max_radii[i + 1], radii[i + 1] * factor);
+    max_radii[i] = std::min(max_radii[i], radii[i] * factor);
+    max_radii[i + 1] = std::min(max_radii[i + 1], radii[i + 1] * factor);
   }
 
   /* Assign the max_radii to the fillet data's radii. */
@@ -373,7 +373,7 @@ static void copy_NURBS_attributes_by_mapping(const NURBSpline &src,
 }
 
 /* Update the positions and handle positions of a Bezier spline based on fillet data. */
-static void update_bezier_positions(FilletData &fd,
+static void update_bezier_positions(const FilletData &fd,
                                     BezierSpline &dst_spline,
                                     const Span<int> point_counts,
                                     const int start,
@@ -387,74 +387,75 @@ static void update_bezier_positions(FilletData &fd,
 
   const int size = radii.size();
 
-  int cur_i = start;
-  for (const int i : IndexRange(start, fillet_count)) {
-    const int count = point_counts[i];
+  int i_dst = start;
+  for (const int i_src : IndexRange(start, fillet_count)) {
+    const int count = point_counts[i_src];
 
     /* Skip if the point count for the vertex is 1. */
     if (count == 1) {
-      cur_i++;
+      i_dst++;
       continue;
     }
 
     /* Calculate the angle to be formed between any 2 adjacent vertices within the fillet. */
-    const float segment_angle = angles[i] / (count - 1);
+    const float segment_angle = angles[i_src] / (count - 1);
     /* Calculate the handle length for each added vertex. Equation: L = 4R/3 * tan(A/4) */
-    const float handle_length = 4.0f * radii[i] / 3.0f * tanf(segment_angle / 4.0f);
+    const float handle_length = 4.0f * radii[i_src] / 3.0f * tan(segment_angle / 4.0f);
     /* Calculate the distance by which each vertex should be displaced from their initial position.
      */
-    const float displacement = radii[i] * tanf(angles[i] / 2.0f);
+    const float displacement = radii[i_src] * tan(angles[i_src] / 2.0f);
 
     /* Position the end points of the arc and their handles. */
-    const int end_i = cur_i + count - 1;
-    const float3 prev_dir = i == 0 ? -directions[size - 1] : -directions[i - 1];
-    const float3 next_dir = directions[i];
-    dst_spline.positions()[cur_i] = positions[i] + displacement * prev_dir;
-    dst_spline.positions()[end_i] = positions[i] + displacement * next_dir;
-    dst_spline.handle_positions_right()[cur_i] = dst_spline.positions()[cur_i] -
+    const int end_i = i_dst + count - 1;
+    const float3 prev_dir = i_src == 0 ? -directions[size - 1] : -directions[i_src - 1];
+    const float3 next_dir = directions[i_src];
+    dst_spline.positions()[i_dst] = positions[i_src] + displacement * prev_dir;
+    dst_spline.positions()[end_i] = positions[i_src] + displacement * next_dir;
+    dst_spline.handle_positions_right()[i_dst] = dst_spline.positions()[i_dst] -
                                                  handle_length * prev_dir;
-    dst_spline.handle_positions_left()[cur_i] = dst_spline.positions()[cur_i] +
+    dst_spline.handle_positions_left()[i_dst] = dst_spline.positions()[i_dst] +
                                                 handle_length * prev_dir;
     dst_spline.handle_positions_left()[end_i] = dst_spline.

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list