From 7e1596acd1465fbe81e394a35588cef6b28ea7bc Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Fri, 26 Feb 2021 10:35:35 +0700 Subject: [PATCH] quaternion ctor conversions --- README.md | 5 +++-- headers/vmath.hpp/vmath_qua.hpp | 17 +++++++---------- untests/vmath_qua_fun_tests.cpp | 10 ++++++++++ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index fc3a683..b05c9d6 100644 --- a/README.md +++ b/README.md @@ -425,9 +425,10 @@ public: qua_base(T vx, T vy, T vz, T s); qua_base(const vec& v, T s); - explicit qua_base(const vec& vs); - explicit operator vec() const; + + template < typename A > qua_base(const qua_base& other); + template < typename A > explicit operator vec() const; }; template < typename T > diff --git a/headers/vmath.hpp/vmath_qua.hpp b/headers/vmath.hpp/vmath_qua.hpp index b4e7c7c..1acde63 100644 --- a/headers/vmath.hpp/vmath_qua.hpp +++ b/headers/vmath.hpp/vmath_qua.hpp @@ -26,18 +26,15 @@ namespace vmath_hpp::detail constexpr qua_base(zero_init_t) : qua_base{zero_init, T{0}} {} constexpr qua_base(identity_init_t) : qua_base{zero_init, T{1}} {} - constexpr qua_base(T vx, T vy, T vz, T s) - : v{vx, vy, vz}, s{s} {} + constexpr qua_base(T vx, T vy, T vz, T s): v{vx, vy, vz}, s{s} {} + constexpr qua_base(const vec& v, T s): v{v}, s{s} {} + constexpr explicit qua_base(const vec& vs): v{vs[0], vs[1], vs[2]}, s{vs[3]} {} - constexpr qua_base(const vec& v, T s) - : v{v}, s{s} {} + template < typename A, std::enable_if_t, int> = 0 > + constexpr qua_base(const qua_base& other): qua_base(other.v, other.s) {} - constexpr explicit qua_base(const vec& vs) - : v{vs[0], vs[1], vs[2]}, s{vs[3]} {} - - constexpr explicit operator vec() const { - return {v, s}; - } + template < typename A, std::enable_if_t, int> = 0 > + constexpr explicit operator vec() const { return vec(v, s); } [[nodiscard]] constexpr T& operator[](std::size_t index) noexcept { switch ( index ) { diff --git a/untests/vmath_qua_fun_tests.cpp b/untests/vmath_qua_fun_tests.cpp index 4c1dd56..dad95a2 100644 --- a/untests/vmath_qua_fun_tests.cpp +++ b/untests/vmath_qua_fun_tests.cpp @@ -76,6 +76,16 @@ TEST_CASE("vmath/qua_fun") { STATIC_CHECK(1.0 / qfloat{1,1,1,1} == qdouble{1,1,1,1}); } + SUBCASE("Conversions2") { + STATIC_CHECK(qfloat(1,2.f,3.0,4u) == qfloat(1,2,3,4)); + STATIC_CHECK(qfloat(int3(1,2,3),4u) == qfloat(1,2,3,4)); + STATIC_CHECK(qfloat(int4(1,2,3,4)) == qfloat(1,2,3,4)); + STATIC_CHECK(qfloat(qdouble(1,2,3,4)) == qfloat(1,2,3,4)); + + STATIC_CHECK(float4(qfloat(1,2,3,4)) == float4(1,2,3,4)); + STATIC_CHECK(float4(qdouble(1,2,3,4)) == float4(1,2,3,4)); + } + SUBCASE("Common Functions") { { CHECK(all(approx(