[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