From 378022c7973db54f1ad8cf335a9359c3bf27ddb5 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Fri, 25 Mar 2022 09:57:10 -0500 Subject: BLI: Adjust interpolation to support integers, other tweaks In order to allow interpolation of integers with a float, add a separate template parameter for the factor and multiplication types. Also move some helper constexpr variables to the "base" header (reversing the dependency to "base" -> "vector"). This also adds a distance function for scalar types, which is helpful to allow sharing code between vectors and basic types. Differential Revision: https://developer.blender.org/D14446 --- source/blender/blenlib/BLI_math_base.hh | 22 +++++++++++++++++----- source/blender/blenlib/BLI_math_vec_types.hh | 11 +---------- source/blender/blenlib/BLI_math_vector.hh | 6 +++--- source/blender/blenlib/tests/BLI_math_base_test.cc | 5 +++++ .../blender/blenlib/tests/BLI_math_vector_test.cc | 20 ++++++++++++++++++++ 5 files changed, 46 insertions(+), 18 deletions(-) (limited to 'source/blender/blenlib') diff --git a/source/blender/blenlib/BLI_math_base.hh b/source/blender/blenlib/BLI_math_base.hh index 6a988eda8a9..83f414f853a 100644 --- a/source/blender/blenlib/BLI_math_base.hh +++ b/source/blender/blenlib/BLI_math_base.hh @@ -12,7 +12,6 @@ #include #include "BLI_math_base_safe.h" -#include "BLI_math_vec_types.hh" #include "BLI_utildefines.h" #ifdef WITH_GMP @@ -21,6 +20,15 @@ namespace blender::math { +template +inline constexpr bool is_math_float_type = (std::is_floating_point_v +#ifdef WITH_GMP + || std::is_same_v +#endif +); + +template inline constexpr bool is_math_integral_type = std::is_integral_v; + template inline bool is_zero(const T &a) { return a == T(0); @@ -84,19 +92,23 @@ template))> inline T ceil(const return std::ceil(a); } +template inline T distance(const T &a, const T &b) +{ + return std::abs(a - b); +} + template))> inline T fract(const T &a) { return a - std::floor(a); } -template))> -inline T interpolate(const T &a, const T &b, const T &t) +template))> +inline T interpolate(const T &a, const T &b, const FactorT &t) { return a * (1 - t) + b * t; } -template))> -inline T midpoint(const T &a, const T &b) +template inline T midpoint(const T &a, const T &b) { return (a + b) * T(0.5); } diff --git a/source/blender/blenlib/BLI_math_vec_types.hh b/source/blender/blenlib/BLI_math_vec_types.hh index 389307e331d..d9524eae746 100644 --- a/source/blender/blenlib/BLI_math_vec_types.hh +++ b/source/blender/blenlib/BLI_math_vec_types.hh @@ -321,7 +321,7 @@ template struct vec_base : public vec_struct_base BLI_VEC_OP_IMPL(ret, i, ret[i] = a[i] * b[i]); } - friend vec_base operator*(const vec_base &a, T b) + template friend vec_base operator*(const vec_base &a, FactorT b) { BLI_VEC_OP_IMPL(ret, i, ret[i] = a[i] * b); } @@ -579,13 +579,4 @@ using double2 = vec_base; using double3 = vec_base; using double4 = vec_base; -template -inline constexpr bool is_math_float_type = (std::is_floating_point_v -#ifdef WITH_GMP - || std::is_same_v -#endif -); - -template inline constexpr bool is_math_integral_type = std::is_integral_v; - } // namespace blender diff --git a/source/blender/blenlib/BLI_math_vector.hh b/source/blender/blenlib/BLI_math_vector.hh index b1a3242ae52..b9f0939674e 100644 --- a/source/blender/blenlib/BLI_math_vector.hh +++ b/source/blender/blenlib/BLI_math_vector.hh @@ -10,7 +10,7 @@ #include #include -#include "BLI_math_base_safe.h" +#include "BLI_math_base.hh" #include "BLI_math_vec_types.hh" #include "BLI_span.hh" #include "BLI_utildefines.h" @@ -339,10 +339,10 @@ inline vec_base cross_poly(Span> poly) return n; } -template))> +template))> inline vec_base interpolate(const vec_base &a, const vec_base &b, - const T &t) + const FactorT &t) { return a * (1 - t) + b * t; } diff --git a/source/blender/blenlib/tests/BLI_math_base_test.cc b/source/blender/blenlib/tests/BLI_math_base_test.cc index 62f2b2775d0..dd35deef4a8 100644 --- a/source/blender/blenlib/tests/BLI_math_base_test.cc +++ b/source/blender/blenlib/tests/BLI_math_base_test.cc @@ -151,4 +151,9 @@ TEST(math_base, Midpoint) EXPECT_NEAR(math::midpoint(100.0f, 200.0f), 150.0f, 1e-4f); } +TEST(math_base, InterpolateInt) +{ + EXPECT_EQ(math::interpolate(100, 200, 0.4f), 140); +} + } // namespace blender::tests diff --git a/source/blender/blenlib/tests/BLI_math_vector_test.cc b/source/blender/blenlib/tests/BLI_math_vector_test.cc index 8c310645d6d..282be5f1963 100644 --- a/source/blender/blenlib/tests/BLI_math_vector_test.cc +++ b/source/blender/blenlib/tests/BLI_math_vector_test.cc @@ -85,4 +85,24 @@ TEST(math_vector, Clamp) EXPECT_EQ(result_2.z, -50); } +TEST(math_vector, InterpolateInt) +{ + const int3 a(0, -100, 50); + const int3 b(0, 100, 100); + const int3 result = math::interpolate(a, b, 0.75); + EXPECT_EQ(result.x, 0); + EXPECT_EQ(result.y, 50); + EXPECT_EQ(result.z, 87); +} + +TEST(math_vector, InterpolateFloat) +{ + const float3 a(40.0f, -100.0f, 50.0f); + const float3 b(20.0f, 100.0f, 100.0f); + const float3 result = math::interpolate(a, b, 0.5); + EXPECT_FLOAT_EQ(result.x, 30.0f); + EXPECT_FLOAT_EQ(result.y, 0.0f); + EXPECT_FLOAT_EQ(result.z, 75.0f); +} + } // namespace blender::tests -- cgit v1.2.3