2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
61
62
63
64
83
84
85
88
89
90
94
95
96
97
98
99
100
101
102
103SHZ_DEPRECATED(
"Operation is always safe now. Use default version.")
107
108
109
113
114
115
119
120
121
125
126
127
131
132
133
137
138
139
143
144
145
149
150
151
155
156
157
161
162
163
167
168
169
173
174
175
179
180
181
182
183
184
185
186
190
191
192
193
194
195
196
197
201
202
203
207
208
209
213
214
215
219
220
221
225
226
227
228
229
230
231
235
236
237
241
242
243
247
248
249
253
254
255
259
260
261
265
266
267
268SHZ_INLINE
void shz_mat4x4_init_ortho(shz_mat4x4_t* mat,
float left,
float right,
float bottom,
float top,
float znear,
float zfar) SHZ_NOEXCEPT;
271
272
273
274SHZ_INLINE
void shz_mat4x4_init_frustum(shz_mat4x4_t* mat,
float left,
float right,
float bottom,
float top,
float znear,
float zfar) SHZ_NOEXCEPT;
277
278
279
286
287
288
291
292
293
294
296 shz_vec3_t* translation,
297 shz_quat_t* rotation,
298 shz_vec3_t* scale) SHZ_NOEXCEPT;
303
304
305
308SHZ_INLINE shz_vec4_t
shz_mat4x4_row(
const shz_mat4x4_t* mat, size_t row) SHZ_NOEXCEPT;
311SHZ_INLINE shz_vec4_t
shz_mat4x4_col(
const shz_mat4x4_t* mat, size_t col) SHZ_NOEXCEPT;
317
318
319
320
330SHZ_INLINE
void shz_mat4x4_3x3(
const shz_mat4x4_t* mat4, shz_mat3x3_t* mat3) SHZ_NOEXCEPT;
344
345
346
375
376
377
380
381
382
386
387
388
392
393
394
398
399
400
404
405
406
410
411
412
416
417
418
422
423
424
428
429
430
434
435
436
437
438
442
443
444
445
446
450
451
452
453
454
458
459
460
461
462
466
467
468
469
470
474
475
476
480
481
482
486
487
488
489SHZ_INLINE
void shz_mat4x4_apply_ortho(shz_mat4x4_t* m,
float left,
float right,
float bottom,
float top,
float znear,
float zfar) SHZ_NOEXCEPT;
492
493
494
495SHZ_INLINE
void shz_mat4x4_apply_frustum(shz_mat4x4_t* m,
float left,
float right,
float bottom,
float top,
float znear,
float zfar) SHZ_NOEXCEPT;
498
499
500
504
505
506
510
511
512
516
517
518
522
523
524
528
529
530
536
537
538
541
542
543
544
548
549
550
551
552SHZ_INLINE
void shz_mat4x4_scale(shz_mat4x4_t* mat,
float x,
float y,
float z) SHZ_NOEXCEPT;
555
556
557
561
562
563
567
568
569
573
574
575
576SHZ_INLINE
void shz_mat4x4_rotate_xyz(shz_mat4x4_t* mat,
float xRadians,
float yRadians,
float zRadians) SHZ_NOEXCEPT;
579
580
581
582SHZ_INLINE
void shz_mat4x4_rotate_zyx(shz_mat4x4_t* mat,
float zRadians,
float yRadians,
float xRadians) SHZ_NOEXCEPT;
585
586
587
588SHZ_INLINE
void shz_mat4x4_rotate_zxy(shz_mat4x4_t* mat,
float zRadians,
float xRadians,
float yRadians) SHZ_NOEXCEPT;
591
592
593
594SHZ_INLINE
void shz_mat4x4_rotate_yxz(shz_mat4x4_t* mat,
float yRadians,
float xRadians,
float zRadians) SHZ_NOEXCEPT;
597
598
599
600
601SHZ_INLINE
void shz_mat4x4_rotate(shz_mat4x4_t* mat,
float radians,
float xAxis,
float yAxis,
float zAxis) SHZ_NOEXCEPT;
606
607
608
611
612
613
617
618
619
625
626
627
630
631
632
633SHZ_INLINE
void shz_mat4x4_mult(shz_mat4x4_t* mat,
const shz_mat4x4_t* lhs,
const shz_mat4x4_t* rhs) SHZ_NOEXCEPT;
636
637
638
642
643
644
648
649
650
654
655
656
657
658
659
660
661
662
663
664
668
669
670
671
672
673
674
675
676
677
678
682
683
684
685
686
687
688
689
690
691
692
696
697
698
699
700
701
702
703
704
705
706
707
711
712
713
714
715
716
717
718
719
720
721
722
726
727
728
729
730
731
732
733
734
735
736
737
741
742
743
744
745
746
747
748
749
750
751
755
756
757
758
759
760
761
762
763
764
765
769
770
771
772
773
774
775
776
777
778
779
780
784
785
786
787
788
789
790
791
792
793
794
795
801
802
803
809
810
811
815
816
817
818
819
820
821
822
823
824void shz_mat4x4_inverse(
const shz_mat4x4_t* SHZ_RESTRICT mtrx, shz_mat4x4_t* SHZ_RESTRICT out) SHZ_NOEXCEPT;
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
847SHZ_INLINE
bool shz_mat4x4_equal(
const shz_mat4x4_t* SHZ_RESTRICT mat1,
const shz_mat4x4_t* mat2) SHZ_NOEXCEPT;
853SHZ_INLINE
void shz_mat4x4_copy(shz_mat4x4_t* dst,
const shz_mat4x4_t* src) SHZ_NOEXCEPT;
856
857
858
862
863
864
868
869
870
871
872
873
874
875
876
877
878
879SHZ_INLINE
void shz_mat4x4_blend(shz_mat4x4_t* dst,
const shz_mat4x4_t* joint_matrix,
float weights) SHZ_NOEXCEPT;
885typedef SHZ_ALIGNAS(8)
struct shz_mat2x2 {
893typedef struct shz_mat3x3 {
906typedef struct shz_mat3x4 {
920typedef struct shz_mat4x3 {
934
935
936
937
938
939
940
941
942SHZ_INLINE
void shz_mat3x3_transpose(
const shz_mat3x3_t* mat, shz_mat3x3_t* out) SHZ_NOEXCEPT;
945
946
947
948
949
950
951
952
953
954
955
956
957SHZ_INLINE
void shz_mat3x3_inverse_unscaled(
const shz_mat3x3_t* mtrx, shz_mat3x3_t* out) SHZ_NOEXCEPT;
960
961
962
963
964
965
966
967
968
969
970SHZ_INLINE
void shz_mat3x3_inverse(
const shz_mat3x3_t* mtrx, shz_mat3x3_t* out) SHZ_NOEXCEPT;
972SHZ_INLINE
void shz_mat3x3_scale(shz_mat3x3_t* dst,
const shz_mat3x3_t* src,
float value) SHZ_NOEXCEPT;
973SHZ_INLINE shz_vec3_t shz_mat3x3_transform_vec3(
const shz_mat3x3_t* m, shz_vec3_t v) SHZ_NOEXCEPT;
974SHZ_INLINE shz_vec3_t shz_mat3x3_transform_vec3_transpose(
const shz_mat3x3_t* m, shz_vec3_t v) SHZ_NOEXCEPT;
978#include "inline/shz_matrix.inl.h"
float shz_mat4x4_trace(const shz_mat4x4_t *mat) noexcept
Returns the trace of the given 4x4 matrix.
shz_vec2_t shz_mat4x4_transform_vec2_transpose(const shz_mat4x4_t *m, shz_vec2_t v) noexcept
Transforms a 2D vector the the transpose of a 4x4 matrix.
void shz_mat4x4_init_permutation_yzwx(shz_mat4x4_t *mat) noexcept
Initializes the matrix to to a permutation matrix, which reorders the components of transformed vecto...
void shz_mat4x4_inverse(const shz_mat4x4_t *SHZ_RESTRICT mtrx, shz_mat4x4_t *SHZ_RESTRICT out) noexcept
Computes the inverse of a 4x4 matrix.
void shz_mat4x4_scale(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Multiplies and accumulates mat by a 3D scaling matrix with the given components.
void shz_mat4x4_apply_rotation_z(shz_mat4x4_t *mat, float zAngle) noexcept
Multiplies and accumulates a rotation matrix by zAngle radians about the Z-axis onto the given matrix...
void shz_mat4x4_set_rotation_quat(shz_mat4x4_t *m, shz_quat_t q) noexcept
Sets just the rotational component of the matrix to the orientation given by a quaternion,...
void shz_mat4x4_apply_rotation_x(shz_mat4x4_t *mat, float xAngle) noexcept
Multiplies and accumulates a rotation matrix by xAngle radians about the X-axis onto the given matrix...
float shz_mat4x4_3x3_determinant(const shz_mat4x4_t *mat) noexcept
Returns the determinant of the given 4x4 matrix's internal top-level 3x3 matrix.
void shz_mat4x4_init_fill(shz_mat4x4_t *mat, float value) noexcept
Initializes the given matrix with all elements assigned to the given value.
shz_vec3_t shz_mat4x4_transform_vec3(const shz_mat4x4_t *m, shz_vec3_t v) noexcept
Transforms a 3D vector by a 4x4 matrix.
void shz_mat4x4_init_rotation_xyz(shz_mat4x4_t *mat, float xAngle, float yAngle, float zAngle) noexcept
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
shz_vec2_t shz_mat4x4_transform_point2(const shz_mat4x4_t *mat, shz_vec2_t pt) noexcept
Transforms a 2D point by a 4x4 matrix.
void shz_mat4x4_3x3_inverse(const shz_mat4x4_t *mat4, shz_mat3x3_t *invmat3) noexcept
Extracts and inverts the top-level 3x3 (which may be scaled) of the given 4x4 matrix.
void shz_mat4x4_apply_rotation_zxy(shz_mat4x4_t *mat, float zAngle, float xAngle, float yAngle) 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_transpose_unaligned(shz_mat4x4_t *dst, const float src[16]) noexcept
Multiplies and accumulates the transposed unaligned src 4x4 matrix onto the dst 4x4 matrix.
void shz_mat4x4_blend(shz_mat4x4_t *dst, const shz_mat4x4_t *joint_matrix, float weights) noexcept
Adds and accumulates a scaled 4x4 matrix into the given matrix.
void shz_mat4x4_rotate_y(shz_mat4x4_t *mat, float radians) noexcept
Multiplies and accumulates mat by a 3D rotation matrix about the Y axis.
void shz_mat4x4_translate(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Multiplies and accumulates mat by a 3D translation matrix with the given components.
void shz_mat4x4_set_scale(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Assigns only the 3D scale-related elements of the given matrix to the given values.
void shz_mat4x4_copy(shz_mat4x4_t *dst, const shz_mat4x4_t *src) noexcept
Copies the given src 4x4 matrix into the given dst 4x4 matrix.
void shz_mat4x4_apply_self(shz_mat4x4_t *mat) noexcept
Multiplies and accumulates the given matrix onto itself.
void shz_mat4x4_scale_reverse(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Pre-multiplies and accumulates the given matrix onto the 3D scaling matrix with the given components.
void shz_mat4x4_apply_permutation_wxyz(shz_mat4x4_t *mat) noexcept
Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors...
void shz_mat4x4_swap(shz_mat4x4_t *matA, shz_mat4x4_t *matB) noexcept
Swaps the contents of the two given matrices, matA and matB.
void shz_mat4x4_apply_screen(shz_mat4x4_t *m, float width, float height) noexcept
Multiplies and accumulates the viewport matrix created with the given components ont othe given matri...
void shz_mat4x4_set_diagonal(shz_mat4x4_t *mat, float x, float y, float z, float w) noexcept
Assigns only the 4 elements along the diagonal of the given matrix to the given values.
void shz_mat4x4_apply_rotation(shz_mat4x4_t *mat, float angle, float xAxis, float yAxis, float zAxis) noexcept
Rotates the given transform matrix about the arbitrary axis given by a 3D direction vector and angle ...
void shz_mat4x4_apply_rotation_y(shz_mat4x4_t *mat, float yAngle) noexcept
Multiplies and accumulates a rotation matrix by yAngle radians about the Y-axis onto the given matrix...
void shz_mat4x4_init_rotation_x(shz_mat4x4_t *mat, float xAngle) noexcept
Initializes the given matrix to a 3D rotation matrix by xAngle radians over the X-axis.
void shz_mat4x4_init_lookat(shz_mat4x4_t *mat, shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) noexcept
Initializes the given matrix to a "lookAt" view matrix.
void shz_mat4x4_transpose(const shz_mat4x4_t *mat, shz_mat4x4_t *out) noexcept
Stores the transpose of mat within out.
void shz_mat4x4_apply_rotation_xyz(shz_mat4x4_t *mat, float xAngle, float yAngle, float zAngle) 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_init_zero(shz_mat4x4_t *mat) noexcept
Initializes the given matrix with all 0s for its element values.
void shz_mat4x4_init_outer_product(shz_mat4x4_t *mat, shz_vec4_t v1, shz_vec4_t v2) noexcept
Initializes the given matrix to be the result from taking the outer product of the two given 4D vecto...
void shz_mat4x4_init_scale(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Initializes the given matrix to a 3D scaling matrix with the given dimensions.
void shz_mat4x4_init_rotation_zyx(shz_mat4x4_t *mat, float zAngle, float yAngle, float xAngle) noexcept
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
void shz_mat4x4_mult_unaligned(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const float rhs[16]) noexcept
Multiplies two 4x4 matrices together, with the right handed matrix being unaligned,...
void shz_mat4x4_decompose(const shz_mat4x4_t *mat, shz_vec3_t *translation, shz_quat_t *rotation, shz_vec3_t *scale) noexcept
Decomposes a 4x4 transform matrix into translation, rotation, and scale.
void shz_mat4x4_apply_permutation_yzwx(shz_mat4x4_t *mat) noexcept
Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors...
void shz_mat4x4_init_one(shz_mat4x4_t *mat) noexcept
Initializes the given matrix with all 1s for its element values.
void shz_mat4x4_init_rotation_z(shz_mat4x4_t *mat, float zAngle) noexcept
Initializes the given matrix to a 3D rotation matrix by zAngle radians over the Z-axis.
void shz_mat4x4_set_row(shz_mat4x4_t *mat, size_t row, shz_vec4_t vec) noexcept
Sets the values of mat at the given row to those of the 4D vector, vec.
void shz_mat4x4_rotate_xyz(shz_mat4x4_t *mat, float xRadians, float yRadians, float zRadians) noexcept
Multiplies and accumulates mat by 3D rotation matrices about the X then Y then Z axes.
void shz_mat4x4_init_frustum(shz_mat4x4_t *mat, float left, float right, float bottom, float top, float znear, float zfar) noexcept
Initializes the given matrix to a frustum projection matrix.
void shz_mat4x4_apply_rotation_zyx(shz_mat4x4_t *mat, float zAngle, float yAngle, float xAngle) 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_init_translation(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Initializes the given matrix to a 3D translation matrix with the given coordinates.
shz_quat_t shz_mat4x4_to_quat(const shz_mat4x4_t *mat) noexcept
Converts the given 4x4 orientation matrix into a quaternion.
void shz_mat4x4_init_permutation_wxyz(shz_mat4x4_t *mat) noexcept
Initializes the matrix to to a permutation matrix, which reorders the components of transformed vecto...
void shz_mat4x4_init_diagonal(shz_mat4x4_t *mat, float x, float y, float z, float w) noexcept
Initializes the given matrix to a diagonal matrix with the given 4 values.
void shz_mat4x4_mult(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const shz_mat4x4_t *rhs) noexcept
Multiplies two 4x4 matrices together, storing the result into a third.
void shz_mat4x4_apply_symmetric_skew(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Multiplies and accumulates the given matrix with a symmetric skew matrix formed from the given 3D vec...
void shz_mat4x4_init_screen(shz_mat4x4_t *mat, float width, float height) noexcept
Initializes the given matrix to the viewport matrix with the given dimenions.
void shz_mat4x4_copy_unaligned(shz_mat4x4_t *dst, const float src[16]) noexcept
Copies the given unaligned src 4x4 matrix into the given dst 4x4 matrix.
void shz_mat4x4_3x3(const shz_mat4x4_t *mat4, shz_mat3x3_t *mat3) noexcept
Extracts the top-left 3x3 of the given 4D matrix.
void shz_mat4x4_apply_lookat(shz_mat4x4_t *m, shz_vec3_t pos, shz_vec3_t target, shz_vec3_t up) noexcept
Applies the 3D "lookAt" matrix constructed with the given vector components onto the given matrix.
shz_vec4_t shz_mat4x4_row(const shz_mat4x4_t *mat, size_t row) noexcept
Extracts the row index as a 4D row vector from the given matrix.
void shz_mat4x4_init_rotation_y(shz_mat4x4_t *mat, float yAngle) noexcept
Initializes the given matrix to a 3D rotation matrix by yAngle radians over the Y-axis.
void shz_mat4x4_apply_unaligned(shz_mat4x4_t *dst, const float src[16]) noexcept
Multiplies and accumulates the unaligned src 4x4 matrix onto the dst 4x4 matrix.
void shz_mat4x4_apply(shz_mat4x4_t *dst, const shz_mat4x4_t *src) noexcept
Multiplies and accumulates the src 4x4 matrix onto the dst 4x4 matrix.
shz_vec3_t shz_mat4x4_get_translation(const shz_mat4x4_t *mat) noexcept
Returns the translational components from the 4th column as a 3D vector.
void shz_mat4x4_apply_transpose(shz_mat4x4_t *dst, const shz_mat4x4_t *src) noexcept
Multiplies and accumulates the transposed src 4x4 matrix onto the dst 4x4 matrix.
void shz_mat4x4_inverse_block_triangular(const shz_mat4x4_t *mtx, shz_mat4x4_t *out) noexcept
Computes the inverse of a 4x4 matrix in block-triangular form.
shz_vec3_t shz_mat4x4_transform_vec3_transpose(const shz_mat4x4_t *m, shz_vec3_t v) noexcept
Transforms a 3D vector the the transpose of a 4x4 matrix.
shz_vec4_t shz_mat4x4_transform_vec4(const shz_mat4x4_t *mat, shz_vec4_t in) noexcept
Transforms a 4D vector by a 4x4 matrix.
void shz_mat4x4_apply_scale(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Multiplies and accumulates the scale-related elements of the given matrix by the given 3D components.
void shz_mat4x4_apply_ortho(shz_mat4x4_t *m, float left, float right, float bottom, float top, float znear, float zfar) noexcept
Multiplies and accumulates the ortho matrix constructed from the given values onto the given matrix.
void shz_mat4x4_translate_reverse(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Pre-multiplies and accumulates the given matrix onto the 3D translation matrix with the given compone...
void shz_mat4x4_rotate(shz_mat4x4_t *mat, float radians, float xAxis, float yAxis, float zAxis) noexcept
Multiplies and accumulates mat by the 3D rotation matrix formed by the given axis and angle.
void shz_mat4x4_mult_transpose_unaligned(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const float rhs[16]) noexcept
Multiplies the regular matrix, lhs, by the transpose of the unaligned matrix, rhs,...
void shz_mat4x4_init_rotation_dir(shz_mat4x4_t *mat, float angle, float x, float y, float z) noexcept
Initializes the given 4x4 matrix to contain a 3D rotation matrix of angle radians about the given dir...
void shz_mat4x4_apply_frustum(shz_mat4x4_t *m, float left, float right, float bottom, float top, float znear, float zfar) noexcept
Multiplies and accumulates the frustum matrix constructed from the given values onto the given matrix...
float shz_mat4x4_determinant(const shz_mat4x4_t *mat) noexcept
Returns the determinant of the given 4x4 matrix.
bool shz_mat4x4_is_block_triangular(const shz_mat4x4_t *mat) noexcept
Returns true if the given matrix is in block-triangular form: having a bottom row in the form of <0....
shz_vec3_t shz_mat4x4_transform_point3_transpose(const shz_mat4x4_t *mat, shz_vec3_t pt) noexcept
Transforms a 3D point by the transpose of a 4x4 matrix.
void shz_mat4x4_3x3_inverse_unscaled(const shz_mat4x4_t *mat4, shz_mat3x3_t *invmat3) noexcept
Extracts and inverts the top-level, unscaled 3x3 of the given 4x4 matrix.
void shz_mat4x4_init_identity(shz_mat4x4_t *mat) noexcept
Initializes the given matrix to the 4x4 identity matrix.
void shz_mat4x4_swap_rows(shz_mat4x4_t *mat, size_t row1, size_t row2) noexcept
Swaps the 4D row vectors located at row1 and row2 within mat.
void shz_mat4x4_swap_cols(shz_mat4x4_t *mat, size_t col1, size_t col2) noexcept
Swaps the 4D column vectors located at col1 and col2 within mat.
shz_mat4x4_t shz_mat4x4
Alternate shz_mat4x4_t C typedef for those who hate POSIX style.
shz_vec3_t shz_mat4x4_transform_point3(const shz_mat4x4_t *mat, shz_vec3_t pt) noexcept
Transforms a 3D point by a 4x4 matrix.
void shz_mat4x4_init_ortho(shz_mat4x4_t *mat, float left, float right, float bottom, float top, float znear, float zfar) noexcept
Initializes the given matrix to an orthographic projection matrix.
void shz_mat4x4_init_upper_triangular(shz_mat4x4_t *mat, float col1, shz_vec2_t col2, shz_vec3_t col3, shz_vec4_t col4) noexcept
Initializes the given matrix to an upper triangular matrix whose nonzero entries have the given value...
void shz_mat4x4_init_perspective(shz_mat4x4_t *mat, float fov, float aspect, float znear) noexcept
Initializes the given matrix to a perspective projection matrix.
void shz_mat4x4_rotate_zxy(shz_mat4x4_t *mat, float zRadians, float xRadians, float yRadians) noexcept
Multiplies and accumulates mat by 3D rotation matrices about the Z then X then Y axes.
void shz_mat4x4_apply_translation(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Adds the given 3D vector components to the translational values of the given matrix.
void shz_mat4x4_set_col(shz_mat4x4_t *mat, size_t col, shz_vec4_t vec) noexcept
Sets the values of mat at the given col to those of the 4D vector, vec.
shz_vec4_t shz_mat4x4_transform_vec4_transpose(const shz_mat4x4_t *m, shz_vec4_t v) noexcept
Transforms a 4D vector the the transpose of a 4x4 matrix.
void shz_mat4x4_init_rotation_quat(shz_mat4x4_t *m, shz_quat_t q) noexcept
Initializes the given matrix to a 3D rotation matrix with its orientation given by a quaternion.
void shz_mat4x4_init_rotation_zxy(shz_mat4x4_t *mat, float zAngle, float xAngle, float yAngle) noexcept
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
void shz_mat4x4_init_lower_triangular(shz_mat4x4_t *mat, shz_vec4_t col1, shz_vec3_t col2, shz_vec2_t col3, float col4) noexcept
Initializes the given matrix to a lower triangular matrix whose nonzero entries have the given value.
void shz_mat4x4_init_rotation(shz_mat4x4_t *mat, float radians, float xAxis, float yAxis, float zAxis) noexcept
Initializes the given 4x4 matrix to a 3D rotation matrix of angle radians about the vector with the g...
void shz_mat4x4_apply_rotation_quat(shz_mat4x4_t *m, shz_quat_t q) noexcept
Multiplies and accumulates the given matrix with a rotation matrix whose orientation is given by a qu...
void shz_mat4x4_init_rotation_yxz(shz_mat4x4_t *mat, float yAngle, float xAngle, float zAngle) noexcept
Initializes the given matrix to a 3D rotation matrix from the intrinsic rotation created by the given...
void shz_mat4x4_rotate_zyx(shz_mat4x4_t *mat, float zRadians, float yRadians, float xRadians) noexcept
Multiplies and accumulates mat by 3D rotation matrices about the Z then Y then X axes.
void shz_mat4x4_rotate_yxz(shz_mat4x4_t *mat, float yRadians, float xRadians, float zRadians) noexcept
Multiplies and accumulates mat by 3D rotation matrices about the Y then X then Z axes.
void shz_mat4x4_rotate_x(shz_mat4x4_t *mat, float radians) noexcept
Multiplies and accumulates mat by a 3D rotation matrix about the X axis.
shz_vec3_t shz_mat4x4_get_scale(const shz_mat4x4_t *mat) noexcept
Exracts the 3D scale factors from the given 4x4 matrix.
shz_vec2_t shz_mat4x4_transform_point2_transpose(const shz_mat4x4_t *mat, shz_vec2_t pt) noexcept
Transforms a 2D point by the transpose of a 4x4 matrix.
bool shz_mat4x4_equal(const shz_mat4x4_t *SHZ_RESTRICT mat1, const shz_mat4x4_t *mat2) noexcept
Returns true if the two matrices are equal, based on either absolute or relative tolerance.
void shz_mat4x4_init_symmetric_skew(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Initializes the given matrix to be the symmetric skew of the given 3D vector components.
void shz_mat4x4_set_translation(shz_mat4x4_t *mat, float x, float y, float z) noexcept
Assigns only the 3D translation-related elements of the given matrix to the given values.
shz_vec2_t shz_mat4x4_transform_vec2(const shz_mat4x4_t *m, shz_vec2_t v) noexcept
Transforms a 2D vector by a 4x4 matrix.
void shz_mat4x4_apply_rotation_yxz(shz_mat4x4_t *mat, float yAngle, float xAngle, float zAngle) 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_apply_perspective(shz_mat4x4_t *m, float fov, float aspect, float znear) noexcept
Multiplies and accumulates the perspective matrix constructed from the given values onto the given ma...
shz_vec4_t shz_mat4x4_col(const shz_mat4x4_t *mat, size_t col) noexcept
Extracts the col index as a 4D column vector from the given matrix.
void shz_mat4x4_init_identity_safe(shz_mat4x4_t *mat) noexcept
Safely initializes the given matrix to the 4x4 identity matrix.
void shz_mat4x4_mult_transpose(shz_mat4x4_t *mat, const shz_mat4x4_t *lhs, const shz_mat4x4_t *rhs) noexcept
Multiplies the regular matrix, lhs, by the transpose of the matrix, rhs, storing the result into mat.
void shz_mat4x4_rotate_z(shz_mat4x4_t *mat, float radians) noexcept
Multiplies and accumulates mat by a 3D rotation matrix about the Z axis.
Structure representing a 4x4 column-major matrix.
float elem[16]
< Inner convenience union.
shz_vec4_t pos
Access the last column of the matrix as a 1x4 vector.
shz_vec4_t col[4]
Access the matrix as an array of 4 1x4 column vectors.
shz_vec4_t forward
Access the third column of the matrix as a 1x4 vector.
shz_vec4_t left
< Named column vectors.
shz_vec4_t up
Access the second column of the matrix as a 1x4 vector.
float elem2D[4][4]
Access the matrix as a 2D array of 4x4 single-precision floats.