From 675677ec67c6b922b3a5e602c8bf3dbb562bd687 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Wed, 9 Jun 2021 14:53:39 -0500 Subject: Splines: Add API functions for interpolating data First, expand on the interpolation to evaluated points with a templated helper function, and a function that takes a GSPan. Next, add a set of functions to `Spline` for interpolating at arbitrary intervals between the evaluated points. The code for doing that isn't that complicated anyway, but it's nice to avoid repeating, and it might make it easier to unroll the special cases for the first and last points if we require the index factors to be sorted. --- source/blender/blenkernel/BKE_spline.hh | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'source/blender/blenkernel/BKE_spline.hh') diff --git a/source/blender/blenkernel/BKE_spline.hh b/source/blender/blenkernel/BKE_spline.hh index fc1292e3620..dfbe82f31fd 100644 --- a/source/blender/blenkernel/BKE_spline.hh +++ b/source/blender/blenkernel/BKE_spline.hh @@ -172,6 +172,25 @@ class Spline { blender::Array sample_uniform_index_factors(const int samples_size) const; LookupResult lookup_data_from_index_factor(const float index_factor) const; + void sample_based_on_index_factors(const blender::fn::GVArray &src, + blender::Span index_factors, + blender::fn::GMutableSpan dst) const; + template + void sample_based_on_index_factors(const blender::VArray &src, + blender::Span index_factors, + blender::MutableSpan dst) const + { + this->sample_based_on_index_factors( + blender::fn::GVArray_For_VArray(src), index_factors, blender::fn::GMutableSpan(dst)); + } + template + void sample_based_on_index_factors(blender::Span src, + blender::Span index_factors, + blender::MutableSpan dst) const + { + this->sample_based_on_index_factors(blender::VArray_For_Span(src), index_factors, dst); + } + /** * Interpolate a virtual array of data with the size of the number of control points to the * evaluated points. For poly splines, the lifetime of the returned virtual array must not @@ -179,6 +198,13 @@ class Spline { */ virtual blender::fn::GVArrayPtr interpolate_to_evaluated_points( const blender::fn::GVArray &source_data) const = 0; + blender::fn::GVArrayPtr interpolate_to_evaluated_points(blender::fn::GSpan data) const; + template + blender::fn::GVArray_Typed interpolate_to_evaluated_points(blender::Span data) const + { + return blender::fn::GVArray_Typed( + this->interpolate_to_evaluated_points(blender::fn::GSpan(data))); + } protected: virtual void correct_end_tangents() const = 0; -- cgit v1.2.3