1#ifndef LIBSBX_MATH_MATRIX4X4_HPP_
2#define LIBSBX_MATH_MATRIX4X4_HPP_
13#include <fmt/format.h>
15#include <libsbx/math/concepts.hpp>
16#include <libsbx/math/fwd.hpp>
17#include <libsbx/math/vector3.hpp>
18#include <libsbx/math/vector4.hpp>
19#include <libsbx/math/matrix.hpp>
20#include <libsbx/math/matrix3x3.hpp>
21#include <libsbx/math/angle.hpp>
30 template<scalar Other>
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};
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;
46 inline static constexpr basic_matrix4x4 identity{base_type::identity()};
50 using base_type::base_type;
54 template<scalar Other>
62 template<scalar Other>
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
70 template<scalar Other>
71 constexpr basic_matrix4x4(
const Other v00,
const Other v11,
const Other v22,
const Other v33)
noexcept;
73 template<scalar Other>
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;
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;
107 constexpr auto operator[](size_type index)
const noexcept ->
const column_type&;
109 constexpr auto operator[](size_type index)
noexcept ->
column_type&;
113template<scalar Lhs, scalar Rhs>
116template<scalar Lhs, scalar Rhs>
119template<scalar Lhs, scalar Rhs>
122template<scalar Lhs, scalar Rhs>
125template<scalar Lhs, scalar Rhs>
128template<scalar Lhs, scalar Rhs>
163template<sbx::math::scalar Type>
164struct fmt::formatter<sbx::math::basic_matrix4x4<Type>> {
166 template<
typename ParseContext>
167 constexpr auto parse(ParseContext& context) ->
decltype(context.begin()) {
168 return context.begin();
171 template<
typename FormatContext>
173 if constexpr (sbx::math::is_floating_point_v<Type>) {
174 return fmt::format_to(context.out(),
175 "\n{:.2f}, {:.2f}, {:.2f}, {:.2f}\n{:.2f}, {:.2f}, {:.2f}, {:.2f}\n{:.2f}, {:.2f}, {:.2f}, {:.2f}\n{:.2f}, {:.2f}, {:.2f}, {:.2f}",
176 matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0],
177 matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1],
178 matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2],
179 matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]
182 return fmt::format_to(context.out(),
183 "\n{}, {}, {}, {}\n{}, {}, {}, {}\n{}, {}, {}, {}\n{}, {}, {}, {}",
184 matrix[0][0], matrix[1][0], matrix[2][0], matrix[3][0],
185 matrix[0][1], matrix[1][1], matrix[2][1], matrix[3][1],
186 matrix[0][2], matrix[1][2], matrix[2][2], matrix[3][2],
187 matrix[0][3], matrix[1][3], matrix[2][3], matrix[3][3]
194#include <libsbx/math/matrix4x4.ipp>
Definition: angle.hpp:279
Definition: matrix3x3.hpp:25
Definition: matrix4x4.hpp:26
Definition: matrix.hpp:13
Definition: vector3.hpp:22
Definition: vector4.hpp:22