2
3
4
5
6
7
8
9
10
11
12
13
14
15
28 static constexpr size_t
Rows = 4;
29 static constexpr size_t
Cols = 4;
31 mat4x4()
noexcept =
default;
33 SHZ_FORCE_INLINE mat4x4(
const mat4x4& other)
noexcept {
37 SHZ_FORCE_INLINE mat4x4(
const shz_mat4x4_t& other)
noexcept {
79 mat4x4& operator=(
const shz_mat4x4_t& other)
noexcept {
85
86
87
89 SHZ_FORCE_INLINE
void init_identity()
noexcept {
93 SHZ_DEPRECATED(
"Operation is always safe now. Use default version.")
94 SHZ_FORCE_INLINE
void init_identity_safe()
noexcept {
98 SHZ_FORCE_INLINE
void init_zero()
noexcept {
102 SHZ_FORCE_INLINE
void init_one()
noexcept {
106 SHZ_FORCE_INLINE
void init_fill(
float value)
noexcept {
110 SHZ_FORCE_INLINE
void init_translation(
float x,
float y,
float z)
noexcept {
114 SHZ_FORCE_INLINE
void init_translation(
const vec3& v)
noexcept {
115 init_translation(v.x, v.y, v.z);
118 SHZ_FORCE_INLINE
void init_scale(
float x,
float y,
float z)
noexcept {
122 SHZ_FORCE_INLINE
void init_scale(
const vec3& v)
noexcept {
123 init_scale(v.x, v.y, v.z);
126 SHZ_FORCE_INLINE
void init_rotation_x(
float angle)
noexcept {
130 SHZ_FORCE_INLINE
void init_rotation_y(
float angle)
noexcept {
134 SHZ_FORCE_INLINE
void init_rotation_z(
float angle)
noexcept {
138 SHZ_FORCE_INLINE
void init_rotation_xyz(
float xAngle,
float yAngle,
float zAngle)
noexcept {
142 SHZ_FORCE_INLINE
void init_rotation_zyx(
float zAngle,
float yAngle,
float xAngle)
noexcept {
146 SHZ_FORCE_INLINE
void init_rotation_zxy(
float zAngle,
float xAngle,
float yAngle)
noexcept {
150 SHZ_FORCE_INLINE
void init_rotation_yxz(
float yAngle,
float xAngle,
float zAngle)
noexcept {
154 SHZ_FORCE_INLINE
void init_rotation(
float angle,
float x,
float y,
float z)
noexcept {
158 SHZ_FORCE_INLINE
void init_rotation(
float angle,
const vec3& axis)
noexcept {
159 init_rotation(angle, axis.x, axis.y, axis.z);
162 SHZ_FORCE_INLINE
void init_rotation_dir(
float angle,
float x,
float y,
float z)
noexcept {
166 SHZ_FORCE_INLINE
void init_rotation_dir(
float angle,
const vec3& dir)
noexcept {
167 init_rotation_dir(angle, dir.x, dir.y, dir.z);
170 SHZ_FORCE_INLINE
void init_rotation(
const quat& q)
noexcept {
174 SHZ_FORCE_INLINE
void init_diagonal(
float x,
float y,
float z,
float w)
noexcept {
178 SHZ_FORCE_INLINE
void init_diagonal(
const vec4& v)
noexcept {
179 init_diagonal(v.x, v.y, v.z, v.w);
182 SHZ_FORCE_INLINE
void init_upper_triangular(
float col1,
const vec2& col2,
const vec3& col3,
const vec4& col4)
noexcept{
183 shz_mat4x4_init_upper_triangular(
this, col1, col2, col3, col4);
186 SHZ_FORCE_INLINE
void init_lower_triangular(
const vec4& col1,
const vec3& col2,
const vec2& col3,
float col4)
noexcept {
187 shz_mat4x4_init_lower_triangular(
this, col1, col2, col3, col4);
190 SHZ_FORCE_INLINE
void init_symmetric_skew(
float x,
float y,
float z)
noexcept {
194 SHZ_FORCE_INLINE
void init_symmetric_skew(
const vec3& v)
noexcept {
195 init_symmetric_skew(v.x, v.y, v.z);
198 SHZ_FORCE_INLINE
void init_outer_product(
const vec4& v1,
const vec4& v2)
noexcept {
199 shz_mat4x4_init_outer_product(
this, v1, v2);
202 SHZ_FORCE_INLINE
void init_permutation_wxyz()
noexcept {
206 SHZ_FORCE_INLINE
void init_permutation_yzwx()
noexcept {
210 SHZ_FORCE_INLINE
void init_screen(
float width,
float height)
noexcept {
214 SHZ_FORCE_INLINE
void init_lookat(
const vec3& eye,
const vec3& center,
const vec3& up)
noexcept {
215 shz_mat4x4_init_lookat(
this, eye, center, up);
218 SHZ_FORCE_INLINE
void init_ortho(
float left,
float right,
float bottom,
float top,
float znear,
float zfar)
noexcept {
222 SHZ_FORCE_INLINE
void init_frustum(
float left,
float right,
float bottom,
float top,
float znear,
float zfar)
noexcept {
226 SHZ_FORCE_INLINE
void init_perspective(
float fov,
float aspect,
float znear)
noexcept {
233
234
235
238 SHZ_FORCE_INLINE
vec4 row(size_t index)
const noexcept {
243 SHZ_FORCE_INLINE
vec4 col(size_t index)
const noexcept {
247 SHZ_FORCE_INLINE
vec3 get_translation()
const noexcept {
252
253
254
255
263
264
265
267 SHZ_FORCE_INLINE
void set_row(size_t index,
vec4 values)
noexcept {
268 shz_mat4x4_set_row(
this, index, values);
271 SHZ_FORCE_INLINE
void set_col(size_t index,
vec4 values)
noexcept {
272 shz_mat4x4_set_col(
this, index, values);
275 SHZ_FORCE_INLINE
void swap_rows(size_t row1, size_t row2)
noexcept {
279 SHZ_FORCE_INLINE
void swap_cols(size_t col1, size_t col2)
noexcept {
283 SHZ_FORCE_INLINE
void set_translation(
float x,
float y,
float z)
noexcept {
287 SHZ_FORCE_INLINE
void set_translation(
const vec3& v)
noexcept {
288 set_translation(v.x, v.y, v.z);
291 SHZ_FORCE_INLINE
void set_scale(
float x,
float y,
float z)
noexcept {
295 SHZ_FORCE_INLINE
void set_scale(
const vec3& v)
noexcept {
296 set_scale(v.x, v.y, v.z);
299 SHZ_FORCE_INLINE
void set_rotation(
const quat& rot)
noexcept {
303 SHZ_FORCE_INLINE
void set_diagonal(
float x,
float y,
float z,
float w)
noexcept {
307 SHZ_FORCE_INLINE
void set_diagonal(
const vec4& v)
noexcept {
308 set_diagonal(v.x, v.y, v.z, v.w);
314
315
316
318 SHZ_FORCE_INLINE
void apply(
const shz_mat4x4_t& mat)
noexcept {
322 SHZ_FORCE_INLINE
void apply(
const float mat[16])
noexcept {
326 SHZ_FORCE_INLINE
void apply_transpose(
const shz_mat4x4_t& mat)
noexcept {
330 SHZ_FORCE_INLINE
void apply_transpose(
const float mat[16])
noexcept {
334 SHZ_FORCE_INLINE
void apply_scale(
float x,
float y,
float z)
noexcept {
338 SHZ_FORCE_INLINE
void apply_scale(
const vec3& v)
noexcept {
339 apply_scale(v.x, v.y, v.z);
342 SHZ_FORCE_INLINE
void apply_translation(
float x,
float y,
float z)
noexcept {
346 SHZ_FORCE_INLINE
void apply_translation(
const vec3& v)
noexcept {
347 apply_translation(v.x, v.y, v.z);
350 SHZ_FORCE_INLINE
void apply_rotation_x(
float angle)
noexcept {
354 SHZ_FORCE_INLINE
void apply_rotation_y(
float angle)
noexcept {
358 SHZ_FORCE_INLINE
void apply_rotation_z(
float angle)
noexcept {
362 SHZ_FORCE_INLINE
void apply_rotation_xyz(
float xAngle,
float yAngle,
float zAngle)
noexcept {
366 SHZ_FORCE_INLINE
void apply_rotation_zyx(
float zAngle,
float yAngle,
float xAngle)
noexcept {
370 SHZ_FORCE_INLINE
void apply_rotation_zxy(
float zAngle,
float xAngle,
float yAngle)
noexcept {
374 SHZ_FORCE_INLINE
void apply_rotation_yxz(
float yAngle,
float xAngle,
float zAngle)
noexcept {
378 SHZ_FORCE_INLINE
void apply_rotation(
float angle,
float x,
float y,
float z)
noexcept {
382 SHZ_FORCE_INLINE
void apply_rotation(
float angle,
vec3 axis)
noexcept {
383 apply_rotation(angle, axis.x, axis.y, axis.z);
386 SHZ_FORCE_INLINE
void apply_rotation(
const quat& q)
noexcept {
390 SHZ_FORCE_INLINE
void apply_lookat(
vec3 pos,
vec3 target,
vec3 up)
noexcept {
391 shz_mat4x4_apply_lookat(
this, pos, target, up);
394 SHZ_FORCE_INLINE
void apply_ortho(
float left,
float right,
float bottom,
float top,
float znear,
float zfar)
noexcept {
398 SHZ_FORCE_INLINE
void apply_frustum(
float left,
float right,
float bottom,
float top,
float znear,
float zfar)
noexcept {
402 SHZ_FORCE_INLINE
void apply_perspective(
float fov,
float aspect,
float znear)
noexcept {
406 SHZ_FORCE_INLINE
void apply_screen(
float width,
float height)
noexcept {
410 SHZ_FORCE_INLINE
void apply_symmetric_skew(
float x,
float y,
float z)
noexcept {
414 SHZ_FORCE_INLINE
void apply_permutation_wxyz()
noexcept {
418 SHZ_FORCE_INLINE
void apply_permutation_yzwx()
noexcept {
422 SHZ_FORCE_INLINE
void apply_self()
noexcept {
429
430
431
433 SHZ_FORCE_INLINE
void translate(
float x,
float y,
float z)
noexcept {
437 SHZ_FORCE_INLINE
void translate(
vec3 v)
noexcept {
438 translate(v.x, v.y, v.z);
441 SHZ_FORCE_INLINE
void scale(
float x,
float y,
float z)
noexcept {
445 SHZ_FORCE_INLINE
void scale(
vec3 v)
noexcept {
446 scale(v.x, v.y, v.z);
449 SHZ_FORCE_INLINE
void rotate_x(
float radians)
noexcept {
453 SHZ_FORCE_INLINE
void rotate_y(
float radians)
noexcept {
457 SHZ_FORCE_INLINE
void rotate_z(
float radians)
noexcept {
461 SHZ_FORCE_INLINE
void rotate_xyz(
float xRadians,
float yRadians,
float zRadians)
noexcept {
465 SHZ_FORCE_INLINE
void rotate_zyx(
float zRadians,
float yRadians,
float xRadians)
noexcept {
469 SHZ_FORCE_INLINE
void rotate_zxy(
float zRadians,
float xRadians,
float yRadians)
noexcept {
473 SHZ_FORCE_INLINE
void rotate_yxz(
float yRadians,
float xRadians,
float zRadians)
noexcept {
477 SHZ_FORCE_INLINE
void rotate(
float radians,
float xAxis,
float yAxis,
float zAxis)
noexcept {
481 SHZ_FORCE_INLINE
void rotate(
float radians,
vec3 axis)
noexcept {
482 rotate(radians, axis.x, axis.y, axis.z);
488
489
490
493
494
495
501
502
503
505 translate_reverse(pos.x, pos.y, pos.z);
509
510
511
517
518
519
521 scale_reverse(size.x, size.y, size.z);
527
528
529
531 SHZ_FORCE_INLINE
static void mult(shz_mat4x4_t* dst,
const shz_mat4x4_t& lhs,
const shz_mat4x4_t& rhs)
noexcept {
535 SHZ_FORCE_INLINE
static void mult(shz_mat4x4_t* dst,
const shz_mat4x4_t& lhs,
const float rhs[16])
noexcept {
539 SHZ_FORCE_INLINE
static void mult_transpose(shz_mat4x4_t* dst,
const shz_mat4x4_t& lhs,
const shz_mat4x4_t& rhs)
noexcept {
543 SHZ_FORCE_INLINE
static void mult_transpose(shz_mat4x4_t* dst,
const shz_mat4x4_t& lhs,
const float rhs[16])
noexcept {
550
551
552
554 SHZ_FORCE_INLINE
vec2 transform(
const vec2& in)
const noexcept {
555 return shz_mat4x4_transform_vec2(
this, in);
558 SHZ_FORCE_INLINE
vec3 transform(
const vec3& in)
const noexcept {
559 return shz_mat4x4_transform_vec3(
this, in);
562 SHZ_FORCE_INLINE
vec4 transform(
const vec4& in)
const noexcept {
563 return shz_mat4x4_transform_vec4(
this, in);
566 SHZ_FORCE_INLINE
vec2 transform_point(
const vec2& pt)
const noexcept {
567 return shz_mat4x4_transform_point2(
this, pt);
570 SHZ_FORCE_INLINE
vec3 transform_point(
const vec3& pt)
const noexcept {
571 return shz_mat4x4_transform_point3(
this, pt);
574 SHZ_FORCE_INLINE
vec2 transform_transpose(
const vec2& in)
const noexcept {
575 return shz_mat4x4_transform_vec2_transpose(
this, in);
578 SHZ_FORCE_INLINE
vec3 transform_transpose(
const vec3& in)
const noexcept {
579 return shz_mat4x4_transform_vec3_transpose(
this, in);
582 SHZ_FORCE_INLINE
vec4 transform_transpose(
const vec4& in)
const noexcept {
583 return shz_mat4x4_transform_vec4_transpose(
this, in);
586 SHZ_FORCE_INLINE
vec2 transform_point_transpose(
const vec2& pt)
const noexcept {
587 return shz_mat4x4_transform_point2_transpose(
this, pt);
590 SHZ_FORCE_INLINE
vec3 transform_point_transpose(
const vec3& pt)
const noexcept {
591 return shz_mat4x4_transform_point3_transpose(
this, pt);
597
598
599
601 SHZ_FORCE_INLINE
static void copy(shz_mat4x4_t* lhs,
const shz_mat4x4_t& rhs)
noexcept {
605 SHZ_FORCE_INLINE
static void copy(shz_mat4x4_t* lhs,
const float rhs[16])
noexcept {
609 friend SHZ_FORCE_INLINE
void swap(shz_mat4x4_t& matA, shz_mat4x4_t& matB)
noexcept {
613 SHZ_FORCE_INLINE
quat to_quat()
const noexcept {
617 SHZ_FORCE_INLINE
float determinant()
const noexcept {
621 SHZ_FORCE_INLINE
float trace()
const noexcept {
625 SHZ_FORCE_INLINE
void inverse(
mat4x4* out)
const noexcept {
629 SHZ_FORCE_INLINE
void inverse_block_triangular(
mat4x4* out)
const noexcept {
633 SHZ_FORCE_INLINE
void decompose(
vec3* translation,
quat* rotation,
vec3* scale)
const noexcept {
634 shz_mat4x4_decompose(
this, translation, rotation, scale);
638
639
640
641
642
643
644
645
646
647
648
649 SHZ_FORCE_INLINE
void blend(
const shz_mat4x4_t& joint_matrix,
float weight)
noexcept {
Namespace enclosing the SH4ZAM C++ API.
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 4x4 identity matrix.
void shz_mat4x4_init_rotation(shz_mat4x4_t *mat, float radians, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT
Initializes the given 4x4 matrix to a 3D rotation matrix of angle radians about the vector with the g...
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_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.
shz_vec3_t shz_mat4x4_get_scale(const shz_mat4x4_t *mat) SHZ_NOEXCEPT
Exracts the 3D scale factors from the given 4x4 matrix.
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_translate_reverse(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Pre-multiplies and accumulates the given matrix onto the 3D translation matrix with the given compone...
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_blend(shz_mat4x4_t *dst, const shz_mat4x4_t *joint_matrix, float weights) SHZ_NOEXCEPT
Adds and accumulates a scaled 4x4 matrix into the given matrix.
void shz_mat4x4_scale_reverse(shz_mat4x4_t *mat, float x, float y, float z) SHZ_NOEXCEPT
Pre-multiplies and accumulates the given matrix onto the 3D scaling matrix with the given components.
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_init_rotation_dir(shz_mat4x4_t *mat, float angle, float x, float y, float z) SHZ_NOEXCEPT
Initializes the given 4x4 matrix to contain a 3D rotation matrix of angle radians about the given dir...
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().
vec3 get_scale() const noexcept
Returns the scaling components from the inner 3x3 matrix of XMTRX, as a 3D vector.
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.
void blend(const shz_mat4x4_t &joint_matrix, float weight) noexcept
Adds and accumulates a scaled 4x4 matrix into the given matrix.
void scale_reverse(float x, float y, float z) noexcept
Pre-multiplies and accumulates the given matrix onto the 3D scaling matrix with the given components.
void translate_reverse(float x, float y, float z) noexcept
Pre-multiplies and accumulates the given matrix onto the 3D translation matrix with the given compone...
void translate_reverse(const shz::vec3 &pos) noexcept
Pre-multiplies and accumulates the given matrix onto the 3D translation matrix with the given positio...
void scale_reverse(const shz::vec3 &size) noexcept
Pre-multiplies and accumulates the given matrix onto the 3D scaling matrix with the given size vector...
C++ structure representing a quaternion.