1 #ifndef EAGINE_MATH_MATRIX_PERSPECTIVE_HPP
9 #define EAGINE_MATH_MATRIX_PERSPECTIVE_HPP
11 #include "../quantities.hpp"
21 template <
typename T,
int N,
bool RM,
bool V>
22 struct is_matrix_constructor<perspective<matrix<T, N, N, RM, V>>>
30 template <
typename T,
bool RM,
bool V>
31 class perspective<
matrix<T, 4, 4, RM, V>> {
33 constexpr perspective(
const vect::data_t<T, 6, V>& v) noexcept
44 : _v{x_left, x_right, y_bottom, y_top, z_near, z_far} {}
52 static auto x(
radians_t<T> xfov, T aspect, T z_near, T z_far) noexcept {
53 EAGINE_ASSERT(aspect > T(0));
54 EAGINE_ASSERT(T(xfov) > T(0));
56 T x_right = z_near * tan(xfov * T(0.5));
59 T y_bottom = x_left / aspect;
60 T y_top = x_right / aspect;
62 return perspective(x_left, x_right, y_bottom, y_top, z_near, z_far);
66 static auto y(
radians_t<T> yfov, T aspect, T z_near, T z_far) noexcept {
67 EAGINE_ASSERT(aspect > T(0));
68 EAGINE_ASSERT(T(yfov) > T(0));
70 T y_top = z_near * tan(yfov * T(0.5));
73 T x_left = y_bottom * aspect;
74 T x_right = y_top * aspect;
76 return perspective(x_left, x_right, y_bottom, y_top, z_near, z_far);
81 EAGINE_ASSERT(T(fov) > T(0));
83 T x_right = z_near * tan(fov * T(0.5));
89 return perspective(x_left, x_right, y_bottom, y_top, z_near, z_far);
93 constexpr
auto _x_left() const noexcept {
97 constexpr
auto _x_right() const noexcept {
101 constexpr
auto _y_bottom() const noexcept {
105 constexpr
auto _y_top() const noexcept {
109 constexpr
auto _z_near() const noexcept {
113 constexpr
auto _z_far() const noexcept {
117 constexpr
auto _m00() const noexcept {
118 return (T(2) * _z_near()) / (_x_right() - _x_left());
121 constexpr
auto _m11() const noexcept {
122 return (T(2) * _z_near()) / (_y_top() - _y_bottom());
125 constexpr
auto _m22() const noexcept {
126 return -(_z_far() + _z_near()) / (_z_far() - _z_near());
129 constexpr
auto _m20() const noexcept {
130 return (_x_right() + _x_left()) / (_x_right() - _x_left());
133 constexpr
auto _m21() const noexcept {
134 return (_y_top() + _y_bottom()) / (_y_top() - _y_bottom());
137 constexpr
auto _m23() const noexcept {
141 constexpr
auto _m32() const noexcept {
142 return -(T(2) * _z_far() * _z_near()) / (_z_far() - _z_near());
145 constexpr
auto _make(std::true_type)
const noexcept {
146 return matrix<T, 4, 4, true, V>{
147 {{_m00(), T(0), _m20(), T(0)},
148 {T(0), _m11(), _m21(), T(0)},
149 {T(0), T(0), _m22(), _m32()},
150 {T(0), T(0), _m23(), T(0)}}};
153 constexpr
auto _make(std::false_type)
const noexcept {
154 return matrix<T, 4, 4, false, V>{
155 {{_m00(), T(0), T(0), T(0)},
156 {T(0), _m11(), T(0), T(0)},
157 {_m20(), _m21(), _m22(), _m23()},
158 {T(0), T(0), _m32(), T(0)}}};
161 using _dT = vect::data_t<T, 6, V>;
166 template <
typename T,
int N,
bool RM,
bool V>
167 static constexpr
auto
168 reorder_mat_ctr(
const perspective<matrix<T, N, N, RM, V>>& c) noexcept
169 -> perspective<matrix<T, N, N, !RM, V>> {
175 template <
typename T,
bool V>
181 #endif // EAGINE_MATH_MATRIX_PERSPECTIVE_HPP