18 memset(res->
v, 0,
sizeof(res->
v));
39 for (
int c = 0; c < 4; c++) {
40 for (
int r = 0; r < 4; r++) {
42 for (
int k = 0; k < 4; k++) {
43 s += a->
v[k * 4 + r] * b->
v[c * 4 + k];
62 for (
int i = 0; i < 4; i++) {
63 for (
int j = 0; j < 4; j++) {
64 res->
v[i * 4 + j] = m->
v[j * 4 + i];
71#ifdef VECMAT_RUNTIME_DISPATCH
73 mat4_mul_ptr_(res, a, b);
81#ifdef VECMAT_RUNTIME_DISPATCH
83 mat4_transpose_ptr_(res, m);
102 inv[0] = m->
v[5] * m->
v[10] * m->
v[15] - m->
v[5] * m->
v[14] * m->
v[11] - m->
v[9] * m->
v[6] * m->
v[15] + m->
v[9] * m->
v[14] * m->
v[7] + m->
v[13] * m->
v[6] * m->
v[11] - m->
v[13] * m->
v[10] * m->
v[7];
103 inv[4] = -m->
v[4] * m->
v[10] * m->
v[15] + m->
v[4] * m->
v[14] * m->
v[11] + m->
v[8] * m->
v[6] * m->
v[15] - m->
v[8] * m->
v[14] * m->
v[7] - m->
v[12] * m->
v[6] * m->
v[11] + m->
v[12] * m->
v[10] * m->
v[7];
104 inv[8] = m->
v[4] * m->
v[9] * m->
v[15] - m->
v[4] * m->
v[13] * m->
v[11] - m->
v[8] * m->
v[5] * m->
v[15] + m->
v[8] * m->
v[13] * m->
v[7] + m->
v[12] * m->
v[5] * m->
v[11] - m->
v[12] * m->
v[9] * m->
v[7];
105 inv[12] = -m->
v[4] * m->
v[9] * m->
v[14] + m->
v[4] * m->
v[13] * m->
v[10] + m->
v[8] * m->
v[5] * m->
v[14] - m->
v[8] * m->
v[13] * m->
v[6] - m->
v[12] * m->
v[5] * m->
v[10] + m->
v[12] * m->
v[9] * m->
v[6];
106 inv[1] = -m->
v[1] * m->
v[10] * m->
v[15] + m->
v[1] * m->
v[14] * m->
v[11] + m->
v[9] * m->
v[2] * m->
v[15] - m->
v[9] * m->
v[14] * m->
v[3] - m->
v[13] * m->
v[2] * m->
v[11] + m->
v[13] * m->
v[10] * m->
v[3];
107 inv[5] = m->
v[0] * m->
v[10] * m->
v[15] - m->
v[0] * m->
v[14] * m->
v[11] - m->
v[8] * m->
v[2] * m->
v[15] + m->
v[8] * m->
v[14] * m->
v[3] + m->
v[12] * m->
v[2] * m->
v[11] - m->
v[12] * m->
v[10] * m->
v[3];
108 inv[9] = -m->
v[0] * m->
v[9] * m->
v[15] + m->
v[0] * m->
v[13] * m->
v[11] + m->
v[8] * m->
v[1] * m->
v[15] - m->
v[8] * m->
v[13] * m->
v[3] - m->
v[12] * m->
v[1] * m->
v[11] + m->
v[12] * m->
v[9] * m->
v[3];
109 inv[13] = m->
v[0] * m->
v[9] * m->
v[14] - m->
v[0] * m->
v[13] * m->
v[10] - m->
v[8] * m->
v[1] * m->
v[14] + m->
v[8] * m->
v[13] * m->
v[2] + m->
v[12] * m->
v[1] * m->
v[10] - m->
v[12] * m->
v[9] * m->
v[2];
110 inv[2] = m->
v[1] * m->
v[6] * m->
v[15] - m->
v[1] * m->
v[14] * m->
v[7] - m->
v[5] * m->
v[2] * m->
v[15] + m->
v[5] * m->
v[14] * m->
v[3] + m->
v[13] * m->
v[2] * m->
v[7] - m->
v[13] * m->
v[6] * m->
v[3];
111 inv[6] = -m->
v[0] * m->
v[6] * m->
v[15] + m->
v[0] * m->
v[14] * m->
v[7] + m->
v[4] * m->
v[2] * m->
v[15] - m->
v[4] * m->
v[14] * m->
v[3] - m->
v[12] * m->
v[2] * m->
v[7] + m->
v[12] * m->
v[6] * m->
v[3];
112 inv[10] = m->
v[0] * m->
v[5] * m->
v[15] - m->
v[0] * m->
v[13] * m->
v[7] - m->
v[4] * m->
v[1] * m->
v[15] + m->
v[4] * m->
v[13] * m->
v[3] + m->
v[12] * m->
v[1] * m->
v[7] - m->
v[12] * m->
v[5] * m->
v[3];
113 inv[14] = -m->
v[0] * m->
v[5] * m->
v[14] + m->
v[0] * m->
v[13] * m->
v[6] + m->
v[4] * m->
v[1] * m->
v[14] - m->
v[4] * m->
v[13] * m->
v[2] - m->
v[12] * m->
v[1] * m->
v[6] + m->
v[12] * m->
v[5] * m->
v[2];
114 inv[3] = -m->
v[1] * m->
v[6] * m->
v[11] + m->
v[1] * m->
v[10] * m->
v[7] + m->
v[5] * m->
v[2] * m->
v[11] - m->
v[5] * m->
v[10] * m->
v[3] - m->
v[9] * m->
v[2] * m->
v[7] + m->
v[9] * m->
v[6] * m->
v[3];
115 inv[7] = m->
v[0] * m->
v[6] * m->
v[11] - m->
v[0] * m->
v[10] * m->
v[7] - m->
v[4] * m->
v[2] * m->
v[11] + m->
v[4] * m->
v[10] * m->
v[3] + m->
v[8] * m->
v[2] * m->
v[7] - m->
v[8] * m->
v[6] * m->
v[3];
116 inv[11] = -m->
v[0] * m->
v[5] * m->
v[11] + m->
v[0] * m->
v[9] * m->
v[7] + m->
v[4] * m->
v[1] * m->
v[11] - m->
v[4] * m->
v[9] * m->
v[3] - m->
v[8] * m->
v[1] * m->
v[7] + m->
v[8] * m->
v[5] * m->
v[3];
117 inv[15] = m->
v[0] * m->
v[5] * m->
v[10] - m->
v[0] * m->
v[9] * m->
v[6] - m->
v[4] * m->
v[1] * m->
v[10] + m->
v[4] * m->
v[9] * m->
v[2] + m->
v[8] * m->
v[1] * m->
v[6] - m->
v[8] * m->
v[5] * m->
v[2];
119 vm_float_t det = m->
v[0] * inv[0] + m->
v[1] * inv[4] + m->
v[2] * inv[8] + m->
v[3] * inv[12];
130 for (
int i = 0; i < 16; i++) {
131 res->
v[i] = inv[i] * det;
178 memset(res->
v, 0,
sizeof(res->
v));
202 const vm_float_t x = normalized_axis.
x, y = normalized_axis.
y, z = normalized_axis.
z;
204 memset(res->
v, 0,
sizeof(res->
v));
205 res->
v[0] = x * x * omc + c;
206 res->
v[1] = x * y * omc + z * s;
207 res->
v[2] = x * z * omc - y * s;
208 res->
v[4] = x * y * omc - z * s;
209 res->
v[5] = y * y * omc + c;
210 res->
v[6] = y * z * omc + x * s;
211 res->
v[8] = x * z * omc + y * s;
212 res->
v[9] = y * z * omc - x * s;
213 res->
v[10] = z * z * omc + c;
296 res->
m11 *= scale->
x; res->
m21 *= scale->
x; res->
m31 *= scale->
x;
297 res->
m12 *= scale->
y; res->
m22 *= scale->
y; res->
m32 *= scale->
y;
298 res->
m13 *= scale->
z; res->
m23 *= scale->
z; res->
m33 *= scale->
z;
299 res->
m14 = translation->
x;
300 res->
m24 = translation->
y;
301 res->
m34 = translation->
z;
341 r.
m11 = (s.
x != 0.0f) ? m->
m11 / s.
x : 0.0f;
342 r.
m21 = (s.
x != 0.0f) ? m->
m21 / s.
x : 0.0f;
343 r.
m31 = (s.
x != 0.0f) ? m->
m31 / s.
x : 0.0f;
344 r.
m12 = (s.
y != 0.0f) ? m->
m12 / s.
y : 0.0f;
345 r.
m22 = (s.
y != 0.0f) ? m->
m22 / s.
y : 0.0f;
346 r.
m32 = (s.
y != 0.0f) ? m->
m32 / s.
y : 0.0f;
347 r.
m13 = (s.
z != 0.0f) ? m->
m13 / s.
z : 0.0f;
348 r.
m23 = (s.
z != 0.0f) ? m->
m23 / s.
z : 0.0f;
349 r.
m33 = (s.
z != 0.0f) ? m->
m33 / s.
z : 0.0f;
371 for (
int i = 0; i < 16; i++) res->
v[i] = 0.0f;
372 res->
v[0] = 1.0f / (aspect * tan_half_fov);
373 res->
v[5] = 1.0f / tan_half_fov;
374 res->
v[10] = -(far + near) / (far - near);
376 res->
v[14] = -2.0f * far * near / (far - near);
396 res->
v[0] = 2.0f / (right - left);
397 res->
v[5] = 2.0f / (top - bottom);
398 res->
v[10] = -2.0f / (far - near);
399 res->
v[12] = -(right + left) / (right - left);
400 res->
v[13] = -(top + bottom) / (top - bottom);
401 res->
v[14] = -(far + near) / (far - near);
426 res->
v[1] = true_up.
x;
427 res->
v[2] = -forward.
x;
429 res->
v[5] = true_up.
y;
430 res->
v[6] = -forward.
y;
432 res->
v[9] = true_up.
z;
433 res->
v[10] = -forward.
z;
434 res->
v[12] = -
vec3_dot(right, *position);
435 res->
v[13] = -
vec3_dot(true_up, *position);
436 res->
v[14] =
vec3_dot(forward, *position);
459 for (
int i = 0; i < 16; i++) res->
v[i] = 0.0f;
460 res->
v[0] = 1.0f / (aspect * tan_half_fov);
461 res->
v[5] = 1.0f / tan_half_fov;
462 res->
v[10] = -(f + n) / (f - n);
464 res->
v[14] = -2.0f * f * n / (f - n);
483 for (
int i = 0; i < 16; i++) res->
v[i] = 0.0f;
484 res->
v[0] = 1.0f / (aspect * tan_half_fov);
485 res->
v[5] = 1.0f / tan_half_fov;
488 res->
v[14] = -2.0f * n;
512#ifdef VECMAT_RUNTIME_DISPATCH
514 mat4_mul_vec4_ptr_(res, m, v);
540#ifdef VECMAT_RUNTIME_DISPATCH
542 mat4_mul_vec3_ptr_(res, m, v, w);
#define VECMAT_SCALAR_API
void mat4_perspective_infinite_ptr(matrix4 *res, vm_float_t const fov_y, vm_float_t const aspect, vm_float_t const n)
Sets the matrix to an infinite perspective projection matrix.
void mat4_scale_ptr(matrix4 *res, const vector3 *v)
Sets the matrix to a scaling matrix using the provided scale vector.
void mat4_mul_vec4_ptr(vector4 *res, const matrix4 *m, const vector4 *v)
void mat4_extract_scale_ptr(vector3 *res, const matrix4 *m)
Extracts the scale vector from a matrix4.
void mat4_rotation_ptr(matrix4 *res, const vector3 *axis, const vm_float_t angle)
Sets the matrix to a rotation matrix around the specified axis by the given angle.
void mat4_look_at_ptr(matrix4 *res, const vector3 *position, const vector3 *target, const vector3 *up)
Constructs a view matrix for a camera positioned at the given location, looking towards a target,...
void mat4_rotation_z_ptr(matrix4 *res, const vm_float_t degrees)
Builds a 4x4 rotation matrix around the Z axis (degrees).
VECMAT_SCALAR_API void mat4_mul_ptr_scalar(matrix4 *res, const matrix4 *a, const matrix4 *b)
Multiplies two 4x4 matrices.
VECMAT_SCALAR_API void mat4_mul_vec3_ptr_scalar(vector3 *res, const matrix4 *m, const vector3 *v, const vm_float_t w)
Transforms a vector3 by a 4x4 matrix using homogeneous w.
void mat4_extract_rotation_ptr(quaternion *res, const matrix4 *m)
Extracts the rotation quaternion from a matrix4.
void mat4_rotation_x_ptr(matrix4 *res, const vm_float_t degrees)
Builds a 4x4 rotation matrix around the X axis (degrees).
void mat4_ortho_ptr(matrix4 *res, const vm_float_t left, const vm_float_t right, const vm_float_t bottom, const vm_float_t top, const vm_float_t near, const vm_float_t far)
Sets the matrix to an orthographic projection matrix.
void mat4_inverse_ptr(matrix4 *res, const matrix4 *m)
Computes the inverse of a 4x4 matrix.
VECMAT_SCALAR_API void mat4_transpose_ptr_scalar(matrix4 *res, const matrix4 *m)
Transposes the given 4x4 matrix.
void mat4_mul_vec3_ptr(vector3 *res, const matrix4 *m, const vector3 *v, const vm_float_t w)
void mat4_perspective_fov_ptr(matrix4 *res, const vm_float_t fov, const vm_float_t w, const vm_float_t h, const vm_float_t n, const vm_float_t f)
Sets the matrix to a perspective projection matrix.
void mat4_rotation_y_ptr(matrix4 *res, const vm_float_t degrees)
Builds a 4x4 rotation matrix around the Y axis (degrees).
void mat4_translate_ptr(matrix4 *res, const vector3 *v)
Sets the matrix to a translation matrix.
void mat4_extract_translation_ptr(vector3 *res, const matrix4 *m)
Extracts the translation vector from a matrix4.
void mat4_transpose_ptr(matrix4 *res, const matrix4 *m)
void mat4_from_mat3_ptr(matrix4 *res, const matrix3 *m)
Embeds a matrix3 into the upper-left of a matrix4.
void mat4_perspective_ptr(matrix4 *res, const vm_float_t fov, const vm_float_t aspect, const vm_float_t near, const vm_float_t far)
Creates a perspective projection matrix.
void mat4_mul_ptr(matrix4 *res, const matrix4 *a, const matrix4 *b)
VECMAT_SCALAR_API void mat4_mul_vec4_ptr_scalar(vector4 *res, const matrix4 *m, const vector4 *v)
Multiplies a 4x4 matrix by a vector4.
void mat4_identity_ptr(matrix4 *res)
Sets the matrix to the identity matrix.
void mat4_trs_ptr(matrix4 *res, const vector3 *translation, const quaternion *rotation, const vector3 *scale)
Builds a 4x4 TRS matrix from translation, rotation, and scale.
vm_float_t v[VECMAT_MAT4_SIZE]
vm_float_t vec3_dot(vector3 a, vector3 b)
Computes the dot product of two vector3.
void quat_from_mat3_ptr(quaternion *res, const matrix3 *m)
Builds a quaternion from a 3x3 rotation matrix.
matrix4 mat4_identity(void)
Constructs the 4x4 identity matrix.
vector3 vec3_normalize(vector3 v)
Normalizes a vector3 to unit length.
vector3 vec3_cross(vector3 a, vector3 b)
Computes the cross-product of two vector3.
void quat_to_mat4_ptr(matrix4 *res, const quaternion *q)
Converts a unit quaternion to a 4x4 rotation matrix and stores in res.
vm_float_t deg_to_rad(vm_float_t degrees)
Converts degrees to radians.
vector3 vec3_sub(vector3 a, vector3 b)
Component-wise subtraction of two vectors.