[Bf-blender-cvs] [f1d191120f4] master: Fix T99130: Spline factor gets messed up if one hair is too short
Dalai Felinto
noreply at git.blender.org
Fri Jun 24 15:36:54 CEST 2022
Commit: f1d191120f4f1d762369b19bdbf8d9be29000d77
Author: Dalai Felinto
Date: Fri Jun 24 12:42:52 2022 +0200
Branches: master
https://developer.blender.org/rBf1d191120f4f1d762369b19bdbf8d9be29000d77
Fix T99130: Spline factor gets messed up if one hair is too short
In the cases where length is zero, we simply equally distribute the
value based on the control point/curve index.
Differential Revision: https://developer.blender.org/D15285
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc
index ae2b4fd779d..b98541e3446 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_spline_parameter.cc
@@ -119,10 +119,20 @@ static VArray<float> construct_curve_parameter_varray(const bke::CurvesGeometry
for (const int i_curve : range) {
const float total_length = curves.evaluated_length_total_for_curve(i_curve,
cyclic[i_curve]);
- const float factor = total_length == 0.0f ? 0.0f : 1.0f / total_length;
MutableSpan<float> curve_lengths = lengths.slice(curves.points_for_curve(i_curve));
- for (float &value : curve_lengths) {
- value *= factor;
+ if (total_length > 0.0f) {
+ const float factor = 1.0f / total_length;
+ for (float &value : curve_lengths) {
+ value *= factor;
+ }
+ }
+ else {
+ /* It is arbitrary what to do in those rare cases when all the points are
+ * in the same position. In this case we are just arbitrarily giving a valid
+ * value in the range based on the point index. */
+ for (const int i : curve_lengths.index_range()) {
+ curve_lengths[i] = i / (curve_lengths.size() - 1.0f);
+ }
}
}
});
@@ -135,9 +145,19 @@ static VArray<float> construct_curve_parameter_varray(const bke::CurvesGeometry
const int last_index = curves.curves_num() - 1;
const int total_length = lengths.last() + curves.evaluated_length_total_for_curve(
last_index, cyclic[last_index]);
- const float factor = total_length == 0.0f ? 0.0f : 1.0f / total_length;
- for (float &value : lengths) {
- value *= factor;
+ if (total_length > 0.0f) {
+ const float factor = 1.0f / total_length;
+ for (float &value : lengths) {
+ value *= factor;
+ }
+ }
+ else {
+ /* It is arbitrary what to do in those rare cases when all the points are
+ * in the same position. In this case we are just arbitrarily giving a valid
+ * value in the range based on the curve index. */
+ for (const int i : lengths.index_range()) {
+ lengths[i] = i / (lengths.size() - 1.0f);
+ }
}
return VArray<float>::ForContainer(std::move(lengths));
}
More information about the Bf-blender-cvs
mailing list