17 template<std::
floating_po
int T>
37 rv[3][0] = -
dot(s, eye);
38 rv[3][1] = -
dot(u, eye);
39 rv[3][2] =
dot(f, eye);
43 template<std::
floating_po
int T, AngularUnitTraits Units>
46 if (fabs(aspect - epsilon_v<T>) <=
T{}) {
53 const T tan_half_fovy =
tan(vertical_field_of_view /
static_cast<T>(2));
56 rv[0][0] =
static_cast<T>(1) / (aspect * tan_half_fovy);
57 rv[1][1] =
static_cast<T>(1) / (tan_half_fovy);
58 rv[2][2] = - (z_far + z_near) / (z_far - z_near);
59 rv[2][3] = -
static_cast<T>(1);
60 rv[3][2] = - (
static_cast<T>(2) * z_far * z_near) / (z_far - z_near);
64 template<std::
floating_po
int T>
68 rv[0][0] =
static_cast<T>(2) / (right - left);
69 rv[1][1] =
static_cast<T>(2) / (top - bottom);
70 rv[2][2] = -
static_cast<T>(2) / (z_far - z_near);
71 rv[3][0] = - (right + left) / (right - left);
72 rv[3][1] = - (top + bottom) / (top - bottom);
73 rv[3][2] = - (z_far + z_near) / (z_far - z_near);
88 template<std::
floating_po
int T, AngularUnitTraits Units>
91 const T c =
cos(angle);
92 const T s =
sin(angle);
97 rotate[0][0] = c + temp[0] * axis[0];
98 rotate[0][1] = temp[0] * axis[1] + s * axis[2];
99 rotate[0][2] = temp[0] * axis[2] - s * axis[1];
101 rotate[1][0] = temp[1] * axis[0] - s * axis[2];
102 rotate[1][1] = c + temp[1] * axis[1];
103 rotate[1][2] = temp[1] * axis[2] + s * axis[0];
105 rotate[2][0] = temp[2] * axis[0] + s * axis[1];
106 rotate[2][1] = temp[2] * axis[1] - s * axis[0];
107 rotate[2][2] = c + temp[2] * axis[2];
121 rv[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3];
125 template<std::
floating_po
int T>
129 + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2])
130 - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2])
131 + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]
135 template<std::
floating_po
int T>
138 const T subfactor_00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
139 const T subfactor_01 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
140 const T subfactor_02 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
141 const T subfactor_03 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
142 const T subfactor_04 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
143 const T subfactor_05 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
146 + (m[1][1] * subfactor_00 - m[1][2] * subfactor_01 + m[1][3] * subfactor_02),
147 - (m[1][0] * subfactor_00 - m[1][2] * subfactor_03 + m[1][3] * subfactor_04),
148 + (m[1][0] * subfactor_01 - m[1][1] * subfactor_03 + m[1][3] * subfactor_05),
149 - (m[1][0] * subfactor_02 - m[1][1] * subfactor_04 + m[1][2] * subfactor_05)
153 m[0][0] * determinant_coef[0] + m[0][1] * determinant_coef[1] +
154 m[0][2] * determinant_coef[2] + m[0][3] * determinant_coef[3];
157 template<std::
floating_po
int T>
163 rv[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]) * one_over_determinant;
164 rv[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]) * one_over_determinant;
165 rv[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]) * one_over_determinant;
166 rv[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]) * one_over_determinant;
167 rv[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]) * one_over_determinant;
168 rv[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]) * one_over_determinant;
169 rv[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]) * one_over_determinant;
170 rv[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]) * one_over_determinant;
171 rv[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]) * one_over_determinant;
175 template<std::
floating_po
int T>
178 const T coef_00 = m[2][2] * m[3][3] - m[3][2] * m[2][3];
179 const T coef_02 = m[1][2] * m[3][3] - m[3][2] * m[1][3];
180 const T coef_03 = m[1][2] * m[2][3] - m[2][2] * m[1][3];
182 const T coef_04 = m[2][1] * m[3][3] - m[3][1] * m[2][3];
183 const T coef_06 = m[1][1] * m[3][3] - m[3][1] * m[1][3];
184 const T coef_07 = m[1][1] * m[2][3] - m[2][1] * m[1][3];
186 const T coef_08 = m[2][1] * m[3][2] - m[3][1] * m[2][2];
187 const T coef_10 = m[1][1] * m[3][2] - m[3][1] * m[1][2];
188 const T coef_11 = m[1][1] * m[2][2] - m[2][1] * m[1][2];
190 const T coef_12 = m[2][0] * m[3][3] - m[3][0] * m[2][3];
191 const T coef_14 = m[1][0] * m[3][3] - m[3][0] * m[1][3];
192 const T coef_15 = m[1][0] * m[2][3] - m[2][0] * m[1][3];
194 const T coef_16 = m[2][0] * m[3][2] - m[3][0] * m[2][2];
195 const T coef_18 = m[1][0] * m[3][2] - m[3][0] * m[1][2];
196 const T coef_19 = m[1][0] * m[2][2] - m[2][0] * m[1][2];
198 const T coef_20 = m[2][0] * m[3][1] - m[3][0] * m[2][1];
199 const T coef_22 = m[1][0] * m[3][1] - m[3][0] * m[1][1];
200 const T coef_23 = m[1][0] * m[2][1] - m[2][0] * m[1][1];
202 const Vector<T, 4> fac_0(coef_00, coef_00, coef_02, coef_03);
203 const Vector<T, 4> fac_1(coef_04, coef_04, coef_06, coef_07);
204 const Vector<T, 4> fac_2(coef_08, coef_08, coef_10, coef_11);
205 const Vector<T, 4> fac_3(coef_12, coef_12, coef_14, coef_15);
206 const Vector<T, 4> fac_4(coef_16, coef_16, coef_18, coef_19);
207 const Vector<T, 4> fac_5(coef_20, coef_20, coef_22, coef_23);
209 const Vector<T, 4> vec_0(m[1][0], m[0][0], m[0][0], m[0][0]);
210 const Vector<T, 4> vec_1(m[1][1], m[0][1], m[0][1], m[0][1]);
211 const Vector<T, 4> vec_2(m[1][2], m[0][2], m[0][2], m[0][2]);
212 const Vector<T, 4> vec_3(m[1][3], m[0][3], m[0][3], m[0][3]);
214 const Vector<T, 4> inv_0(vec_1 * fac_0 - vec_2 * fac_1 + vec_3 * fac_2);
215 const Vector<T, 4> inv_1(vec_0 * fac_0 - vec_2 * fac_3 + vec_3 * fac_4);
216 const Vector<T, 4> inv_2(vec_0 * fac_1 - vec_1 * fac_3 + vec_3 * fac_5);
217 const Vector<T, 4> inv_3(vec_0 * fac_2 - vec_1 * fac_4 + vec_2 * fac_5);
221 const Matrix<T, 4, 4> inverted(inv_0 * sign_a, inv_1 * sign_b, inv_2 * sign_a, inv_3 * sign_b);
223 const Vector<T, 4> row_0(inverted[0][0], inverted[1][0], inverted[2][0], inverted[3][0]);
226 const T dot_1 = (dot_0.
x() + dot_0.
y()) + (dot_0.
z() + dot_0.
w());
228 const T one_over_determinant =
static_cast<T>(1) / dot_1;
230 return inverted * one_over_determinant;
278 template<std::
floating_po
int T>
282 const T c2 =
sqrt(m[0][0]*m[0][0] + m[1][0]*m[1][0]);
284 const T s1 =
sin(t1);
285 const T c1 =
cos(t1);
286 const RadiansT<T> t3 =
atan2(s1*m[0][2] - c1*m[0][1], c1*m[1][1] - s1*m[1][2 ]);
297 return (a * ascl) + (b * bscl);
303 return v * desiredLength /
length(v);
327 for (
size_t i = 0; i < 4; ++i) {
328 for (
size_t j = 0; j < 4; ++j) {
329 local_matrix[i][j] /= local_matrix[3][3];
336 for (
size_t i = 0; i < 3; i++) {
337 perspective_matrix[i][3] =
static_cast<T>(0);
339 perspective_matrix[3][3] =
static_cast<T>(1);
365 r_perspective = transposed_inverse_perspective_matrix * right_hand_side;
368 local_matrix[0][3] = local_matrix[1][3] = local_matrix[2][3] =
static_cast<T>(0);
369 local_matrix[3][3] =
static_cast<T>(1);
378 local_matrix[3] =
Vector<T, 4>(0, 0, 0, local_matrix[3].w());
383 for (
size_t i = 0; i < 3; ++i) {
384 for(
size_t j = 0; j < 3; ++j) {
385 Row[i][j] = local_matrix[i][j];
395 r_skew.
z() =
dot(Row[0], Row[1]);
401 r_skew.
z() /= r_scale.
y();
404 r_skew.
y() =
dot(Row[0], Row[2]);
406 r_skew.
x() =
dot(Row[1], Row[2]);
412 r_skew.
y() /= r_scale.
z();
413 r_skew.
x() /= r_scale.
z();
419 Pdum3 =
cross(Row[1], Row[2]);
420 if (
dot(Row[0], Pdum3) < 0) {
421 for (
size_t i = 0; i < 3; i++) {
422 r_scale[i] *=
static_cast<T>(-1);
423 Row[i] *=
static_cast<T>(-1);
449 T trace = Row[0].
x() + Row[1].
y() + Row[2].
z();
450 if (
trace >
static_cast<T>(0)) {
452 r_orientation.
w =
static_cast<T>(0.5) * root;
453 root =
static_cast<T>(0.5) / root;
454 r_orientation.
x = root * (Row[1].
z() - Row[2].
y());
455 r_orientation.
y = root * (Row[2].
x() - Row[0].
z());
456 r_orientation.
z = root * (Row[0].
y() - Row[1].
x());
459 static int next[3] = {1, 2, 0};
461 if(Row[1].y() > Row[0].
x()) i = 1;
462 if(Row[2].z() > Row[i][i]) i = 2;
468 root =
sqrt(Row[i][i] - Row[j][j] - Row[k][k] +
static_cast<T>(1.0));
470 r_orientation[i +
off] =
static_cast<T>(0.5) * root;
471 root =
static_cast<T>(0.5) / root;
472 r_orientation[j +
off] = root * (Row[i][j] + Row[j][i]);
473 r_orientation[k +
off] = root * (Row[i][k] + Row[k][i]);
474 r_orientation.
w = root * (Row[j][k] - Row[k][j]);
480 template<std::
floating_po
int T>
489 rv[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]);
490 rv[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]);
491 rv[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]);
492 rv[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]);
493 rv[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]);
494 rv[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]);
495 rv[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]);
496 rv[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]);
497 rv[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]);
501 template<std::
floating_po
int T>
522 template<std::
floating_po
int T>
528 template<
typename T,
size_t C,
size_t R>
531 return m.data()->data();
534 template<
typename T,
size_t C,
size_t R>
537 return m.data()->data();
554template<
typename T,
size_t C,
size_t R>
555struct std::hash<
osc::Matrix<T, C, R>> final {
constexpr reference x()
Returns (*this)[0]
Definition vector.h:157
constexpr reference z()
Returns (*this)[2]
Definition vector.h:167
constexpr reference w()
Returns (*this)[3]
Definition vector.h:172
constexpr reference y()
Returns (*this)[1]
Definition vector.h:162
Vector< T, 3 > scale(const Vector< T, 3 > &v, T desiredLength)
Definition matrix_functions.h:301
Vector< T, 3 > combine(const Vector< T, 3 > &a, const Vector< T, 3 > &b, T ascl, T bscl)
Make a linear combination of two vectors and return the result.
Definition matrix_functions.h:295
Definition custom_decoration_generator.h:5
EulerAngles extract_eulers_xyz(const Quaternion &)
bool equal_within_epsilon(T x, T y)
Definition common_functions.h:265
GenType cos(GenType v)
Definition trigonometric_functions.h:37
constexpr Matrix< T, 3, 3 > adjugate(const Matrix< T, 3, 3 > &m)
Definition matrix_functions.h:481
T length(const Vector< T, N > &v)
Definition geometric_functions.h:62
Matrix< T, 4, 4 > translate(const Matrix< T, 4, 4 > &m, const Vector< T, 3 > &v)
Definition matrix_functions.h:118
Matrix< T, 4, 4 > look_at(const Vector< T, 3 > &eye, const Vector< T, 3 > ¢er, const Vector< T, 3 > &up)
Definition matrix_functions.h:18
Vector3 transform_point(const Matrix4x4 &mat, const Vector3 &point)
Definition matrix_functions.h:540
Vector3 transform_vector(const Matrix4x4 &mat, const Vector3 &vector)
Definition matrix_functions.h:545
constexpr T dot(T x, T y)
Definition geometric_functions.h:31
Matrix4x4 matrix4x4_transform_between_directions(const Vector3 &dir1, const Vector3 &dir2)
Matrix< T, 4, 4 > perspective(Angle< T, Units > vertical_field_of_view, T aspect, T z_near, T z_far)
Definition matrix_functions.h:44
Matrix< T, 4, 4 > ortho(T left, T right, T bottom, T top, T z_near, T z_far)
Definition matrix_functions.h:65
GenType sin(GenType v)
Definition trigonometric_functions.h:13
Matrix< T, 3, 3 > normal_matrix(const Matrix< T, 4, 4 > &m)
Definition matrix_functions.h:502
Matrix< T, 4, 4 > rotate(const Matrix< T, 4, 4 > &m, Angle< T, Units > angle, Vector< T, 3 > axis)
Definition matrix_functions.h:89
T inverse(const Matrix< T, 3, 3 > &m)
Definition matrix_functions.h:158
Matrix< T, 4, 4 > normal_matrix4x4(const Matrix< T, 4, 4 > &m)
Definition matrix_functions.h:523
Vector< T, N > normalize(const Vector< T, N > &v)
Definition geometric_functions.h:76
RadiansT< Rep > atan2(Rep x, Rep y)
Definition trigonometric_functions.h:103
T determinant_of(const Matrix< T, 3, 3 > &m)
Definition matrix_functions.h:126
Matrix< T, 4, 4 > scale(const Matrix< T, 4, 4 > &m, const Vector< T, 3 > &v)
Definition matrix_functions.h:78
constexpr Matrix< T, 3, 3 > transpose(const Matrix< T, 3, 3 > &m)
Definition matrix_functions.h:234
GenType tan(GenType v)
Definition trigonometric_functions.h:61
T sqrt(T num)
Definition geometric_functions.h:16
bool decompose(const Matrix< T, 4, 4 > &model_matrix, Vector< T, 3 > &r_scale, Qua< T > &r_orientation, Vector< T, 3 > &r_translation, Vector< T, 3 > &r_skew, Vector< T, 4 > &r_perspective)
Definition matrix_functions.h:308
constexpr const T * value_ptr(const Rgba< T > &rgba)
Definition rgba.h:180
size_t hash_range(const Range &range) noexcept(noexcept(hash_combine(0, *std::ranges::begin(range))))
Definition hash_helpers.h:36
constexpr CoordinateDirection cross(CoordinateDirection x, CoordinateDirection y)
Definition coordinate_direction.h:124
size_t operator()(const osc::Matrix< T, C, R > &m) const
Definition matrix_functions.h:556