@@ -460,6 +460,24 @@ static inline quat_t<T> operator /(quat_t<T> const &x, quat_t<T> const &y) | |||||
template<typename T> | template<typename T> | ||||
extern quat_t<T> slerp(quat_t<T> const &qa, quat_t<T> const &qb, T f); | extern quat_t<T> slerp(quat_t<T> const &qa, quat_t<T> const &qb, T f); | ||||
/* | |||||
* SQTs only | |||||
*/ | |||||
template<typename T> | |||||
static inline sqt_t<T> inverse(sqt_t<T> const &tr) | |||||
{ | |||||
auto inv_s = T(1) / tr.s; | |||||
auto inv_q = re(tr.q); | |||||
return sqt_t<T>(inv_s, inv_q, inv_q * tr.t * -inv_s); | |||||
} | |||||
template<typename T> | |||||
static inline sqt_t<T> operator /(sqt_t<T> const &x, sqt_t<T> const &y) | |||||
{ | |||||
return x * inverse(y); | |||||
} | |||||
#if !LOL_FEATURE_CXX11_CONSTEXPR | #if !LOL_FEATURE_CXX11_CONSTEXPR | ||||
#undef constexpr | #undef constexpr | ||||
#endif | #endif | ||||
@@ -72,6 +72,19 @@ lolunit_declare_fixture(sqt_test) | |||||
} | } | ||||
} | } | ||||
lolunit_declare_test(sqt_inverse) | |||||
{ | |||||
for (vec4 v0 : test_vec4s) | |||||
{ | |||||
vec4 v1 = inverse(test_sqt_1) * (test_sqt_1 * v0); | |||||
lolunit_assert_doubles_equal(v0.x, v1.x, 1e-5f); | |||||
lolunit_assert_doubles_equal(v0.y, v1.y, 1e-5f); | |||||
lolunit_assert_doubles_equal(v0.z, v1.z, 1e-5f); | |||||
lolunit_assert_doubles_equal(v0.w, v1.w, 1e-5f); | |||||
} | |||||
} | |||||
lolunit_declare_test(sqt_composition_vec4) | lolunit_declare_test(sqt_composition_vec4) | ||||
{ | { | ||||
/* We check that transforming a vec4 with an SQT and a | /* We check that transforming a vec4 with an SQT and a | ||||