SH4ZAM! 0.1.0
Fast math library for the Sega Dreamcast's SH4 CPU
Loading...
Searching...
No Matches
shz_matrix.hpp
Go to the documentation of this file.
1/*! \file
2 \brief C++ routines for operating on in-memory matrices.
3 \ingroup matrix
4
5 This file provides a C++ binding layer over the C API provided by
6 shz_matrix.h.
7
8 \author 2025, 2026 Falco Girgis
9 \copyright MIT License
10
11 \todo
12 - Fully document
13 - Operator overloading
14 - full transforms (GL-style) taking a separate destination matrix?
15*/
16
17#ifndef SHZ_MATRIX_HPP
18#define SHZ_MATRIX_HPP
19
20#include "shz_matrix.h"
21#include "shz_vector.hpp"
22#include "shz_quat.hpp"
23#include "shz_xmtrx.hpp"
24
25namespace shz {
26
27 struct mat4x4: public shz_mat4x4_t {
28 static constexpr size_t Rows = 4; //!< Number of rows
29 static constexpr size_t Cols = 4; //!< Number of columns
30
31 mat4x4() noexcept = default;
32
33 SHZ_FORCE_INLINE mat4x4(const mat4x4& other) noexcept {
34 shz_mat4x4_copy(this, &other);
35 }
36
37 SHZ_FORCE_INLINE mat4x4(const shz_mat4x4_t& other) noexcept {
38 shz_mat4x4_copy(this, &other);
39 }
40
41#ifdef SHZ_CPP23
42 //! Returns a pointer to the internal floating-point array held by the matrix.
43 SHZ_FORCE_INLINE auto data(this auto&& self) noexcept {
44 return &self[0];
45 }
46
47 //! Overloaded subscript operator -- allows for indexing matrices like an array.
48 SHZ_FORCE_INLINE auto&& operator[](this auto&& self, size_t index) noexcept {
49 return std::forward<decltype(self)>(self).elem[index];
50 }
51
52 //! Returns an iterator to the beginning of the matrix -- For STL support.
53 SHZ_FORCE_INLINE auto begin(this auto&& self) noexcept {
54 return &self[0];
55 }
56
57 //! Returns an iterator to the end of the matrix -- For STL support.
58 SHZ_FORCE_INLINE auto end(this auto&& self) noexcept {
59 return &self[Rows * Cols];
60 }
61
62 //! Overloaded space-ship operator, for generic lexicographical comparison of matrices.
63 friend constexpr auto operator<=>(const mat4x4& lhs, const mat4x4& rhs) noexcept {
65 rhs.begin(), rhs.end());
66 }
67
68 //! Overloaded "less-than" operator, for comparing matrices.
69 friend constexpr auto operator<(const mat4x4& lhs, const mat4x4& rhs) noexcept {
71 rhs.begin(), rhs.end());
72 }
73#endif
74 //! Overloaded equality operator, for comparing vectors.
75 friend bool operator==(const mat4x4& lhs, const mat4x4& rhs) noexcept {
76 return shz_mat4x4_equal(&lhs, &rhs);
77 }
78
79 mat4x4& operator=(const shz_mat4x4_t& other) noexcept {
80 shz_mat4x4_copy(this, &other);
81 return *this;
82 }
83
84 /*! \name Initialization
85 \brief Routines for fully initializing a matrix.
86 @{
87 */
88
89 SHZ_FORCE_INLINE void init_identity() noexcept {
91 }
92
93 SHZ_FORCE_INLINE void init_identity_safe() noexcept {
95 }
96
97 SHZ_FORCE_INLINE void init_zero() noexcept {
99 }
100
101 SHZ_FORCE_INLINE void init_one() noexcept {
103 }
104
105 SHZ_FORCE_INLINE void init_fill(float value) noexcept {
106 shz_mat4x4_init_fill(this, value);
107 }
108
109 SHZ_FORCE_INLINE void init_translation(float x, float y, float z) noexcept {
111 }
112
113 SHZ_FORCE_INLINE void init_scale(float x, float y, float z) noexcept {
115 }
116
117 SHZ_FORCE_INLINE void init_rotation_x(float angle) noexcept {
119 }
120
121 SHZ_FORCE_INLINE void init_rotation_y(float angle) noexcept {
123 }
124
125 SHZ_FORCE_INLINE void init_rotation_z(float angle) noexcept {
127 }
128
129 SHZ_FORCE_INLINE void init_rotation_xyz(float xAngle, float yAngle, float zAngle) noexcept {
130 shz_mat4x4_init_rotation_xyz(this, xAngle, yAngle, zAngle);
131 }
132
133 SHZ_FORCE_INLINE void init_rotation_zyx(float zAngle, float yAngle, float xAngle) noexcept {
134 shz_mat4x4_init_rotation_zyx(this, zAngle, yAngle, xAngle);
135 }
136
137 SHZ_FORCE_INLINE void init_rotation_zxy(float zAngle, float xAngle, float yAngle) noexcept {
138 shz_mat4x4_init_rotation_zxy(this, zAngle, xAngle, yAngle);
139 }
140
141 SHZ_FORCE_INLINE void init_rotation_yxz(float yAngle, float xAngle, float zAngle) noexcept {
142 shz_mat4x4_init_rotation_yxz(this, yAngle, xAngle, zAngle);
143 }
144
145 //! C++ wrapper for shz_mat4x4_init_rotation().
146 SHZ_FORCE_INLINE void init_rotation(float angle, float x, float y, float z) noexcept {
147 shz_mat4x4_init_rotation(this, angle, x, y, z);
148 }
149
150 SHZ_FORCE_INLINE void init_rotation(quat q) noexcept {
152 }
153
154 SHZ_FORCE_INLINE void init_diagonal(float x, float y, float z, float w) noexcept {
156 }
157
158 SHZ_FORCE_INLINE void init_upper_triangular(float col1, vec2 col2, vec3 col3, vec4 col4) noexcept{
159 shz_mat4x4_init_upper_triangular(this, col1, col2, col3, col4);
160 }
161
162 SHZ_FORCE_INLINE void init_lower_triangular(vec4 col1, vec3 col2, vec2 col3, float col4) noexcept {
163 shz_mat4x4_init_lower_triangular(this, col1, col2, col3, col4);
164 }
165
166 SHZ_FORCE_INLINE void init_symmetric_skew(float x, float y, float z) noexcept {
168 }
169
170 SHZ_FORCE_INLINE void init_outer_product(vec4 v1, vec4 v2) noexcept {
171 shz_mat4x4_init_outer_product(this, v1, v2);
172 }
173
174 SHZ_FORCE_INLINE void init_permutation_wxyz() noexcept {
176 }
177
178 SHZ_FORCE_INLINE void init_permutation_yzwx() noexcept {
180 }
181
182 SHZ_FORCE_INLINE void init_screen(float width, float height) noexcept {
183 shz_mat4x4_init_screen(this, width, height);
184 }
185
186 SHZ_FORCE_INLINE void init_lookat(vec3 eye, vec3 center, vec3 up) noexcept {
187 shz_mat4x4_init_lookat(this, eye, center, up);
188 }
189
190 SHZ_FORCE_INLINE void init_ortho(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
191 shz_mat4x4_init_ortho(this, left, right, bottom, top, znear, zfar);
192 }
193
194 SHZ_FORCE_INLINE void init_frustum(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
195 shz_mat4x4_init_frustum(this, left, right, bottom, top, znear, zfar);
196 }
197
198 SHZ_FORCE_INLINE void init_perspective(float fov, float aspect, float znear) noexcept {
199 shz_mat4x4_init_perspective(this, fov, aspect, znear);
200 }
201
202 //! @}
203
204 /*! \name Getting
205 \brief Routines for getting specific values within a matrix
206 @{
207 */
208
209 //! C++ wrapper for shz_mat4x4_row().
210 SHZ_FORCE_INLINE vec4 row(size_t index) const noexcept {
211 return shz_mat4x4_row(this, index);
212 }
213
214 //! C++ wrapper for shz_mat4x4_col().
215 SHZ_FORCE_INLINE vec4 col(size_t index) const noexcept {
216 return shz_mat4x4_col(this, index);
217 }
218
219 SHZ_FORCE_INLINE vec3 get_translation() const noexcept {
221 }
222
223 //! @}
224
225 /*! \name Setting
226 \brief Routines for setting specific values within a matrix
227 @{
228 */
229
230 SHZ_FORCE_INLINE void set_row(size_t index, vec4 values) noexcept {
231 shz_mat4x4_set_row(this, index, values);
232 }
233
234 SHZ_FORCE_INLINE void set_col(size_t index, vec4 values) noexcept {
235 shz_mat4x4_set_col(this, index, values);
236 }
237
238 SHZ_FORCE_INLINE void swap_rows(size_t row1, size_t row2) noexcept {
239 shz_mat4x4_swap_rows(this, row1, row2);
240 }
241
242 SHZ_FORCE_INLINE void swap_cols(size_t col1, size_t col2) noexcept {
243 shz_mat4x4_swap_cols(this, col1, col2);
244 }
245
246 SHZ_FORCE_INLINE void set_translation(float x, float y, float z) noexcept {
248 }
249
250 SHZ_FORCE_INLINE void set_scale(float x, float y, float z) noexcept {
252 }
253
254 SHZ_FORCE_INLINE void set_rotation(quat rot) noexcept {
256 }
257
258 SHZ_FORCE_INLINE void set_diagonal(float x, float y, float z, float w) noexcept {
260 }
261
262 //! @}
263
264 /*! \name Applying
265 \brief Routines for multiplying and accumulating onto the given matrix.
266 @{
267 */
268
269 SHZ_FORCE_INLINE void apply(const shz_mat4x4_t& mat) noexcept {
270 shz_mat4x4_apply(this, &mat);
271 }
272
273 SHZ_FORCE_INLINE void apply(const float mat[16]) noexcept {
275 }
276
277 SHZ_FORCE_INLINE void apply_transpose(const shz_mat4x4_t& mat) noexcept {
279 }
280
281 SHZ_FORCE_INLINE void apply_transpose(const float mat[16]) noexcept {
283 }
284
285 SHZ_FORCE_INLINE void apply_scale(float x, float y, float z) noexcept {
287 }
288
289 SHZ_FORCE_INLINE void apply_translation(float x, float y, float z) noexcept {
291 }
292
293 SHZ_FORCE_INLINE void apply_rotation_x(float angle) noexcept {
295 }
296
297 SHZ_FORCE_INLINE void apply_rotation_y(float angle) noexcept {
299 }
300
301 SHZ_FORCE_INLINE void apply_rotation_z(float angle) noexcept {
303 }
304
305 SHZ_FORCE_INLINE void apply_rotation_xyz(float xAngle, float yAngle, float zAngle) noexcept {
306 shz_mat4x4_apply_rotation_xyz(this, xAngle, yAngle, zAngle);
307 }
308
309 SHZ_FORCE_INLINE void apply_rotation_zyx(float zAngle, float yAngle, float xAngle) noexcept {
310 shz_mat4x4_apply_rotation_zyx(this, zAngle, yAngle, xAngle);
311 }
312
313 SHZ_FORCE_INLINE void apply_rotation_zxy(float zAngle, float xAngle, float yAngle) noexcept {
314 shz_mat4x4_apply_rotation_zxy(this, zAngle, xAngle, yAngle);
315 }
316
317 SHZ_FORCE_INLINE void apply_rotation_yxz(float yAngle, float xAngle, float zAngle) noexcept {
318 shz_mat4x4_apply_rotation_yxz(this, yAngle, xAngle, zAngle);
319 }
320
321 SHZ_FORCE_INLINE void apply_rotation(float angle, float x, float y, float z) noexcept {
322 shz_mat4x4_apply_rotation(this, angle, x, y, z);
323 }
324
325 SHZ_FORCE_INLINE void apply_rotation(quat q) noexcept {
327 }
328
329 SHZ_FORCE_INLINE void apply_lookat(vec3 pos, vec3 target, vec3 up) noexcept {
330 shz_mat4x4_apply_lookat(this, pos, target, up);
331 }
332
333 SHZ_FORCE_INLINE void apply_ortho(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
334 shz_mat4x4_apply_ortho(this, left, right, bottom, top, znear, zfar);
335 }
336
337 SHZ_FORCE_INLINE void apply_frustum(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
338 shz_mat4x4_apply_frustum(this, left, right, bottom, top, znear, zfar);
339 }
340
341 SHZ_FORCE_INLINE void apply_perspective(float fov, float aspect, float znear) noexcept {
342 shz_mat4x4_apply_perspective(this, fov, aspect, znear);
343 }
344
345 SHZ_FORCE_INLINE void apply_screen(float width, float height) noexcept {
346 shz_mat4x4_apply_screen(this, width, height);
347 }
348
349 SHZ_FORCE_INLINE void apply_symmetric_skew(float x, float y, float z) noexcept {
351 }
352
353 SHZ_FORCE_INLINE void apply_permutation_wxyz() noexcept {
355 }
356
357 SHZ_FORCE_INLINE void apply_permutation_yzwx() noexcept {
359 }
360
361 SHZ_FORCE_INLINE void apply_self() noexcept {
363 }
364
365 //! @}
366
367 /*! \name GL Transformations
368 \brief OpenGL-style 4x4 matrix transforms.
369 @{
370 */
371
372 SHZ_FORCE_INLINE void translate(float x, float y, float z) noexcept {
374 }
375
376 SHZ_FORCE_INLINE void scale(float x, float y, float z) noexcept {
377 shz_mat4x4_scale(this, x, y, z);
378 }
379
380 SHZ_FORCE_INLINE void rotate_x(float radians) noexcept {
381 shz_mat4x4_rotate_x(this, radians);
382 }
383
384 SHZ_FORCE_INLINE void rotate_y(float radians) noexcept {
385 shz_mat4x4_rotate_y(this, radians);
386 }
387
388 SHZ_FORCE_INLINE void rotate_z(float radians) noexcept {
389 shz_mat4x4_rotate_z(this, radians);
390 }
391
392 SHZ_FORCE_INLINE void rotate_xyz(float xRadians, float yRadians, float zRadians) noexcept {
393 shz_mat4x4_rotate_xyz(this, xRadians, yRadians, zRadians);
394 }
395
396 SHZ_FORCE_INLINE void rotate_zyx(float zRadians, float yRadians, float xRadians) noexcept {
397 shz_mat4x4_rotate_zyx(this, zRadians, yRadians, xRadians);
398 }
399
400 SHZ_FORCE_INLINE void rotate_zxy(float zRadians, float xRadians, float yRadians) noexcept {
401 shz_mat4x4_rotate_zxy(this, zRadians, xRadians, yRadians);
402 }
403
404 SHZ_FORCE_INLINE void rotate_yxz(float yRadians, float xRadians, float zRadians) noexcept {
405 shz_mat4x4_rotate_yxz(this, yRadians, xRadians, zRadians);
406 }
407
408 SHZ_FORCE_INLINE void rotate(float radians, float xAxis, float yAxis, float zAxis) noexcept {
409 shz_mat4x4_rotate(this, radians, xAxis, yAxis, zAxis);
410 }
411
412 //! @}
413
414 /*! \name Multiplication
415 \brief Routines for multiplying two matrices and storing the result in a third.
416 @{
417 */
418
419 SHZ_FORCE_INLINE static void mult(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const shz_mat4x4_t& rhs) noexcept {
420 shz_mat4x4_mult(dst, &lhs, &rhs);
421 }
422
423 SHZ_FORCE_INLINE static void mult(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const float rhs[16]) noexcept {
425 }
426
427 SHZ_FORCE_INLINE static void mult_transpose(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const shz_mat4x4_t& rhs) noexcept {
429 }
430
431 SHZ_FORCE_INLINE static void mult_transpose(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const float rhs[16]) noexcept {
433 }
434
435 //! @}
436
437 /*! \name Transforming
438 \brief Routines for transforming vectors and points by a matrix.
439 @{
440 */
441
442 SHZ_FORCE_INLINE vec2 transform(vec2 in) const noexcept {
443 return shz_mat4x4_transform_vec2(this, in);
444 }
445
446 SHZ_FORCE_INLINE vec3 transform(vec3 in) const noexcept {
447 return shz_mat4x4_transform_vec3(this, in);
448 }
449
450 SHZ_FORCE_INLINE vec4 transform(vec4 in) const noexcept {
451 return shz_mat4x4_transform_vec4(this, in);
452 }
453
454 SHZ_FORCE_INLINE vec2 transform_point(vec2 pt) const noexcept {
455 return shz_mat4x4_transform_point2(this, pt);
456 }
457
458 SHZ_FORCE_INLINE vec3 transform_point(vec3 pt) const noexcept {
459 return shz_mat4x4_transform_point3(this, pt);
460 }
461
462 SHZ_FORCE_INLINE vec2 transform_transpose(vec2 in) const noexcept {
463 return shz_mat4x4_transform_vec2_transpose(this, in);
464 }
465
466 SHZ_FORCE_INLINE vec3 transform_transpose(vec3 in) const noexcept {
467 return shz_mat4x4_transform_vec3_transpose(this, in);
468 }
469
470 SHZ_FORCE_INLINE vec4 transform_transpose(vec4 in) const noexcept {
471 return shz_mat4x4_transform_vec4_transpose(this, in);
472 }
473
474 SHZ_FORCE_INLINE vec2 transform_point_transpose(vec2 pt) const noexcept {
475 return shz_mat4x4_transform_point2_transpose(this, pt);
476 }
477
478 SHZ_FORCE_INLINE vec3 transform_point_transpose(vec3 pt) const noexcept {
479 return shz_mat4x4_transform_point3_transpose(this, pt);
480 }
481
482 //! @}
483
484 /*! \name Miscellaneous
485 \brief Other matrix-related operations and routines
486 @{
487 */
488
489 SHZ_FORCE_INLINE static void copy(shz_mat4x4_t* lhs, const shz_mat4x4_t& rhs) noexcept {
490 shz_mat4x4_copy(lhs, &rhs);
491 }
492
493 SHZ_FORCE_INLINE static void copy(shz_mat4x4_t* lhs, const float rhs[16]) noexcept {
495 }
496
497 friend SHZ_FORCE_INLINE void swap(shz_mat4x4_t& matA, shz_mat4x4_t& matB) noexcept {
498 shz_mat4x4_swap(&matA, &matB);
499 }
500
501 SHZ_FORCE_INLINE quat to_quat() const noexcept {
502 return shz_mat4x4_to_quat(this);
503 }
504
505 SHZ_FORCE_INLINE float determinant() const noexcept {
506 return shz_mat4x4_determinant(this);
507 }
508
509 SHZ_FORCE_INLINE float trace() const noexcept {
510 return shz_mat4x4_trace(this);
511 }
512
513 SHZ_FORCE_INLINE void inverse(mat4x4* out) const noexcept {
514 shz_mat4x4_inverse(this, out);
515 }
516
517 SHZ_FORCE_INLINE void inverse_block_triangular(mat4x4* out) const noexcept {
519 }
520
521 SHZ_FORCE_INLINE void decompose(vec3* translation, quat* rotation, vec3* scale) const noexcept {
522 shz_mat4x4_decompose(this, translation, rotation, scale);
523 }
524
525 //! @}
526 };
527
528 //! Alternate mat4x4 C++ alias for those who like POSIX style.
529 using mat4x4_t = mat4x4;
530}
531
532#endif
Namespace enclosing the SH4ZAM C++ API.
Definition shz_cdefs.hpp:21
void shz_mat4x4_apply_rotation_y(shz_mat4x4_t *mat, float yAngle) SHZ_NOEXCEPT
Multiplies and accumulates a rotation matrix by yAngle radians about the Y-axis onto the given matrix...
void shz_mat4x4_scale(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Multiplies and accumulates mat by a 3D scaling matrix with the given components.
void shz_mat4x4_init_rotation_z(shz_mat4x4_t *mat, float zAngle) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix by zAngle radians over the Z-axis.
void shz_mat4x4_set_diagonal(shz_mat4x4_t *mat, float x, float y, float z, float w) SHZ_NOEXCEPT
Assigns only the 4 elements along the diagonal of the given matrix to the given values.
void shz_mat4x4_init_rotation_zxy(shz_mat4x4_t *mat, float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
void shz_mat4x4_apply_permutation_yzwx(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors...
void shz_mat4x4_init_frustum(shz_mat4x4_t *mat, float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Initializes the given matrix to a frustum projection matrix.
void shz_mat4x4_mult_transpose_unaligned(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const float rhs[16]) SHZ_NOEXCEPT
Multiplies the regular matrix, lhs, by the transpose of the unaligned matrix, rhs,...
void shz_mat4x4_copy_unaligned(shz_mat4x4_t *dst, const float src[16]) SHZ_NOEXCEPT
Copies the given unaligned src 4x4 matrix into the given dst 4x4 matrix.
void shz_mat4x4_rotate_y(shz_mat4x4_t *mat, float radians) SHZ_NOEXCEPT
Multiplies and accumulates mat by a 3D rotation matrix about the Y axis.
void shz_mat4x4_mult_transpose(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const shz_mat4x4_t *rhs) SHZ_NOEXCEPT
Multiplies the regular matrix, lhs, by the transpose of the matrix, rhs, storing the result into mat.
void shz_mat4x4_mult(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const shz_mat4x4_t *rhs) SHZ_NOEXCEPT
Multiplies two 4x4 matrices together, storing the result into a third.
void shz_mat4x4_apply_transpose(shz_mat4x4_t *dst, const shz_mat4x4_t *src) SHZ_NOEXCEPT
Multiplies and accumulates the transposed src 4x4 matrix onto the dst 4x4 matrix.
void shz_mat4x4_apply_transpose_unaligned(shz_mat4x4_t *dst, const float src[16]) SHZ_NOEXCEPT
Multiplies and accumulates the transposed unaligned src 4x4 matrix onto the dst 4x4 matrix.
void shz_mat4x4_init_identity(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Initializes the given matrix to the identity matrix as fast as possible.
void shz_mat4x4_init_rotation(shz_mat4x4_t *mat, float radians, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix about the given axis rotated by angle radians.
void shz_mat4x4_init_permutation_wxyz(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Initializes the matrix to to a permutation matrix, which reorders the components of transformed vecto...
void shz_mat4x4_init_rotation_xyz(shz_mat4x4_t *mat, float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
void shz_mat4x4_apply_perspective(shz_mat4x4_t *m, float fov, float aspect, float znear) SHZ_NOEXCEPT
Multiplies and accumulates the perspective matrix constructed from the given values onto the given ma...
void shz_mat4x4_apply_rotation_quat(shz_mat4x4_t *m, shz_quat_t q) SHZ_NOEXCEPT
Multiplies and accumulates the given matrix with a rotation matrix whose orientation is given by a qu...
void shz_mat4x4_init_rotation_y(shz_mat4x4_t *mat, float yAngle) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix by yAngle radians over the Y-axis.
void shz_mat4x4_init_zero(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Initializes the given matrix with all 0s for its element values.
void shz_mat4x4_swap_rows(shz_mat4x4_t *mat, size_t row1, size_t row2) SHZ_NOEXCEPT
Swaps the 4D row vectors located at row1 and row2 within mat.
float shz_mat4x4_determinant(const shz_mat4x4_t *mat) SHZ_NOEXCEPT
Returns the determinant of the given 4x4 matrix.
void shz_mat4x4_apply_screen(shz_mat4x4_t *m, float width, float height) SHZ_NOEXCEPT
Multiplies and accumulates the viewport matrix created with the given components ont othe given matri...
void shz_mat4x4_init_rotation_x(shz_mat4x4_t *mat, float xAngle) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix by xAngle radians over the X-axis.
float shz_mat4x4_trace(const shz_mat4x4_t *mat) SHZ_NOEXCEPT
Returns the trace of the given 4x4 matrix.
void shz_mat4x4_apply_rotation_zxy(shz_mat4x4_t *mat, float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT
Rotates the given transform matrix about the Z axis, then the X axis, then the Y axis by the given an...
void shz_mat4x4_apply_symmetric_skew(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Multiplies and accumulates the given matrix with a symmetric skew matrix formed from the given 3D vec...
void shz_mat4x4_apply_self(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Multiplies and accumulates the given matrix onto itself.
void shz_mat4x4_init_scale(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Initializes the given matrix to a 3D scaling matrix with the given dimensions.
void shz_mat4x4_init_identity_safe(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Initializes the given matrix to the identity matrix, safely zeroing out NaN values.
void shz_mat4x4_init_ortho(shz_mat4x4_t *mat, float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Initializes the given matrix to an orthographic projection matrix.
void shz_mat4x4_apply_rotation_xyz(shz_mat4x4_t *mat, float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT
Rotates the given transform matrix about the X axis, then the Y axis, then the Z axis by the given an...
void shz_mat4x4_translate(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Multiplies and accumulates mat by a 3D translation matrix with the given components.
shz_vec4_t shz_mat4x4_col(const shz_mat4x4_t *mat, size_t col) SHZ_NOEXCEPT
Extracts the col index as a 4D column vector from the given matrix.
void shz_mat4x4_apply_permutation_wxyz(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors...
void shz_mat4x4_rotate(shz_mat4x4_t *mat, float radians, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT
Multiplies and accumulates mat by the 3D rotation matrix formed by the given axis and angle.
void shz_mat4x4_apply_rotation_yxz(shz_mat4x4_t *mat, float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT
Rotates the given transform matrix about the Y axis, then the X axis, then the Z axis by the given an...
void shz_mat4x4_set_translation(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Assigns only the 3D translation-related elements of the given matrix to the given values.
void shz_mat4x4_init_perspective(shz_mat4x4_t *mat, float fov, float aspect, float znear) SHZ_NOEXCEPT
Initializes the given matrix to a perspective projection matrix.
void shz_mat4x4_rotate_xyz(shz_mat4x4_t *mat, float xRadians, float yRadians, float zRadians) SHZ_NOEXCEPT
Multiplies and accumulates mat by 3D rotation matrices about the X then Y then Z axes.
void shz_mat4x4_apply_frustum(shz_mat4x4_t *m, float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Multiplies and accumulates the frustum matrix constructed from the given values onto the given matrix...
void shz_mat4x4_rotate_yxz(shz_mat4x4_t *mat, float yRadians, float xRadians, float zRadians) SHZ_NOEXCEPT
Multiplies and accumulates mat by 3D rotation matrices about the Y then X then Z axes.
shz_quat_t shz_mat4x4_to_quat(const shz_mat4x4_t *mat) SHZ_NOEXCEPT
Converts the given 4x4 orientation matrix into a quaternion.
void shz_mat4x4_apply(shz_mat4x4_t *dst, const shz_mat4x4_t *src) SHZ_NOEXCEPT
Multiplies and accumulates the src 4x4 matrix onto the dst 4x4 matrix.
void shz_mat4x4_rotate_zxy(shz_mat4x4_t *mat, float zRadians, float xRadians, float yRadians) SHZ_NOEXCEPT
Multiplies and accumulates mat by 3D rotation matrices about the Z then X then Y axes.
void shz_mat4x4_swap_cols(shz_mat4x4_t *mat, size_t col1, size_t col2) SHZ_NOEXCEPT
Swaps the 4D column vectors located at col1 and col2 within mat.
void shz_mat4x4_init_translation(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Initializes the given matrix to a 3D translation matrix with the given coordinates.
void shz_mat4x4_apply_rotation_zyx(shz_mat4x4_t *mat, float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT
Rotates the given transform matrix about the Z axis, then the Y axis, then the X axis by the given an...
void shz_mat4x4_copy(shz_mat4x4_t *dst, const shz_mat4x4_t *src) SHZ_NOEXCEPT
Copies the given src 4x4 matrix into the given dst 4x4 matrix.
void shz_mat4x4_rotate_z(shz_mat4x4_t *mat, float radians) SHZ_NOEXCEPT
Multiplies and accumulates mat by a 3D rotation matrix about the Z axis.
void shz_mat4x4_apply_rotation_z(shz_mat4x4_t *mat, float zAngle) SHZ_NOEXCEPT
Multiplies and accumulates a rotation matrix by zAngle radians about the Z-axis onto the given matrix...
void shz_mat4x4_set_scale(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Assigns only the 3D scale-related elements of the given matrix to the given values.
void shz_mat4x4_apply_scale(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Multiplies and accumulates the scale-related elements of the given matrix by the given 3D components.
void shz_mat4x4_set_rotation_quat(shz_mat4x4_t *m, shz_quat_t q) SHZ_NOEXCEPT
Sets just the rotational component of the matrix to the orientation given by a quaternion,...
void shz_mat4x4_apply_translation(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Adds the given 3D vector components to the translational values of the given matrix.
void shz_mat4x4_rotate_zyx(shz_mat4x4_t *mat, float zRadians, float yRadians, float xRadians) SHZ_NOEXCEPT
Multiplies and accumulates mat by 3D rotation matrices about the Z then Y then X axes.
void shz_mat4x4_mult_unaligned(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const float rhs[16]) SHZ_NOEXCEPT
Multiplies two 4x4 matrices together, with the right handed matrix being unaligned,...
void shz_mat4x4_rotate_x(shz_mat4x4_t *mat, float radians) SHZ_NOEXCEPT
Multiplies and accumulates mat by a 3D rotation matrix about the X axis.
void shz_mat4x4_init_symmetric_skew(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Initializes the given matrix to be the symmetric skew of the given 3D vector components.
void shz_mat4x4_init_rotation_yxz(shz_mat4x4_t *mat, float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
void shz_mat4x4_init_diagonal(shz_mat4x4_t *mat, float x, float y, float z, float w) SHZ_NOEXCEPT
Initializes the given matrix to a diagonal matrix with the given 4 values.
void shz_mat4x4_init_rotation_zyx(shz_mat4x4_t *mat, float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
void shz_mat4x4_init_permutation_yzwx(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Initializes the matrix to to a permutation matrix, which reorders the components of transformed vecto...
void shz_mat4x4_swap(shz_mat4x4_t *matA, shz_mat4x4_t *matB) SHZ_NOEXCEPT
Swaps the contents of the two given matrices, matA and matB.
shz_vec3_t shz_mat4x4_get_translation(const shz_mat4x4_t *mat) SHZ_NOEXCEPT
Returns the translational components from the 4th column as a 3D vector.
void shz_mat4x4_apply_rotation_x(shz_mat4x4_t *mat, float xAngle) SHZ_NOEXCEPT
Multiplies and accumulates a rotation matrix by xAngle radians about the X-axis onto the given matrix...
void shz_mat4x4_init_fill(shz_mat4x4_t *mat, float value) SHZ_NOEXCEPT
Initializes the given matrix with all elements assigned to the given value.
void shz_mat4x4_apply_unaligned(shz_mat4x4_t *dst, const float src[16]) SHZ_NOEXCEPT
Multiplies and accumulates the unaligned src 4x4 matrix onto the dst 4x4 matrix.
void shz_mat4x4_apply_ortho(shz_mat4x4_t *m, float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Multiplies and accumulates the ortho matrix constructed from the given values onto the given matrix.
shz_vec4_t shz_mat4x4_row(const shz_mat4x4_t *mat, size_t row) SHZ_NOEXCEPT
Extracts the row index as a 4D row vector from the given matrix.
bool shz_mat4x4_equal(const shz_mat4x4_t *SHZ_RESTRICT mat1, const shz_mat4x4_t *mat2) SHZ_NOEXCEPT
Returns true if the two matrices are equal, based on either absolute or relative tolerance.
void shz_mat4x4_apply_rotation(shz_mat4x4_t *mat, float angle, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT
Rotates the given transform matrix about the arbitrary axis given by a 3D direction vector and angle ...
void shz_mat4x4_inverse(const shz_mat4x4_t *SHZ_RESTRICT mtrx, shz_mat4x4_t *SHZ_RESTRICT out) SHZ_NOEXCEPT
Computes the inverse of a 4x4 matrix.
void shz_mat4x4_init_one(shz_mat4x4_t *mat) SHZ_NOEXCEPT
Initializes the given matrix with all 1s for its element values.
void shz_mat4x4_init_rotation_quat(shz_mat4x4_t *m, shz_quat_t q) SHZ_NOEXCEPT
Initializes the given matrix to a 3D rotation matrix with its orientation given by a quaternion.
void shz_mat4x4_inverse_block_triangular(const shz_mat4x4_t *mtx, shz_mat4x4_t *out) SHZ_NOEXCEPT
Computes the inverse of a 4x4 matrix in block-triangular form.
void shz_mat4x4_init_screen(shz_mat4x4_t *mat, float width, float height) SHZ_NOEXCEPT
Initializes the given matrix to the viewport matrix with the given dimenions.
vec4 row(size_t index) const noexcept
C++ wrapper for shz_mat4x4_row().
void init_rotation(float angle, float x, float y, float z) noexcept
C++ wrapper for shz_mat4x4_init_rotation().
vec4 col(size_t index) const noexcept
C++ wrapper for shz_mat4x4_col().
static constexpr size_t Rows
Number of rows.
friend bool operator==(const mat4x4 &lhs, const mat4x4 &rhs) noexcept
Overloaded equality operator, for comparing vectors.
static constexpr size_t Cols
Number of columns.
C++ structure representing a quaternion.
Definition shz_quat.hpp:38
2D Vector type
3D Vector type
4D Vector type