sandbox
Loading...
Searching...
No Matches
matrix4x4.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MATH_MATRIX4X4_HPP_
3#define LIBSBX_MATH_MATRIX4X4_HPP_
4
5#include <array>
6#include <cstddef>
7#include <cmath>
8#include <cinttypes>
9#include <concepts>
10#include <fstream>
11#include <ostream>
12#include <type_traits>
13
14#include <fmt/format.h>
15
17#include <libsbx/math/vector3.hpp>
18#include <libsbx/math/vector4.hpp>
20#include <libsbx/math/matrix3x3.hpp>
21#include <libsbx/math/angle.hpp>
22
23namespace sbx::math {
24
25template<scalar Type>
26class basic_matrix4x4 : public basic_matrix<4u, 4u, Type> {
27
29
30 template<scalar Other>
32
33 inline static constexpr auto x_axis = std::size_t{0u};
34 inline static constexpr auto y_axis = std::size_t{1u};
35 inline static constexpr auto z_axis = std::size_t{2u};
36 inline static constexpr auto w_axis = std::size_t{3u};
37
38public:
39
40 using value_type = base_type::value_type;
41 using reference = base_type::reference;
42 using const_reference = base_type::const_reference;
43 using size_type = base_type::size_type;
45
46 inline static constexpr basic_matrix4x4 identity{base_type::identity()};
47
48 inline static constexpr basic_matrix4x4 zero{base_type{value_type{0}}};
49
50 using base_type::base_type;
51
52 constexpr basic_matrix4x4(const base_type& base) noexcept;
53
54 template<typename Column0, typename Column1, typename Column2, typename Column3>
55 constexpr basic_matrix4x4(
56 Column0&& column0,
57 Column1&& column1,
58 Column2&& column2,
59 Column3&& column3
60 ) noexcept;
61
62 template<scalar Other>
63 constexpr basic_matrix4x4(
64 Other x0, Other x1, Other x2, Other x3,
65 Other y0, Other y1, Other y2, Other y3,
66 Other z0, Other z1, Other z2, Other z3,
67 Other w0, Other w1, Other w2, Other w3
68 ) noexcept;
69
70 template<scalar Other>
71 constexpr basic_matrix4x4(const Other v00, const Other v11, const Other v22, const Other v33) noexcept;
72
73 template<scalar Other>
74 constexpr basic_matrix4x4(const basic_matrix3x3<Other>& other) noexcept
75 : base_type{column_type{other[0], 0}, column_type{other[1], 0}, column_type{other[2], 0}, column_type{0, 0, 0, 1}} { }
76
77 constexpr basic_matrix4x4(const basic_matrix4x4& other) noexcept = default;
78
79 constexpr basic_matrix4x4(basic_matrix4x4&& other) noexcept = default;
80
81 constexpr auto operator=(const basic_matrix4x4& other) noexcept -> basic_matrix4x4& = default;
82
83 constexpr auto operator=(basic_matrix4x4&& other) noexcept -> basic_matrix4x4& = default;
84
85 // -- Static member functions --
86
87 [[nodiscard]] constexpr static auto transposed(const basic_matrix4x4& matrix) noexcept -> basic_matrix4x4;
88
89 [[nodiscard]] constexpr static auto inverted(const basic_matrix4x4& matrix) -> basic_matrix4x4;
90
91 [[nodiscard]] constexpr static auto look_at(const basic_vector3<value_type>& position, const basic_vector3<value_type>& target, const basic_vector3<value_type>& up) noexcept -> basic_matrix4x4;
92
93 [[nodiscard]] constexpr static auto perspective(const basic_angle<value_type>& fov, const value_type aspect, const value_type near, const value_type far) noexcept -> basic_matrix4x4;
94
95 [[nodiscard]] constexpr static auto orthographic(const value_type left, const value_type right, const value_type bottom, const value_type top) noexcept -> basic_matrix4x4;
96
97 [[nodiscard]] constexpr static auto orthographic(const value_type left, const value_type right, const value_type bottom, const value_type top, const value_type near, const value_type far) noexcept -> basic_matrix4x4;
98
99 [[nodiscard]] constexpr static auto translated(const basic_matrix4x4& matrix, const basic_vector3<value_type>& vector) noexcept -> basic_matrix4x4;
100
101 [[nodiscard]] constexpr static auto scaled(const basic_matrix4x4& matrix, const basic_vector3<value_type>& vector) noexcept -> basic_matrix4x4;
102
103 [[nodiscard]] constexpr static auto rotated(const basic_matrix4x4& matrix, const basic_vector3<value_type>& axis, const basic_angle<value_type>& angle) noexcept -> basic_matrix4x4;
104
105 [[nodiscard]] constexpr static auto rotation_from_euler_angles(const basic_vector3<value_type>& euler_angles) noexcept -> basic_matrix4x4;
106
107 [[nodiscard]] constexpr static auto rotation_basis(const basic_matrix4x4& matrix) noexcept -> basic_matrix3x3<value_type> {
108 auto x = basic_vector3<value_type>{matrix[x_axis]};
109 auto y = basic_vector3<value_type>{matrix[y_axis]};
110 auto z = basic_vector3<value_type>{matrix[z_axis]};
111
113 }
114
115 constexpr auto operator[](size_type index) const noexcept -> const column_type&;
116
117 constexpr auto operator[](size_type index) noexcept -> column_type&;
118
119}; // class basic_matrix4x4
120
121template<scalar Lhs, scalar Rhs>
122[[nodiscard]] constexpr auto operator+(basic_matrix4x4<Lhs> lhs, const basic_matrix4x4<Rhs>& rhs) noexcept -> basic_matrix4x4<Lhs>;
123
124template<scalar Lhs, scalar Rhs>
125[[nodiscard]] constexpr auto operator-(basic_matrix4x4<Lhs> lhs, const basic_matrix4x4<Rhs>& rhs) noexcept -> basic_matrix4x4<Lhs>;
126
127template<scalar Lhs, scalar Rhs>
128[[nodiscard]] constexpr auto operator*(basic_matrix4x4<Lhs> lhs, Rhs scalar) noexcept -> basic_matrix4x4<Lhs>;
129
130template<scalar Lhs, scalar Rhs>
131[[nodiscard]] constexpr auto operator*(basic_matrix4x4<Lhs> lhs, const basic_vector4<Rhs>& rhs) noexcept -> basic_vector4<Lhs>;
132
133template<scalar Lhs, scalar Rhs>
134[[nodiscard]] constexpr auto operator*(basic_matrix4x4<Lhs> lhs, const basic_matrix4x4<Rhs>& rhs) noexcept -> basic_matrix4x4<Lhs>;
135
136template<scalar Lhs, scalar Rhs>
137[[nodiscard]] constexpr auto operator/(basic_matrix4x4<Lhs> lhs, Rhs scalar) noexcept -> basic_matrix4x4<Lhs>;
138
140
142
143using matrix4x4 = matrix4x4f;
144
145} // namespace sbx::math
146
147template<sbx::math::scalar Type>
148struct fmt::formatter<sbx::math::basic_matrix4x4<Type>> {
149
150 template<typename ParseContext>
151 constexpr auto parse(ParseContext& context) -> decltype(context.begin()) {
152 return context.begin();
153 }
154
155 template<typename FormatContext>
156 auto format(const sbx::math::basic_matrix4x4<Type>& matrix, FormatContext& context) -> decltype(context.out()) {
157 if constexpr (sbx::math::is_floating_point_v<Type>) {
158 return fmt::format_to(context.out(),
159 "\n{:.2f}, {:.2f}, {:.2f}, {:.2f}\n{:.2f}, {:.2f}, {:.2f}, {:.2f}\n{:.2f}, {:.2f}, {:.2f}, {:.2f}\n{:.2f}, {:.2f}, {:.2f}, {:.2f}",
160 matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0],
161 matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1],
162 matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2],
163 matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]
164 );
165 } else {
166 return fmt::format_to(context.out(),
167 "\n{}, {}, {}, {}\n{}, {}, {}, {}\n{}, {}, {}, {}\n{}, {}, {}, {}",
168 matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0],
169 matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1],
170 matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2],
171 matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]
172 );
173 }
174 }
175
176}; // struct fmt::formatter
177
178#include <libsbx/math/matrix4x4.ipp>
179
180#endif // LIBSBX_MATH_MATRIX4X4_HPP_
Angle types and utilities.
constexpr auto operator/(basic_degree< Type > lhs, const Other rhs) noexcept -> basic_degree< Type >
Divides a degree value by a scalar factor.
Definition: angle.ipp:112
constexpr auto operator+(basic_degree< Type > lhs, const basic_degree< Other > &rhs) noexcept -> basic_degree< Type >
Adds two degree values.
Definition: angle.ipp:90
constexpr auto operator*(basic_degree< Type > lhs, const Other rhs) noexcept -> basic_degree< Type >
Multiplies a degree value by a scalar factor.
Definition: angle.ipp:105
Unified angle type stored internally in radians.
Definition: angle.hpp:591
Definition: matrix3x3.hpp:26
Definition: matrix4x4.hpp:26
Fixed-size column-major matrix.
Definition: matrix.hpp:48
static constexpr auto identity(const value_type value=static_cast< value_type >(1)) noexcept -> basic_matrix
Constructs an identity matrix.
Definition: matrix.ipp:113
Definition: vector3.hpp:23
Definition: vector4.hpp:24
Concept for scalar numeric types.
Definition: concepts.hpp:150
Core numeric concepts and type traits.
Generic fixed-size matrix type.