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-04-22 19:25:01 +0300
committerHans Goudey <h.goudey@me.com>2021-04-22 19:25:01 +0300
commit35b0d177a2469d696c3c27f1556dc47ff9f04e25 (patch)
tree02dc1aa59fd35f2e84713f75abde1727bf7aea22 /source/blender
parent441f8d98eb02889f40d81ea199980b373fc4f0ac (diff)
Splines: Cleanup: Rename variables and types
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/BKE_spline.hh10
-rw-r--r--source/blender/blenkernel/intern/spline_nurbs.cc86
2 files changed, 49 insertions, 47 deletions
diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh
index 5834437b7a1..8a707bda92c 100644
--- a/source/blender/blenkernel/BKE_spline.hh
+++ b/source/blender/blenkernel/BKE_spline.hh
@@ -301,7 +301,7 @@ class NURBSpline final : public Spline {
};
KnotsMode knots_mode;
- struct WeightCache {
+ struct BasisCache {
blender::Vector<float> weights;
int start_index;
};
@@ -318,9 +318,9 @@ class NURBSpline final : public Spline {
mutable std::mutex knots_mutex_;
mutable blender::Vector<float> knots_;
- mutable bool weights_dirty_ = true;
- mutable std::mutex weights_mutex_;
- mutable blender::Vector<WeightCache> weight_cache_;
+ mutable bool basis_cache_dirty_ = true;
+ mutable std::mutex basis_cache_mutex_;
+ mutable blender::Vector<BasisCache> weight_cache_;
public:
SplinePtr copy() const final;
@@ -374,7 +374,7 @@ class NURBSpline final : public Spline {
void correct_end_tangents() const final;
void ensure_base_cache() const final;
void calculate_knots() const;
- void calculate_weights() const;
+ void calculate_basis_cache() const;
};
class PolySpline final : public Spline {
diff --git a/source/blender/blenkernel/intern/spline_nurbs.cc b/source/blender/blenkernel/intern/spline_nurbs.cc
index cb6dfffb3bd..3c5c47f5608 100644
--- a/source/blender/blenkernel/intern/spline_nurbs.cc
+++ b/source/blender/blenkernel/intern/spline_nurbs.cc
@@ -256,12 +256,12 @@ Span<float> NURBSpline::knots() const
}
/* TODO: Better variables names, simplify logic once it works. */
-static void nurb_basis(const float parameter,
- const int points_len,
- const int order,
- Span<float> knots,
- MutableSpan<float> basis,
- NURBSpline::WeightCache &basis_cache)
+static void calculate_basis_for_point(const float parameter,
+ const int points_len,
+ const int order,
+ Span<float> knots,
+ MutableSpan<float> basis_buffer,
+ NURBSpline::BasisCache &basis_cache)
{
/* Clamp parameter due to floating point inaccuracy. TODO: Look into using doubles. */
const float t = std::clamp(parameter, knots[0], knots[points_len + order - 1]);
@@ -270,19 +270,19 @@ static void nurb_basis(const float parameter,
int i2 = 0;
for (int i = 0; i < points_len + order - 1; i++) {
if ((knots[i] != knots[i + 1]) && (t >= knots[i]) && (t <= knots[i + 1])) {
- basis[i] = 1.0f;
+ basis_buffer[i] = 1.0f;
i1 = std::max(i - order - 1, 0);
i2 = i;
i++;
while (i < points_len + order - 1) {
- basis[i] = 0.0f;
+ basis_buffer[i] = 0.0f;
i++;
}
break;
}
- basis[i] = 0.0f;
+ basis_buffer[i] = 0.0f;
}
- basis[points_len + order - 1] = 0.0f;
+ basis_buffer[points_len + order - 1] = 0.0f;
for (int i_order = 2; i_order <= order; i_order++) {
if (i2 + i_order >= points_len + order) {
@@ -290,16 +290,16 @@ static void nurb_basis(const float parameter,
}
for (int i = i1; i <= i2; i++) {
float new_basis = 0.0f;
- if (basis[i] != 0.0f) {
- new_basis += ((t - knots[i]) * basis[i]) / (knots[i + i_order - 1] - knots[i]);
+ if (basis_buffer[i] != 0.0f) {
+ new_basis += ((t - knots[i]) * basis_buffer[i]) / (knots[i + i_order - 1] - knots[i]);
}
- if (basis[i + 1] != 0.0f) {
- new_basis += ((knots[i + i_order] - t) * basis[i + 1]) /
+ if (basis_buffer[i + 1] != 0.0f) {
+ new_basis += ((knots[i + i_order] - t) * basis_buffer[i + 1]) /
(knots[i + i_order] - knots[i + 1]);
}
- basis[i] = new_basis;
+ basis_buffer[i] = new_basis;
}
}
@@ -307,7 +307,7 @@ static void nurb_basis(const float parameter,
int end = 0;
for (int i = i1; i <= i2; i++) {
- if (basis[i] > 0.0f) {
+ if (basis_buffer[i] > 0.0f) {
end = i;
if (start == 1000) {
start = i;
@@ -316,58 +316,60 @@ static void nurb_basis(const float parameter,
}
basis_cache.weights.clear();
- basis_cache.weights.extend(basis.slice(start, end - start + 1));
+ basis_cache.weights.extend(basis_buffer.slice(start, end - start + 1));
basis_cache.start_index = start;
}
-void NURBSpline::calculate_weights() const
+void NURBSpline::calculate_basis_cache() const
{
- if (!this->weights_dirty_) {
+ if (!this->basis_cache_dirty_) {
return;
}
- std::lock_guard lock{this->weights_mutex_};
- if (!this->weights_dirty_) {
+ std::lock_guard lock{this->basis_cache_mutex_};
+ if (!this->basis_cache_dirty_) {
return;
}
+ const int points_len = this->size();
const int evaluated_len = this->evaluated_points_size();
this->weight_cache_.resize(evaluated_len);
- const int points_len = this->size();
const int order = this->order();
Span<float> control_weights = this->weights();
Span<float> knots = this->knots();
- MutableSpan<NURBSpline::WeightCache> weights = this->weight_cache_;
+ MutableSpan<BasisCache> basis_cache = this->weight_cache_;
+
+ Array<float> basis_buffer(this->knots_size());
const float start = knots[order - 1];
const float end = this->is_cyclic ? knots[points_len + order - 1] : knots[points_len];
const float step = (end - start) / (evaluated_len - (this->is_cyclic ? 0 : 1));
-
- Array<float> sums(points_len);
- Array<float> basis(this->knots_size());
-
- float u = start;
+ float parameter = start;
for (const int i : IndexRange(evaluated_len)) {
- WeightCache &basis_cache = weights[i];
- nurb_basis(
- u, points_len + (this->is_cyclic ? order - 1 : 0), order, knots, basis, basis_cache);
- BLI_assert(basis_cache.weights.size() <= order);
-
- for (const int j : basis_cache.weights.index_range()) {
- const int point_index = (basis_cache.start_index + j) % points_len;
- basis_cache.weights[j] *= control_weights[point_index];
+ BasisCache &basis = basis_cache[i];
+ calculate_basis_for_point(parameter,
+ points_len + (this->is_cyclic ? order - 1 : 0),
+ order,
+ knots,
+ basis_buffer,
+ basis);
+ BLI_assert(basis.weights.size() <= order);
+
+ for (const int j : basis.weights.index_range()) {
+ const int point_index = (basis.start_index + j) % points_len;
+ basis.weights[j] *= control_weights[point_index];
}
- u += step;
+ parameter += step;
}
- this->weights_dirty_ = false;
+ this->basis_cache_dirty_ = false;
}
template<typename T>
-void interpolate_to_evaluated_points_impl(Span<NURBSpline::WeightCache> weights,
+void interpolate_to_evaluated_points_impl(Span<NURBSpline::BasisCache> weights,
const blender::VArray<T> &old_values,
MutableSpan<T> r_values)
{
@@ -379,7 +381,7 @@ void interpolate_to_evaluated_points_impl(Span<NURBSpline::WeightCache> weights,
Span<float> point_weights = weights[i].weights;
const int start_index = weights[i].start_index;
- for (const int j : IndexRange(point_weights.size())) {
+ for (const int j : point_weights.index_range()) {
const int point_index = (start_index + j) % points_len;
mixer.mix_in(i, old_values[point_index], point_weights[j]);
}
@@ -391,8 +393,8 @@ void interpolate_to_evaluated_points_impl(Span<NURBSpline::WeightCache> weights,
blender::fn::GVArrayPtr NURBSpline::interpolate_to_evaluated_points(
const blender::fn::GVArray &source_data) const
{
- this->calculate_weights();
- Span<WeightCache> weights = this->weight_cache_;
+ this->calculate_basis_cache();
+ Span<BasisCache> weights = this->weight_cache_;
blender::fn::GVArrayPtr new_varray;
blender::attribute_math::convert_to_static_type(source_data.type(), [&](auto dummy) {