From 3d521fd745d3f6e36fd3a314d7faf2cb40370850 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sun, 7 Feb 2021 15:18:08 +0700 Subject: [PATCH] qua: real, imag access funcs --- headers/vmath.hpp/vmath_ext.hpp | 42 ++++++++++++++++++++++++++------- untests/vmath_ext_tests.cpp | 10 ++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/headers/vmath.hpp/vmath_ext.hpp b/headers/vmath.hpp/vmath_ext.hpp index 732be8f..b0a1437 100644 --- a/headers/vmath.hpp/vmath_ext.hpp +++ b/headers/vmath.hpp/vmath_ext.hpp @@ -149,8 +149,8 @@ namespace vmath_hpp } template < typename T, std::size_t Size > - [[nodiscard]] constexpr vec component(vec v, std::size_t index, T x) { - v[index] = x; + [[nodiscard]] constexpr vec component(vec v, std::size_t index, T component) { + v[index] = component; return v; } @@ -162,8 +162,8 @@ namespace vmath_hpp } template < typename T, std::size_t Size > - [[nodiscard]] constexpr mat row(mat m, std::size_t index, const vec& v) { - m.rows[index] = v; + [[nodiscard]] constexpr mat row(mat m, std::size_t index, const vec& row) { + m.rows[index] = row; return m; } @@ -179,8 +179,8 @@ namespace vmath_hpp template < typename T, std::size_t Size, std::size_t... Is > [[nodiscard]] constexpr VMATH_HPP_FORCE_INLINE - mat column_impl(const mat& m, std::size_t index, const vec& v, std::index_sequence) { - return { component(m[Is], index, v[Is])... }; + mat column_impl(const mat& m, std::size_t index, const vec& column, std::index_sequence) { + return { component(m[Is], index, column[Is])... }; } } @@ -190,8 +190,34 @@ namespace vmath_hpp } template < typename T, std::size_t Size > - [[nodiscard]] constexpr mat column(const mat& m, std::size_t index, const vec& v) { - return impl::column_impl(m, index, v, std::make_index_sequence{}); + [[nodiscard]] constexpr mat column(const mat& m, std::size_t index, const vec& column) { + return impl::column_impl(m, index, column, std::make_index_sequence{}); + } + + // real + + template < typename T > + [[nodiscard]] constexpr T real(const qua& q) { + return q.s; + } + + template < typename T > + [[nodiscard]] constexpr qua real(qua q, T real) { + q.s = real; + return q; + } + + // imag + + template < typename T > + [[nodiscard]] constexpr vec imag(const qua& q) { + return q.v; + } + + template < typename T > + [[nodiscard]] constexpr qua imag(qua q, const vec& imag) { + q.v = imag; + return q; } } diff --git a/untests/vmath_ext_tests.cpp b/untests/vmath_ext_tests.cpp index fbcacfe..f8addd8 100644 --- a/untests/vmath_ext_tests.cpp +++ b/untests/vmath_ext_tests.cpp @@ -201,6 +201,16 @@ TEST_CASE("vmath/ext") { STATIC_REQUIRE(column(int2x2(), 1, {3,4}) == int2x2(1,3,0,4)); } + SECTION("real") { + STATIC_REQUIRE(real(qua{1,2,3,4}) == 4); + STATIC_REQUIRE(real(qua{1,2,3,4}, 5) == qua{1,2,3,5}); + } + + SECTION("imag") { + STATIC_REQUIRE(imag(qua{1,2,3,4}) == vec{1,2,3}); + STATIC_REQUIRE(imag(qua{1,2,3,4}, {4,3,2}) == qua{4,3,2,4}); + } + SECTION("matrix translate") { STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(float2{1.f,2.f}) == uapprox3(3.f,5.f,1.f)); STATIC_REQUIRE(float3(2.f,3.f,1.f) * translate(translate(float2{1.f,2.f}), float2{1.f,2.f}) == uapprox3(4.f,7.f,1.f));