SH4ZAM! 0.7.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_translation(const vec3& v) noexcept {
114 init_translation(v.x, v.y, v.z);
115 }
116
117 SHZ_FORCE_INLINE void init_scale(float x, float y, float z) noexcept {
119 }
120
121 SHZ_FORCE_INLINE void init_scale(const vec3& v) noexcept {
122 init_scale(v.x, v.y, v.z);
123 }
124
125 SHZ_FORCE_INLINE void init_rotation_x(float angle) noexcept {
127 }
128
129 SHZ_FORCE_INLINE void init_rotation_y(float angle) noexcept {
131 }
132
133 SHZ_FORCE_INLINE void init_rotation_z(float angle) noexcept {
135 }
136
137 SHZ_FORCE_INLINE void init_rotation_xyz(float xAngle, float yAngle, float zAngle) noexcept {
138 shz_mat4x4_init_rotation_xyz(this, xAngle, yAngle, zAngle);
139 }
140
141 SHZ_FORCE_INLINE void init_rotation_zyx(float zAngle, float yAngle, float xAngle) noexcept {
142 shz_mat4x4_init_rotation_zyx(this, zAngle, yAngle, xAngle);
143 }
144
145 SHZ_FORCE_INLINE void init_rotation_zxy(float zAngle, float xAngle, float yAngle) noexcept {
146 shz_mat4x4_init_rotation_zxy(this, zAngle, xAngle, yAngle);
147 }
148
149 SHZ_FORCE_INLINE void init_rotation_yxz(float yAngle, float xAngle, float zAngle) noexcept {
150 shz_mat4x4_init_rotation_yxz(this, yAngle, xAngle, zAngle);
151 }
152
153 SHZ_FORCE_INLINE void init_rotation(float angle, float x, float y, float z) noexcept {
154 shz_mat4x4_init_rotation(this, angle, x, y, z);
155 }
156
157 SHZ_FORCE_INLINE void init_rotation(float angle, const vec3& axis) noexcept {
158 init_rotation(angle, axis.x, axis.y, axis.z);
159 }
160
161 SHZ_FORCE_INLINE void init_rotation(const quat& q) noexcept {
163 }
164
165 SHZ_FORCE_INLINE void init_diagonal(float x, float y, float z, float w) noexcept {
167 }
168
169 SHZ_FORCE_INLINE void init_diagonal(const vec4& v) noexcept {
170 init_diagonal(v.x, v.y, v.z, v.w);
171 }
172
173 SHZ_FORCE_INLINE void init_upper_triangular(float col1, const vec2& col2, const vec3& col3, const vec4& col4) noexcept{
174 shz_mat4x4_init_upper_triangular(this, col1, col2, col3, col4);
175 }
176
177 SHZ_FORCE_INLINE void init_lower_triangular(const vec4& col1, const vec3& col2, const vec2& col3, float col4) noexcept {
178 shz_mat4x4_init_lower_triangular(this, col1, col2, col3, col4);
179 }
180
181 SHZ_FORCE_INLINE void init_symmetric_skew(float x, float y, float z) noexcept {
183 }
184
185 SHZ_FORCE_INLINE void init_symmetric_skew(const vec3& v) noexcept {
186 init_symmetric_skew(v.x, v.y, v.z);
187 }
188
189 SHZ_FORCE_INLINE void init_outer_product(const vec4& v1, const vec4& v2) noexcept {
190 shz_mat4x4_init_outer_product(this, v1, v2);
191 }
192
193 SHZ_FORCE_INLINE void init_permutation_wxyz() noexcept {
195 }
196
197 SHZ_FORCE_INLINE void init_permutation_yzwx() noexcept {
199 }
200
201 SHZ_FORCE_INLINE void init_screen(float width, float height) noexcept {
202 shz_mat4x4_init_screen(this, width, height);
203 }
204
205 SHZ_FORCE_INLINE void init_lookat(const vec3& eye, const vec3& center, const vec3& up) noexcept {
206 shz_mat4x4_init_lookat(this, eye, center, up);
207 }
208
209 SHZ_FORCE_INLINE void init_ortho(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
210 shz_mat4x4_init_ortho(this, left, right, bottom, top, znear, zfar);
211 }
212
213 SHZ_FORCE_INLINE void init_frustum(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
214 shz_mat4x4_init_frustum(this, left, right, bottom, top, znear, zfar);
215 }
216
217 SHZ_FORCE_INLINE void init_perspective(float fov, float aspect, float znear) noexcept {
218 shz_mat4x4_init_perspective(this, fov, aspect, znear);
219 }
220
221 //! @}
222
223 /*! \name Getting
224 \brief Routines for getting specific values within a matrix
225 @{
226 */
227
228 //! C++ wrapper for shz_mat4x4_row().
229 SHZ_FORCE_INLINE vec4 row(size_t index) const noexcept {
230 return shz_mat4x4_row(this, index);
231 }
232
233 //! C++ wrapper for shz_mat4x4_col().
234 SHZ_FORCE_INLINE vec4 col(size_t index) const noexcept {
235 return shz_mat4x4_col(this, index);
236 }
237
238 SHZ_FORCE_INLINE vec3 get_translation() const noexcept {
240 }
241
242 //! @}
243
244 /*! \name Setting
245 \brief Routines for setting specific values within a matrix
246 @{
247 */
248
249 SHZ_FORCE_INLINE void set_row(size_t index, vec4 values) noexcept {
250 shz_mat4x4_set_row(this, index, values);
251 }
252
253 SHZ_FORCE_INLINE void set_col(size_t index, vec4 values) noexcept {
254 shz_mat4x4_set_col(this, index, values);
255 }
256
257 SHZ_FORCE_INLINE void swap_rows(size_t row1, size_t row2) noexcept {
258 shz_mat4x4_swap_rows(this, row1, row2);
259 }
260
261 SHZ_FORCE_INLINE void swap_cols(size_t col1, size_t col2) noexcept {
262 shz_mat4x4_swap_cols(this, col1, col2);
263 }
264
265 SHZ_FORCE_INLINE void set_translation(float x, float y, float z) noexcept {
267 }
268
269 SHZ_FORCE_INLINE void set_translation(const vec3& v) noexcept {
270 set_translation(v.x, v.y, v.z);
271 }
272
273 SHZ_FORCE_INLINE void set_scale(float x, float y, float z) noexcept {
275 }
276
277 SHZ_FORCE_INLINE void set_scale(const vec3& v) noexcept {
278 set_scale(v.x, v.y, v.z);
279 }
280
281 SHZ_FORCE_INLINE void set_rotation(const quat& rot) noexcept {
283 }
284
285 SHZ_FORCE_INLINE void set_diagonal(float x, float y, float z, float w) noexcept {
287 }
288
289 SHZ_FORCE_INLINE void set_diagonal(const vec4& v) noexcept {
290 set_diagonal(v.x, v.y, v.z, v.w);
291 }
292
293 //! @}
294
295 /*! \name Applying
296 \brief Routines for multiplying and accumulating onto the given matrix.
297 @{
298 */
299
300 SHZ_FORCE_INLINE void apply(const shz_mat4x4_t& mat) noexcept {
301 shz_mat4x4_apply(this, &mat);
302 }
303
304 SHZ_FORCE_INLINE void apply(const float mat[16]) noexcept {
306 }
307
308 SHZ_FORCE_INLINE void apply_transpose(const shz_mat4x4_t& mat) noexcept {
310 }
311
312 SHZ_FORCE_INLINE void apply_transpose(const float mat[16]) noexcept {
314 }
315
316 SHZ_FORCE_INLINE void apply_scale(float x, float y, float z) noexcept {
318 }
319
320 SHZ_FORCE_INLINE void apply_scale(const vec3& v) noexcept {
321 apply_scale(v.x, v.y, v.z);
322 }
323
324 SHZ_FORCE_INLINE void apply_translation(float x, float y, float z) noexcept {
326 }
327
328 SHZ_FORCE_INLINE void apply_translation(const vec3& v) noexcept {
329 apply_translation(v.x, v.y, v.z);
330 }
331
332 SHZ_FORCE_INLINE void apply_rotation_x(float angle) noexcept {
334 }
335
336 SHZ_FORCE_INLINE void apply_rotation_y(float angle) noexcept {
338 }
339
340 SHZ_FORCE_INLINE void apply_rotation_z(float angle) noexcept {
342 }
343
344 SHZ_FORCE_INLINE void apply_rotation_xyz(float xAngle, float yAngle, float zAngle) noexcept {
345 shz_mat4x4_apply_rotation_xyz(this, xAngle, yAngle, zAngle);
346 }
347
348 SHZ_FORCE_INLINE void apply_rotation_zyx(float zAngle, float yAngle, float xAngle) noexcept {
349 shz_mat4x4_apply_rotation_zyx(this, zAngle, yAngle, xAngle);
350 }
351
352 SHZ_FORCE_INLINE void apply_rotation_zxy(float zAngle, float xAngle, float yAngle) noexcept {
353 shz_mat4x4_apply_rotation_zxy(this, zAngle, xAngle, yAngle);
354 }
355
356 SHZ_FORCE_INLINE void apply_rotation_yxz(float yAngle, float xAngle, float zAngle) noexcept {
357 shz_mat4x4_apply_rotation_yxz(this, yAngle, xAngle, zAngle);
358 }
359
360 SHZ_FORCE_INLINE void apply_rotation(float angle, float x, float y, float z) noexcept {
361 shz_mat4x4_apply_rotation(this, angle, x, y, z);
362 }
363
364 SHZ_FORCE_INLINE void apply_rotation(float angle, vec3 axis) noexcept {
365 apply_rotation(angle, axis.x, axis.y, axis.z);
366 }
367
368 SHZ_FORCE_INLINE void apply_rotation(const quat& q) noexcept {
370 }
371
372 SHZ_FORCE_INLINE void apply_lookat(vec3 pos, vec3 target, vec3 up) noexcept {
373 shz_mat4x4_apply_lookat(this, pos, target, up);
374 }
375
376 SHZ_FORCE_INLINE void apply_ortho(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
377 shz_mat4x4_apply_ortho(this, left, right, bottom, top, znear, zfar);
378 }
379
380 SHZ_FORCE_INLINE void apply_frustum(float left, float right, float bottom, float top, float znear, float zfar) noexcept {
381 shz_mat4x4_apply_frustum(this, left, right, bottom, top, znear, zfar);
382 }
383
384 SHZ_FORCE_INLINE void apply_perspective(float fov, float aspect, float znear) noexcept {
385 shz_mat4x4_apply_perspective(this, fov, aspect, znear);
386 }
387
388 SHZ_FORCE_INLINE void apply_screen(float width, float height) noexcept {
389 shz_mat4x4_apply_screen(this, width, height);
390 }
391
392 SHZ_FORCE_INLINE void apply_symmetric_skew(float x, float y, float z) noexcept {
394 }
395
396 SHZ_FORCE_INLINE void apply_permutation_wxyz() noexcept {
398 }
399
400 SHZ_FORCE_INLINE void apply_permutation_yzwx() noexcept {
402 }
403
404 SHZ_FORCE_INLINE void apply_self() noexcept {
406 }
407
408 //! @}
409
410 /*! \name GL Transformations
411 \brief OpenGL-style 4x4 matrix transforms.
412 @{
413 */
414
415 SHZ_FORCE_INLINE void translate(float x, float y, float z) noexcept {
417 }
418
419 SHZ_FORCE_INLINE void translate(vec3 v) noexcept {
420 translate(v.x, v.y, v.z);
421 }
422
423 SHZ_FORCE_INLINE void scale(float x, float y, float z) noexcept {
424 shz_mat4x4_scale(this, x, y, z);
425 }
426
427 SHZ_FORCE_INLINE void scale(vec3 v) noexcept {
428 scale(v.x, v.y, v.z);
429 }
430
431 SHZ_FORCE_INLINE void rotate_x(float radians) noexcept {
432 shz_mat4x4_rotate_x(this, radians);
433 }
434
435 SHZ_FORCE_INLINE void rotate_y(float radians) noexcept {
436 shz_mat4x4_rotate_y(this, radians);
437 }
438
439 SHZ_FORCE_INLINE void rotate_z(float radians) noexcept {
440 shz_mat4x4_rotate_z(this, radians);
441 }
442
443 SHZ_FORCE_INLINE void rotate_xyz(float xRadians, float yRadians, float zRadians) noexcept {
444 shz_mat4x4_rotate_xyz(this, xRadians, yRadians, zRadians);
445 }
446
447 SHZ_FORCE_INLINE void rotate_zyx(float zRadians, float yRadians, float xRadians) noexcept {
448 shz_mat4x4_rotate_zyx(this, zRadians, yRadians, xRadians);
449 }
450
451 SHZ_FORCE_INLINE void rotate_zxy(float zRadians, float xRadians, float yRadians) noexcept {
452 shz_mat4x4_rotate_zxy(this, zRadians, xRadians, yRadians);
453 }
454
455 SHZ_FORCE_INLINE void rotate_yxz(float yRadians, float xRadians, float zRadians) noexcept {
456 shz_mat4x4_rotate_yxz(this, yRadians, xRadians, zRadians);
457 }
458
459 SHZ_FORCE_INLINE void rotate(float radians, float xAxis, float yAxis, float zAxis) noexcept {
460 shz_mat4x4_rotate(this, radians, xAxis, yAxis, zAxis);
461 }
462
463 SHZ_FORCE_INLINE void rotate(float radians, vec3 axis) noexcept {
464 rotate(radians, axis.x, axis.y, axis.z);
465 }
466
467 //! @}
468
469 /*! \name Multiplication
470 \brief Routines for multiplying two matrices and storing the result in a third.
471 @{
472 */
473
474 SHZ_FORCE_INLINE static void mult(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const shz_mat4x4_t& rhs) noexcept {
475 shz_mat4x4_mult(dst, &lhs, &rhs);
476 }
477
478 SHZ_FORCE_INLINE static void mult(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const float rhs[16]) noexcept {
480 }
481
482 SHZ_FORCE_INLINE static void mult_transpose(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const shz_mat4x4_t& rhs) noexcept {
484 }
485
486 SHZ_FORCE_INLINE static void mult_transpose(shz_mat4x4_t* dst, const shz_mat4x4_t& lhs, const float rhs[16]) noexcept {
488 }
489
490 //! @}
491
492 /*! \name Transforming
493 \brief Routines for transforming vectors and points by a matrix.
494 @{
495 */
496
497 SHZ_FORCE_INLINE vec2 transform(const vec2& in) const noexcept {
498 return shz_mat4x4_transform_vec2(this, in);
499 }
500
501 SHZ_FORCE_INLINE vec3 transform(const vec3& in) const noexcept {
502 return shz_mat4x4_transform_vec3(this, in);
503 }
504
505 SHZ_FORCE_INLINE vec4 transform(const vec4& in) const noexcept {
506 return shz_mat4x4_transform_vec4(this, in);
507 }
508
509 SHZ_FORCE_INLINE vec2 transform_point(const vec2& pt) const noexcept {
510 return shz_mat4x4_transform_point2(this, pt);
511 }
512
513 SHZ_FORCE_INLINE vec3 transform_point(const vec3& pt) const noexcept {
514 return shz_mat4x4_transform_point3(this, pt);
515 }
516
517 SHZ_FORCE_INLINE vec2 transform_transpose(const vec2& in) const noexcept {
518 return shz_mat4x4_transform_vec2_transpose(this, in);
519 }
520
521 SHZ_FORCE_INLINE vec3 transform_transpose(const vec3& in) const noexcept {
522 return shz_mat4x4_transform_vec3_transpose(this, in);
523 }
524
525 SHZ_FORCE_INLINE vec4 transform_transpose(const vec4& in) const noexcept {
526 return shz_mat4x4_transform_vec4_transpose(this, in);
527 }
528
529 SHZ_FORCE_INLINE vec2 transform_point_transpose(const vec2& pt) const noexcept {
530 return shz_mat4x4_transform_point2_transpose(this, pt);
531 }
532
533 SHZ_FORCE_INLINE vec3 transform_point_transpose(const vec3& pt) const noexcept {
534 return shz_mat4x4_transform_point3_transpose(this, pt);
535 }
536
537 //! @}
538
539 /*! \name Miscellaneous
540 \brief Other matrix-related operations and routines
541 @{
542 */
543
544 SHZ_FORCE_INLINE static void copy(shz_mat4x4_t* lhs, const shz_mat4x4_t& rhs) noexcept {
545 shz_mat4x4_copy(lhs, &rhs);
546 }
547
548 SHZ_FORCE_INLINE static void copy(shz_mat4x4_t* lhs, const float rhs[16]) noexcept {
550 }
551
552 friend SHZ_FORCE_INLINE void swap(shz_mat4x4_t& matA, shz_mat4x4_t& matB) noexcept {
553 shz_mat4x4_swap(&matA, &matB);
554 }
555
556 SHZ_FORCE_INLINE quat to_quat() const noexcept {
557 return shz_mat4x4_to_quat(this);
558 }
559
560 SHZ_FORCE_INLINE float determinant() const noexcept {
561 return shz_mat4x4_determinant(this);
562 }
563
564 SHZ_FORCE_INLINE float trace() const noexcept {
565 return shz_mat4x4_trace(this);
566 }
567
568 SHZ_FORCE_INLINE void inverse(mat4x4* out) const noexcept {
569 shz_mat4x4_inverse(this, out);
570 }
571
572 SHZ_FORCE_INLINE void inverse_block_triangular(mat4x4* out) const noexcept {
574 }
575
576 SHZ_FORCE_INLINE void decompose(vec3* translation, quat* rotation, vec3* scale) const noexcept {
577 shz_mat4x4_decompose(this, translation, rotation, scale);
578 }
579
580 //! @}
581 };
582
583 //! Alternate mat4x4 C++ alias for those who like POSIX style.
584 using mat4x4_t = mat4x4;
585}
586
587#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().
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