Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2021-12-06 20:19:27 +0300
committerHans Goudey <h.goudey@me.com>2021-12-06 20:19:27 +0300
commitee4ed99866fbb7ab048b637b2d71a872b7eef2b5 (patch)
treeb5d1ab12d0069f3a0a8fa185c496c56cdcd41195 /source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
parent0bd3cad04edf4bf9b9d3b1353f955534aa5e6740 (diff)
Fix T93521: Single point NURBS crash in resample node
The resample node didn't handle the case of when a spline didn't have any evaluated points. For poly and Bezier splines we should never hit this case, but it is expected when the number of NURBS control points is smaller than its order, so we have to handle the case here. It's not that obvious what to do in this case, there are a few options: - Remove the bad splines from the result - Generate empty splines for those inputs - Skip resampling the bad splines, copy them to the result - Arbitrarily generate single point splines I chose option three, just skipping the "bad" splines. Since the node already has a selection input, this can be described by just extending that. "Splines with no evaluated points are implicitly deselected." The first option would probably be valid too though. Differential Revision: https://developer.blender.org/D13434
Diffstat (limited to 'source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc')
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc6
1 files changed, 3 insertions, 3 deletions
diff --git a/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc b/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
index 594ffcffb39..4f02afd1e69 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc
@@ -189,7 +189,7 @@ static std::unique_ptr<CurveEval> resample_curve(const CurveComponent *component
threading::parallel_for(input_splines.index_range(), 128, [&](IndexRange range) {
for (const int i : range) {
BLI_assert(mode_param.count);
- if (selections[i]) {
+ if (selections[i] && input_splines[i]->evaluated_points_size() > 0) {
output_splines[i] = resample_spline(*input_splines[i], std::max(cuts[i], 1));
}
else {
@@ -208,7 +208,7 @@ static std::unique_ptr<CurveEval> resample_curve(const CurveComponent *component
threading::parallel_for(input_splines.index_range(), 128, [&](IndexRange range) {
for (const int i : range) {
- if (selections[i]) {
+ if (selections[i] && input_splines[i]->evaluated_points_size() > 0) {
/* Don't allow asymptotic count increase for low resolution values. */
const float divide_length = std::max(lengths[i], 0.0001f);
const float spline_length = input_splines[i]->length();
@@ -229,7 +229,7 @@ static std::unique_ptr<CurveEval> resample_curve(const CurveComponent *component
threading::parallel_for(input_splines.index_range(), 128, [&](IndexRange range) {
for (const int i : range) {
- if (selections[i]) {
+ if (selections[i] && input_splines[i]->evaluated_points_size() > 0) {
output_splines[i] = resample_spline_evaluated(*input_splines[i]);
}
else {