From e74286cef9fab64f0d52274aa1ba65ea7dc3d20b Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sat, 13 Feb 2021 13:56:55 +0700 Subject: [PATCH] update readme api --- README.md | 939 ++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 585 insertions(+), 354 deletions(-) diff --git a/README.md b/README.md index def37d6..3310494 100644 --- a/README.md +++ b/README.md @@ -56,14 +56,17 @@ Most functions and types are based on the HLSL ([High-Level Shading Language for - [Vector Types](#Vector-Types) - [Matrix Types](#Matrix-Types) +- [Quaternion Types](#Quaternion-Types) - [Vector Operators](#Vector-Operators) - [Matrix Operators](#Matrix-Operators) +- [Quaternion Operators](#Quaternion-Operators) +- [Common Functions](#Common-Functions) - [Angle and Trigonometric Functions](#Angle-and-Trigonometric-Functions) - [Exponential Functions](#Exponential-Functions) -- [Common Functions](#Common-Functions) - [Geometric Functions](#Geometric-Functions) - [Relational Functions](#Relational-Functions) - [Matrix Functions](#Matrix-Functions) +- [Quaternion Functions](#Quaternion-Functions) - [Units](#Units) - [Cast](#Cast) - [Access](#Access) @@ -71,6 +74,7 @@ Most functions and types are based on the HLSL ([High-Level Shading Language for - [Matrix Transform 2D](#Matrix-Transform-2D) - [Matrix Projections](#Matrix-Projections) - [Vector Transform](#Vector-Transform) +- [Quaternion Transform](#Quaternion-Transform) ### Vector Types @@ -122,6 +126,7 @@ public: template < typename T, size_t Size > class vec final : public vec_base { public: + using self_type = vec; using component_type = T; using pointer = component_type*; @@ -184,13 +189,13 @@ using double2 = vec; using double3 = vec; using double4 = vec; -using size2 = vec; -using size3 = vec; -using size4 = vec; +using size2_t = vec; +using size3_t = vec; +using size4_t = vec; -using ptrdiff2 = vec; -using ptrdiff3 = vec; -using ptrdiff4 = vec; +using ptrdiff2_t = vec; +using ptrdiff3_t = vec; +using ptrdiff4_t = vec; ``` ### Matrix Types @@ -294,6 +299,7 @@ public: template < typename T, size_t Size > class mat final : public mat_base { public: + using self_type = mat; using row_type = vec; using pointer = row_type*; @@ -356,18 +362,89 @@ using double2x2 = mat; using double3x3 = mat; using double4x4 = mat; -using size2x2 = mat; -using size3x3 = mat; -using size4x4 = mat; +using size2x2_t = mat; +using size3x3_t = mat; +using size4x4_t = mat; -using ptrdiff2x2 = mat; -using ptrdiff3x3 = mat; -using ptrdiff4x4 = mat; +using ptrdiff2x2_t = mat; +using ptrdiff3x3_t = mat; +using ptrdiff4x4_t = mat; +``` + +### Quaternion Types + +```cpp +template < typename T > +class qua final { +public: + vec v{0}; + T s{1}; +public: + using self_type = qua; + using component_type = T; + + using pointer = component_type*; + using const_pointer = const component_type*; + + using reference = component_type&; + using const_reference = const component_type&; + + using iterator = pointer; + using const_iterator = const_pointer; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + static constexpr size_t size = 4; +public: + constexpr qua() = default; + constexpr qua(const qua&) = default; + constexpr qua& operator=(const qua&) = default; + + constexpr qua(T vx, T vy, T vz, T s); + constexpr qua(const vec& v, T s); + constexpr explicit qua(const vec& vs); + + constexpr explicit operator vec() const; + + void swap(qua& other) noexcept(std::is_nothrow_swappable_v); + + iterator begin() noexcept; + const_iterator begin() const noexcept; + iterator end() noexcept; + const_iterator end() const noexcept; + + reverse_iterator rbegin() noexcept; + const_reverse_iterator rbegin() const noexcept; + reverse_iterator rend() noexcept; + const_reverse_iterator rend() const noexcept; + + const_iterator cbegin() const noexcept; + const_iterator cend() const noexcept; + const_reverse_iterator crbegin() const noexcept; + const_reverse_iterator crend() const noexcept; + + pointer data() noexcept; + const_pointer data() const noexcept; + + constexpr reference at(size_t index); + constexpr const_reference at(size_t index) const; + + constexpr reference operator[](size_t index) noexcept; + constexpr const_reference operator[](size_t index) const noexcept; +}; + +using qfloat = qua; +using qdouble = qua; ``` ### Vector Operators ```cpp +// +operator + +template < typename T, size_t Size > +constexpr vec operator+(const vec& xs); + // -operator template < typename T, size_t Size > @@ -557,6 +634,11 @@ constexpr bool operator<(const vec& xs, const vec& ys); ### Matrix Operators ```cpp +// +operator + +template < typename T, size_t Size > +constexpr mat operator+(const mat& xs); + // -operator template < typename T, size_t Size > @@ -743,6 +825,323 @@ template < typename T, size_t Size > constexpr bool operator<(const mat& xs, const mat& ys); ``` +### Quaternion Operators + +```cpp +// +operator + +template < typename T > +constexpr qua operator+(const qua& xs); + +// -operator + +template < typename T > +constexpr qua operator-(const qua& xs); + +// operator+ + +template < typename T > +constexpr qua operator+(const qua& xs, const qua& ys); + +// operator+= + +template < typename T > +constexpr qua& operator+=(qua& xs, const qua& ys); + +// operator- + +template < typename T > +constexpr qua operator-(const qua& xs, const qua& ys); + +// operator-= + +template < typename T > +constexpr qua& operator-=(qua& xs, const qua& ys); + +// operator* + +template < typename T > +constexpr qua operator*(const qua& xs, T y); + +template < typename T > +constexpr qua operator*(T x, const qua& ys); + +template < typename T > +constexpr vec operator*(const vec& xs, const qua& ys); + +template < typename T > +constexpr qua operator*(const qua& xs, const qua& ys); + +// operator*= + +template < typename T > +constexpr qua& operator*=(qua& xs, T y); + +template < typename T > +constexpr vec& operator*=(vec& xs, const qua& ys); + +template < typename T > +constexpr qua& operator*=(qua& xs, const qua& ys); + +// operator/ + +template < typename T > +constexpr qua operator/(const qua& xs, T y); + +template < typename T > +constexpr qua operator/(T x, const qua& ys); + +// operator/= + +template < typename T > +constexpr qua& operator/=(qua& xs, T y); + +// operator== + +template < typename T > +constexpr bool operator==(const qua& xs, const qua& ys); + +// operator!= + +template < typename T > +constexpr bool operator!=(const qua& xs, const qua& ys); + +// operator< + +template < typename T > +constexpr bool operator<(const qua& xs, const qua& ys); +``` + +### Common Functions + +#### Scalar + +```cpp +template < arithmetic T > +constexpr T abs(T x) noexcept; + +template < arithmetic T > +constexpr T sqr(T x) noexcept; + +template < arithmetic T > +constexpr T sign(T x) noexcept; + +template < floating_point T > +constexpr T rcp(T x) noexcept; + +template < floating_point T > +T floor(T x) noexcept; + +template < floating_point T > +T trunc(T x) noexcept; + +template < floating_point T > +T round(T x) noexcept; + +template < floating_point T > +T ceil(T x) noexcept; + +template < floating_point T > +T fract(T x) noexcept; + +template < floating_point T > +T fmod(T x, T y) noexcept; + +template < floating_point T > +T modf(T x, T* y) noexcept; + +template < floating_point T > +T copysign(T x, T s) noexcept; + +template < arithmetic T > +constexpr T min(T x, T y) noexcept; + +template < arithmetic T > +constexpr T max(T x, T y) noexcept; + +template < arithmetic T > +constexpr T clamp(T x, T min_x, T max_x) noexcept; + +template < arithmetic T > +constexpr T saturate(T x) noexcept; + +template < floating_point T > +constexpr T lerp(T x, T y, T a) noexcept; + +template < floating_point T > +constexpr T lerp(T x, T y, T x_a, T y_a) noexcept; + +template < floating_point T > +constexpr T step(T edge, T x) noexcept; + +template < floating_point T > +constexpr T smoothstep(T edge0, T edge1, T x) noexcept; + +template < arithmetic T > +bool isnan(T x) noexcept; + +template < arithmetic T > +bool isinf(T x) noexcept; + +template < arithmetic T > +bool isfinite(T x) noexcept; + +template < floating_point T > +T fma(T x, T y, T z) noexcept; + +template < floating_point T > +T frexp(T x, int* exp) noexcept; + +template < floating_point T > +T ldexp(T x, int exp) noexcept; +``` + +#### Vector + +```cpp +template < typename T, size_t Size > +constexpr vec abs(const vec& xs); + +template < typename T, size_t Size > +constexpr vec sqr(const vec& xs); + +template < typename T, size_t Size > +constexpr vec sign(const vec& xs); + +template < typename T, size_t Size > +constexpr vec rcp(const vec& xs); + +template < typename T, size_t Size > +vec floor(const vec& xs); + +template < typename T, size_t Size > +vec trunc(const vec& xs); + +template < typename T, size_t Size > +vec round(const vec& xs); + +template < typename T, size_t Size > +vec ceil(const vec& xs); + +template < typename T, size_t Size > +vec fract(const vec& xs); + +template < typename T, size_t Size > +vec fmod(const vec& xs, T y); + +template < typename T, size_t Size > +vec fmod(const vec& xs, const vec& ys); + +template < typename T, size_t Size > +vec modf(const vec& xs, vec* is); + +template < typename T, size_t Size > +vec copysign(const vec& xs, T s); + +template < typename T, size_t Size > +vec copysign(const vec& xs, const vec& ss); + +template < typename T, size_t Size > +constexpr T min(const vec& xs); + +template < typename T, size_t Size > +constexpr vec min(const vec& xs, T y); + +template < typename T, size_t Size > +constexpr vec min(T x, const vec& ys); + +template < typename T, size_t Size > +constexpr vec min(const vec& xs, const vec& ys); + +template < typename T, size_t Size > +constexpr T max(const vec& xs); + +template < typename T, size_t Size > +constexpr vec max(const vec& xs, T y); + +template < typename T, size_t Size > +constexpr vec max(T x, const vec& ys); + +template < typename T, size_t Size > +constexpr vec max(const vec& xs, const vec& ys); + +template < typename T, size_t Size > +constexpr vec clamp(const vec& xs, T min_x, T max_x); + +template < typename T, size_t Size > +constexpr vec clamp(const vec& xs, const vec& min_xs, const vec& max_xs); + +template < typename T, size_t Size > +constexpr vec saturate(const vec& xs); + +template < typename T, size_t Size > +constexpr vec lerp(const vec& xs, const vec& ys, T a); + +template < typename T, size_t Size > +constexpr vec lerp(const vec& xs, const vec& ys, T x_a, T y_a); + +template < typename T, size_t Size > +constexpr vec lerp(const vec& xs, const vec& ys, const vec& as); + +template < typename T, size_t Size > +constexpr vec lerp(const vec& xs, const vec& ys, const vec& xs_a, const vec& ys_a); + +template < typename T, size_t Size > +constexpr vec step(T edge, const vec& xs); + +template < typename T, size_t Size > +constexpr vec step(const vec& edges, const vec& xs); + +template < typename T, size_t Size > +constexpr vec smoothstep(T edge0, T edge1, const vec& xs); + +template < typename T, size_t Size > +constexpr vec smoothstep(const vec& edges0, const vec& edges1, const vec& xs); + +template < typename T, size_t Size > +vec isnan(const vec& xs); + +template < typename T, size_t Size > +vec isinf(const vec& xs); + +template < typename T, size_t Size > +vec isfinite(const vec& xs); + +template < typename T, size_t Size > +vec fma(const vec& as, const vec& bs, const vec& cs); + +template < typename T, size_t Size > +vec frexp(const vec& xs, vec* exps); + +template < typename T, size_t Size > +vec ldexp(const vec& xs, const vec& exps); +``` + +#### Quaternion + +```cpp +template < typename T > +qua lerp(const qua& xs, const qua& ys, T a); + +template < typename T > +qua lerp(const qua& xs, const qua& ys, T xs_a, T ys_a); + +template < typename T > +qua nlerp(const qua& unit_xs, const qua& unit_ys, T a); + +template < typename T > +qua slerp(const qua& unit_xs, const qua& unit_ys, T a); + +template < typename T > +vec isnan(const qua& xs); + +template < typename T > +vec isinf(const qua& xs); + +template < typename T > +vec isfinite(const qua& xs); +``` + ### Angle and Trigonometric Functions #### Scalar @@ -848,6 +1247,9 @@ vec acosh(const vec& xs); template < typename T, size_t Size > vec atanh(const vec& xs); +template < typename T, size_t Size > +pair, vec> sincos(const vec& xs); + template < typename T, size_t Size > void sincos(const vec& xs, vec* ss, vec* cs); ``` @@ -904,187 +1306,6 @@ template < typename T, size_t Size > vec rsqrt(const vec& xs); ``` -### Common Functions - -#### Scalar - -```cpp -template < arithmetic T > -constexpr T abs(T x) noexcept; - -template < arithmetic T > -constexpr T sign(T x) noexcept; - -template < floating_point T > -constexpr T rcp(T x) noexcept; - -template < floating_point T > -T floor(T x) noexcept; - -template < floating_point T > -T trunc(T x) noexcept; - -template < floating_point T > -T round(T x) noexcept; - -template < floating_point T > -T ceil(T x) noexcept; - -template < floating_point T > -T fract(T x) noexcept; - -template < floating_point T > -T fmod(T x, T y) noexcept; - -template < floating_point T > -T modf(T x, T* y) noexcept; - -template < arithmetic T > -constexpr T min(T x, T y) noexcept; - -template < arithmetic T, arithmetic... Ts > -constexpr common_type_t min(T x, T y, Ts... ts) noexcept; - -template < arithmetic T > -constexpr T max(T x, T y) noexcept; - -template < arithmetic T, arithmetic... Ts > -constexpr common_type_t max(T x, T y, Ts... ts) noexcept; - -template < arithmetic T > -constexpr T clamp(T x, T min_x, T max_x) noexcept; - -template < arithmetic T > -constexpr T saturate(T x) noexcept; - -template < floating_point T > -constexpr T lerp(T x, T y, T a) noexcept; - -template < floating_point T > -constexpr T step(T edge, T x) noexcept; - -template < floating_point T > -constexpr T smoothstep(T edge0, T edge1, T x) noexcept; - -template < arithmetic T > -bool isnan(T x) noexcept; - -template < arithmetic T > -bool isinf(T x) noexcept; - -template < arithmetic T > -bool isfinite(T x) noexcept; - -template < floating_point T > -T fma(T x, T y, T z) noexcept; - -template < floating_point T > -T frexp(T x, int* exp) noexcept; - -template < floating_point T > -T ldexp(T x, int exp) noexcept; -``` - -#### Vector - -```cpp -template < typename T, size_t Size > -constexpr vec abs(const vec& xs); - -template < typename T, size_t Size > -constexpr vec sign(const vec& xs); - -template < typename T, size_t Size > -constexpr vec rcp(const vec& xs); - -template < typename T, size_t Size > -vec floor(const vec& xs); - -template < typename T, size_t Size > -vec trunc(const vec& xs); - -template < typename T, size_t Size > -vec round(const vec& xs); - -template < typename T, size_t Size > -vec ceil(const vec& xs); - -template < typename T, size_t Size > -vec fract(const vec& xs); - -template < typename T, size_t Size > -vec fmod(const vec& xs, T y); - -template < typename T, size_t Size > -vec fmod(const vec& xs, const vec& ys); - -template < typename T, size_t Size > -vec modf(const vec& xs, vec* is); - -template < typename T, size_t Size > -constexpr T min(const vec& xs); - -template < typename T, size_t Size > -constexpr vec min(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec min(const vec& xs, const vec& ys); - -template < typename T, size_t Size > -constexpr T max(const vec& xs); - -template < typename T, size_t Size > -constexpr vec max(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec max(const vec& xs, const vec& ys); - -template < typename T, size_t Size > -constexpr vec clamp(const vec& xs, T min_x, T max_x); - -template < typename T, size_t Size > -constexpr vec clamp(const vec& xs, const vec& min_xs, const vec& max_xs); - -template < typename T, size_t Size > -constexpr vec saturate(const vec& xs); - -template < typename T, size_t Size > -constexpr vec lerp(const vec& xs, const vec& ys, T a); - -template < typename T, size_t Size > -constexpr vec lerp(const vec& xs, const vec& ys, const vec& as); - -template < typename T, size_t Size > -constexpr vec step(T edge, const vec& xs); - -template < typename T, size_t Size > -constexpr vec step(const vec& edges, const vec& xs); - -template < typename T, size_t Size > -constexpr vec smoothstep(T edge0, T edge1, const vec& xs); - -template < typename T, size_t Size > -constexpr vec smoothstep(const vec& edges0, const vec& edges1, const vec& xs); - -template < typename T, size_t Size > -vec isnan(const vec& xs); - -template < typename T, size_t Size > -vec isinf(const vec& xs); - -template < typename T, size_t Size > -vec isfinite(const vec& xs); - -template < typename T, size_t Size > -vec fma(const vec& as, const vec& bs, const vec& cs); - -template < typename T, size_t Size > -vec frexp(const vec& xs, vec* exps); - -template < typename T, size_t Size > -vec ldexp(const vec& xs, const vec& exps); -``` - ### Geometric Functions #### Scalar @@ -1155,6 +1376,25 @@ template < typename T, size_t Size > vec refract(const vec& i, const vec& n, T eta); ``` +#### Quaternion + +```cpp +template < typename T > +constexpr T dot(const qua& xs, const qua& ys); + +template < typename T > +T length(const qua& xs); + +template < typename T > +constexpr T length2(const qua& xs); + +template < typename T > +T distance(const qua& xs, const qua& ys); + +template < typename T > +qua normalize(const qua& xs); +``` + ### Relational Functions #### Scalar @@ -1194,99 +1434,33 @@ constexpr bool not_equal_to(T x, T y) noexcept; #### Vector ```cpp -// any - template < typename T, size_t Size > constexpr bool any(const vec& xs); -// all - template < typename T, size_t Size > constexpr bool all(const vec& xs); -// approx - -template < typename T, size_t Size > -constexpr vec approx(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec approx(T x, const vec& ys); - template < typename T, size_t Size > constexpr vec approx(const vec& xs, const vec& ys); -template < typename T, size_t Size > -constexpr vec approx(const vec& xs, T y, T epsilon); - -template < typename T, size_t Size > -constexpr vec approx(T x, const vec& ys, T epsilon); - template < typename T, size_t Size > constexpr vec approx(const vec& xs, const vec& ys, T epsilon); -// less - -template < typename T, size_t Size > -constexpr vec less(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec less(T x, const vec& ys); - template < typename T, size_t Size > constexpr vec less(const vec& xs, const vec& ys); -// less_equal - -template < typename T, size_t Size > -constexpr vec less_equal(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec less_equal(T x, const vec& ys); - template < typename T, size_t Size > constexpr vec less_equal(const vec& xs, const vec& ys); -// greater - -template < typename T, size_t Size > -constexpr vec greater(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec greater(T x, const vec& ys); - template < typename T, size_t Size > constexpr vec greater(const vec& xs, const vec& ys); -// greater_equal - -template < typename T, size_t Size > -constexpr vec greater_equal(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec greater_equal(T x, const vec& ys); - template < typename T, size_t Size > constexpr vec greater_equal(const vec& xs, const vec& ys); -// equal_to - -template < typename T, size_t Size > -constexpr vec equal_to(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec equal_to(T x, const vec& ys); - template < typename T, size_t Size > constexpr vec equal_to(const vec& xs, const vec& ys); -// not_equal_to - -template < typename T, size_t Size > -constexpr vec not_equal_to(const vec& xs, T y); - -template < typename T, size_t Size > -constexpr vec not_equal_to(T x, const vec& ys); - template < typename T, size_t Size > constexpr vec not_equal_to(const vec& xs, const vec& ys); ``` @@ -1294,103 +1468,65 @@ constexpr vec not_equal_to(const vec& xs, const vec constexpr bool any(const mat& xs); -// all - template < typename T, size_t Size > constexpr bool all(const mat& xs); -// approx - -template < typename T, size_t Size > -constexpr mat approx(const mat& xs, T y); - -template < typename T, size_t Size > -constexpr mat approx(T x, const mat& ys); - template < typename T, size_t Size > constexpr mat approx(const mat& xs, const mat& ys); -template < typename T, size_t Size > -constexpr mat approx(const mat& xs, T y, T epsilon); - -template < typename T, size_t Size > -constexpr mat approx(T x, const mat& ys, T epsilon); - template < typename T, size_t Size > constexpr mat approx(const mat& xs, const mat& ys, T epsilon); -// less - -template < typename T, std::size_t Size > -constexpr mat less(const mat& xs, T y); - -template < typename T, std::size_t Size > -constexpr mat less(T x, const mat& ys); - -template < typename T, std::size_t Size > +template < typename T, size_t Size > constexpr mat less(const mat& xs, const mat& ys); -// less_equal - -template < typename T, std::size_t Size > -constexpr mat less_equal(const mat& xs, T y); - -template < typename T, std::size_t Size > -constexpr mat less_equal(T x, const mat& ys); - -template < typename T, std::size_t Size > +template < typename T, size_t Size > constexpr mat less_equal(const mat& xs, const mat& ys); -// greater - -template < typename T, std::size_t Size > -constexpr mat greater(const mat& xs, T y); - -template < typename T, std::size_t Size > -constexpr mat greater(T x, const mat& ys); - -template < typename T, std::size_t Size > +template < typename T, size_t Size > constexpr mat greater(const mat& xs, const mat& ys); -// greater_equal - -template < typename T, std::size_t Size > -constexpr mat greater_equal(const mat& xs, T y); - -template < typename T, std::size_t Size > -constexpr mat greater_equal(T x, const mat& ys); - -template < typename T, std::size_t Size > +template < typename T, size_t Size > constexpr mat greater_equal(const mat& xs, const mat& ys); -// equal_to - -template < typename T, std::size_t Size > -constexpr mat equal_to(const mat& xs, T y); - -template < typename T, std::size_t Size > -constexpr mat equal_to(T x, const mat& ys); - -template < typename T, std::size_t Size > +template < typename T, size_t Size > constexpr mat equal_to(const mat& xs, const mat& ys); -// not_equal_to - -template < typename T, std::size_t Size > -constexpr mat not_equal_to(const mat& xs, T y); - -template < typename T, std::size_t Size > -constexpr mat not_equal_to(T x, const mat& ys); - -template < typename T, std::size_t Size > +template < typename T, size_t Size > constexpr mat not_equal_to(const mat& xs, const mat& ys); ``` +#### Quaternion + +```cpp +template < typename T > +constexpr vec approx(const qua& xs, const qua& ys); + +template < typename T > +constexpr vec approx(const qua& xs, const qua& ys, T epsilon); + +template < typename T > +constexpr vec less(const qua& xs, const qua& ys); + +template < typename T > +constexpr vec less_equal(const qua& xs, const qua& ys); + +template < typename T > +constexpr vec greater(const qua& xs, const qua& ys); + +template < typename T > +constexpr vec greater_equal(const qua& xs, const qua& ys); + +template < typename T > +constexpr vec equal_to(const qua& xs, const qua& ys); + +template < typename T > +constexpr vec not_equal_to(const qua& xs, const qua& ys); +``` + ### Matrix Functions ```cpp @@ -1422,6 +1558,16 @@ template < typename T > constexpr mat inverse(const mat& m); ``` +### Quaternion Functions + +```cpp +template < typename T > +constexpr qua conjugate(const qua& q); + +template < typename T > +constexpr qua inverse(const qua& q); +``` + ### Units ```cpp @@ -1469,6 +1615,9 @@ constexpr vec cast_to(const vec& v); template < typename To, typename From, size_t Size > constexpr mat cast_to(const mat& m); + +template < typename To, typename From > +constexpr qua cast_to(const qua& q); ``` ### Access @@ -1491,6 +1640,18 @@ constexpr vec column(const mat& m, size_t index); template < typename T, size_t Size > constexpr mat column(const mat& m, size_t index, const vec& v); + +template < typename T > +constexpr T real(const qua& q); + +template < typename T > +constexpr qua real(qua q, T real); + +template < typename T > +constexpr vec imag(const qua& q); + +template < typename T > +constexpr qua imag(qua q, const vec& imag); ``` ### Matrix Transform 3D @@ -1499,15 +1660,21 @@ constexpr mat column(const mat& m, size_t index, const vec constexpr mat translate(T x, T y, T z); -template < typename T > -constexpr mat translate(const vec& v); - template < typename T > constexpr mat translate(const mat& m, T x, T y, T z); +template < typename T > +constexpr mat translate(const vec& v); + template < typename T > constexpr mat translate(const mat& m, const vec& v); +template < typename T > +mat rotate(const qua& q); + +template < typename T > +mat rotate(const mat& m, const qua& q); + template < typename T > mat rotate(T angle, const vec& axis); @@ -1536,10 +1703,10 @@ template < typename T > constexpr mat scale(T x, T y, T z); template < typename T > -constexpr mat scale(const vec& v); +constexpr mat scale(const mat& m, T x, T y, T z); template < typename T > -constexpr mat scale(const mat& m, T x, T y, T z); +constexpr mat scale(const vec& v); template < typename T > constexpr mat scale(const mat& m, const vec& v); @@ -1558,10 +1725,10 @@ template < typename T > constexpr mat translate(T x, T y); template < typename T > -constexpr mat translate(const vec& v); +constexpr mat translate(const mat& m, T x, T y); template < typename T > -constexpr mat translate(const mat& m, T x, T y); +constexpr mat translate(const vec& v); template < typename T > constexpr mat translate(const mat& m, const vec& v); @@ -1576,10 +1743,10 @@ template < typename T > constexpr mat scale(T x, T y); template < typename T > -constexpr mat scale(const vec& v); +constexpr mat scale(const mat& m, T x, T y); template < typename T > -constexpr mat scale(const mat& m, T x, T y); +constexpr mat scale(const vec& v); template < typename T > constexpr mat scale(const mat& m, const vec& v); @@ -1588,10 +1755,10 @@ template < typename T > constexpr mat shear(T x, T y); template < typename T > -constexpr mat shear(const vec& v); +constexpr mat shear(const mat& m, T x, T y); template < typename T > -constexpr mat shear(const mat& m, T x, T y); +constexpr mat shear(const vec& v); template < typename T > constexpr mat shear(const mat& m, const vec& v); @@ -1613,28 +1780,34 @@ constexpr mat shear_y(const mat& m, T x); ```cpp template < typename T > -mat orthographic_lh_zo(T left, T right, T bottom, T top, T znear, T zfar); +mat orthographic_lh(T width, T height, T znear, T zfar); template < typename T > -mat orthographic_lh_no(T left, T right, T bottom, T top, T znear, T zfar); +mat orthographic_rh(T width, T height, T znear, T zfar); template < typename T > -mat orthographic_rh_zo(T left, T right, T bottom, T top, T znear, T zfar); +mat orthographic_lh(T left, T right, T bottom, T top, T znear, T zfar); template < typename T > -mat orthographic_rh_no(T left, T right, T bottom, T top, T znear, T zfar); +mat orthographic_rh(T left, T right, T bottom, T top, T znear, T zfar); template < typename T > -mat perspective_lh_zo(T fov, T aspect, T znear, T zfar); +mat perspective_lh(T width, T height, T znear, T zfar); template < typename T > -mat perspective_lh_no(T fov, T aspect, T znear, T zfar); +mat perspective_rh(T width, T height, T znear, T zfar); template < typename T > -mat perspective_rh_zo(T fov, T aspect, T znear, T zfar); +mat perspective_lh(T left, T right, T bottom, T top, T znear, T zfar); template < typename T > -mat perspective_rh_no(T fov, T aspect, T znear, T zfar); +mat perspective_rh(T left, T right, T bottom, T top, T znear, T zfar); + +template < typename T > +mat perspective_fov_lh(T fovy, T aspect, T znear, T zfar); + +template < typename T > +mat perspective_fov_rh(T fovy, T aspect, T znear, T zfar); ``` ### Vector Transform @@ -1647,13 +1820,71 @@ template < typename T > vec rotate(const vec& v, T angle); template < typename T > -vec rotate(const vec& v, T angle, const vec& normal); +vec rotate_x(const vec& v, T angle); template < typename T > -vec rotate(const vec& v, T angle, const vec& normal); +vec rotate_y(const vec& v, T angle); + +template < typename T > +vec rotate_z(const vec& v, T angle); + +template < typename T > +vec rotate(const vec& v, const qua& q); + +template < typename T > +vec rotate(const vec& v, T angle, const vec& axis); template < typename T, size_t Size > -vec project(const vec& v, const vec& normal); +constexpr vec project(const vec& v, const vec& normal); + +template < typename T, size_t Size > +constexpr vec perpendicular(const vec& v, const vec& normal); +``` + +### Quaternion Transform + +```cpp +template < typename T > +qua qrotate(const mat& m); + +template < typename T > +qua qrotate(const qua& q, const mat& m); + +template < typename T > +qua qrotate(const vec& from, const vec& to); + +template < typename T > +qua qrotate(const qua& q, const vec& from, const vec& to); + +template < typename T > +qua qrotate(T angle, const vec& axis); + +template < typename T > +qua qrotate(const qua& q, T angle, const vec& axis); + +template < typename T > +qua qrotate_x(T angle); + +template < typename T > +qua qrotate_x(const qua& q, T angle); + +template < typename T > +qua qrotate_y(T angle); + +template < typename T > +qua qrotate_y(const qua& q, T angle); + +template < typename T > +qua qrotate_z(T angle); + +template < typename T > +qua qrotate_z(const qua& q, T angle); + +template < typename T > +qua qlook_at_lh(const vec& dir, const vec& up); + +template < typename T > +qua qlook_at_rh(const vec& dir, const vec& up); ``` ## [License (MIT)](./LICENSE.md)