31#define M_PI 3.14159265358979323846
40 return degrees * (float) (
M_PI / 180.0);
47 return radians * (float) (180.0 /
M_PI);
53static inline float float_clamp(
float f,
float min,
float max) {
54 return f < min ? min : f > max ? max : f;
67static inline float float_lerp(
float a,
float b,
float t) {
68 return a + (b - a) * t;
76 return t * t * (3.f - 2.f * t);
83 return (f > 0.f) - (f < 0.f);
110 return (
vec2) { .
x = x + 0.f, .y = y + 0.f };
166 return a.
x * b.
x + a.
y * b.
y;
223 return a.
x == b.
x && a.
y == b.
y;
256 return (
vec3) { .
x = x + 0.f, .y = y + 0.f, .z = z + 0.f };
312 return a.
x * b.
x + a.
y * b.
y + a.
z * b.
z;
320 a.
y * b.
z - a.
z * b.
y,
321 a.
z * b.
x - a.
x * b.
z,
322 a.
x * b.
y - a.
y * b.
x
380 return vec3_new(fmaf(add.
x, s, v.
x), fmaf(add.
y, s, v.
y), fmaf(add.
z, s, v.
z));
394 return a.
x == b.
x && a.
y == b.
y && a.
z == b.
z;
435 return (
vec4) { .
x = x + 0.f, .y = y + 0.f, .z = z + 0.f, .w = w + 0.f };
442 return vec4_new(0.f, 0.f, 0.f, 0.f);
449 return vec4_new(1.f, 1.f, 1.f, 1.f);
491 return a.
x * b.
x + a.
y * b.
y + a.
z * b.
z + a.
w * b.
w;
548 return a.
x == b.
x && a.
y == b.
y && a.
z == b.
z && a.
w == b.
w;
581 memcpy(m.
f, src,
sizeof(m.
f));
589 return (
mat4) { .
cols = { c0, c1, c2, c3 } };
610 a.
m[0][0] * b.
m[0][0] + a.
m[1][0] * b.
m[0][1] + a.
m[2][0] * b.
m[0][2] + a.
m[3][0] * b.
m[0][3],
611 a.
m[0][1] * b.
m[0][0] + a.
m[1][1] * b.
m[0][1] + a.
m[2][1] * b.
m[0][2] + a.
m[3][1] * b.
m[0][3],
612 a.
m[0][2] * b.
m[0][0] + a.
m[1][2] * b.
m[0][1] + a.
m[2][2] * b.
m[0][2] + a.
m[3][2] * b.
m[0][3],
613 a.
m[0][3] * b.
m[0][0] + a.
m[1][3] * b.
m[0][1] + a.
m[2][3] * b.
m[0][2] + a.
m[3][3] * b.
m[0][3]
616 a.
m[0][0] * b.
m[1][0] + a.
m[1][0] * b.
m[1][1] + a.
m[2][0] * b.
m[1][2] + a.
m[3][0] * b.
m[1][3],
617 a.
m[0][1] * b.
m[1][0] + a.
m[1][1] * b.
m[1][1] + a.
m[2][1] * b.
m[1][2] + a.
m[3][1] * b.
m[1][3],
618 a.
m[0][2] * b.
m[1][0] + a.
m[1][2] * b.
m[1][1] + a.
m[2][2] * b.
m[1][2] + a.
m[3][2] * b.
m[1][3],
619 a.
m[0][3] * b.
m[1][0] + a.
m[1][3] * b.
m[1][1] + a.
m[2][3] * b.
m[1][2] + a.
m[3][3] * b.
m[1][3]
622 a.
m[0][0] * b.
m[2][0] + a.
m[1][0] * b.
m[2][1] + a.
m[2][0] * b.
m[2][2] + a.
m[3][0] * b.
m[2][3],
623 a.
m[0][1] * b.
m[2][0] + a.
m[1][1] * b.
m[2][1] + a.
m[2][1] * b.
m[2][2] + a.
m[3][1] * b.
m[2][3],
624 a.
m[0][2] * b.
m[2][0] + a.
m[1][2] * b.
m[2][1] + a.
m[2][2] * b.
m[2][2] + a.
m[3][2] * b.
m[2][3],
625 a.
m[0][3] * b.
m[2][0] + a.
m[1][3] * b.
m[2][1] + a.
m[2][3] * b.
m[2][2] + a.
m[3][3] * b.
m[2][3]
628 a.
m[0][0] * b.
m[3][0] + a.
m[1][0] * b.
m[3][1] + a.
m[2][0] * b.
m[3][2] + a.
m[3][0] * b.
m[3][3],
629 a.
m[0][1] * b.
m[3][0] + a.
m[1][1] * b.
m[3][1] + a.
m[2][1] * b.
m[3][2] + a.
m[3][1] * b.
m[3][3],
630 a.
m[0][2] * b.
m[3][0] + a.
m[1][2] * b.
m[3][1] + a.
m[2][2] * b.
m[3][2] + a.
m[3][2] * b.
m[3][3],
631 a.
m[0][3] * b.
m[3][0] + a.
m[1][3] * b.
m[3][1] + a.
m[2][3] * b.
m[3][2] + a.
m[3][3] * b.
m[3][3]
653 const float c = cosf(r), s = sinf(r), ic = 1.f - c;
656 vec4_new(u.
x * u.
x * ic + c, u.
x * u.
y * ic + u.
z * s, u.
x * u.
z * ic - u.
y * s, 0.f),
657 vec4_new(u.
x * u.
y * ic - u.
z * s, u.
y * u.
y * ic + c, u.
y * u.
z * ic + u.
x * s, 0.f),
658 vec4_new(u.
x * u.
z * ic + u.
y * s, u.
y * u.
z * ic - u.
x * s, u.
z * u.
z * ic + c, 0.f),
691 const float nf = 1.f / (znear - zfar);
693 f / aspect, 0.f, 0.f, 0.f,
695 0.f, 0.f, (znear + zfar) * nf, -1.f,
696 0.f, 0.f, (2.f * znear * zfar) * nf, 0.f,
703static inline mat4 mat4_ortho(
float left,
float right,
float bottom,
float top,
float znear,
float zfar) {
704 const float lr = 1.f / (left - right);
705 const float bt = 1.f / (bottom - top);
706 const float nf = 1.f / (znear - zfar);
708 -2.f * lr, 0.f, 0.f, 0.f,
709 0.f, -2.f * bt, 0.f, 0.f,
710 0.f, 0.f, 2.f * nf, 0.f,
711 (left + right) * lr, (top + bottom) * bt, (zfar + znear) * nf, 1.f,
734 const float b00 = a.
m[0][0] * a.
m[1][1] - a.
m[0][1] * a.
m[1][0];
735 const float b01 = a.
m[0][0] * a.
m[1][2] - a.
m[0][2] * a.
m[1][0];
736 const float b02 = a.
m[0][0] * a.
m[1][3] - a.
m[0][3] * a.
m[1][0];
737 const float b03 = a.
m[0][1] * a.
m[1][2] - a.
m[0][2] * a.
m[1][1];
738 const float b04 = a.
m[0][1] * a.
m[1][3] - a.
m[0][3] * a.
m[1][1];
739 const float b05 = a.
m[0][2] * a.
m[1][3] - a.
m[0][3] * a.
m[1][2];
740 const float b06 = a.
m[2][0] * a.
m[3][1] - a.
m[2][1] * a.
m[3][0];
741 const float b07 = a.
m[2][0] * a.
m[3][2] - a.
m[2][2] * a.
m[3][0];
742 const float b08 = a.
m[2][0] * a.
m[3][3] - a.
m[2][3] * a.
m[3][0];
743 const float b09 = a.
m[2][1] * a.
m[3][2] - a.
m[2][2] * a.
m[3][1];
744 const float b10 = a.
m[2][1] * a.
m[3][3] - a.
m[2][3] * a.
m[3][1];
745 const float b11 = a.
m[2][2] * a.
m[3][3] - a.
m[2][3] * a.
m[3][2];
747 float det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
754 ( a.
m[1][1] * b11 - a.
m[1][2] * b10 + a.
m[1][3] * b09) * det,
755 (-a.
m[0][1] * b11 + a.
m[0][2] * b10 - a.
m[0][3] * b09) * det,
756 ( a.
m[3][1] * b05 - a.
m[3][2] * b04 + a.
m[3][3] * b03) * det,
757 (-a.
m[2][1] * b05 + a.
m[2][2] * b04 - a.
m[2][3] * b03) * det,
758 (-a.
m[1][0] * b11 + a.
m[1][2] * b08 - a.
m[1][3] * b07) * det,
759 ( a.
m[0][0] * b11 - a.
m[0][2] * b08 + a.
m[0][3] * b07) * det,
760 (-a.
m[3][0] * b05 + a.
m[3][2] * b02 - a.
m[3][3] * b01) * det,
761 ( a.
m[2][0] * b05 - a.
m[2][2] * b02 + a.
m[2][3] * b01) * det,
762 ( a.
m[1][0] * b10 - a.
m[1][1] * b08 + a.
m[1][3] * b06) * det,
763 (-a.
m[0][0] * b10 + a.
m[0][1] * b08 - a.
m[0][3] * b06) * det,
764 ( a.
m[3][0] * b04 - a.
m[3][1] * b02 + a.
m[3][3] * b00) * det,
765 (-a.
m[2][0] * b04 + a.
m[2][1] * b02 - a.
m[2][3] * b00) * det,
766 (-a.
m[1][0] * b09 + a.
m[1][1] * b07 - a.
m[1][2] * b06) * det,
767 ( a.
m[0][0] * b09 - a.
m[0][1] * b07 + a.
m[0][2] * b06) * det,
768 (-a.
m[3][0] * b03 + a.
m[3][1] * b01 - a.
m[3][2] * b00) * det,
769 ( a.
m[2][0] * b03 - a.
m[2][1] * b01 + a.
m[2][2] * b00) * det,
778 v.
x * m.
m[0][0] + v.
y * m.
m[1][0] + v.
z * m.
m[2][0] + m.
m[3][0],
779 v.
x * m.
m[0][1] + v.
y * m.
m[1][1] + v.
z * m.
m[2][1] + m.
m[3][1],
780 v.
x * m.
m[0][2] + v.
y * m.
m[1][2] + v.
z * m.
m[2][2] + m.
m[3][2]
789 v.
x * m.
m[0][0] + v.
y * m.
m[1][0] + v.
z * m.
m[2][0] + v.
w * m.
m[3][0],
790 v.
x * m.
m[0][1] + v.
y * m.
m[1][1] + v.
z * m.
m[2][1] + v.
w * m.
m[3][1],
791 v.
x * m.
m[0][2] + v.
y * m.
m[1][2] + v.
z * m.
m[2][2] + v.
w * m.
m[3][2],
792 v.
x * m.
m[0][3] + v.
y * m.
m[1][3] + v.
z * m.
m[2][3] + v.
w * m.
m[3][3]
static mat4 mat4_look_at(vec3 eye, vec3 center, vec3 up)
Definition Mathlib.h:718
static vec3 vec3_scale(vec3 v, float s)
Definition Mathlib.h:297
static vec3 vec3_normalize(vec3 v)
Definition Mathlib.h:350
static vec4 vec4_min(vec4 a, vec4 b)
Definition Mathlib.h:526
static vec4 vec4_lerp(vec4 a, vec4 b, float t)
Definition Mathlib.h:540
static mat4 mat4_new(const float src[16])
Definition Mathlib.h:579
static vec2 vec2_max(vec2 a, vec2 b)
Definition Mathlib.h:208
static vec3 vec3_cross(vec3 a, vec3 b)
Definition Mathlib.h:318
static float float_radians(float degrees)
Definition Mathlib.h:39
static vec3 vec3_reflect(vec3 v, vec3 n)
Definition Mathlib.h:386
static vec2 vec2_scale(vec2 v, float s)
Definition Mathlib.h:151
static mat4 mat4_ortho(float left, float right, float bottom, float top, float znear, float zfar)
Definition Mathlib.h:703
static float float_clamp(float f, float min, float max)
Definition Mathlib.h:53
static float vec4_length(vec4 v)
Definition Mathlib.h:504
static float vec4_length_squared(vec4 v)
Definition Mathlib.h:497
static float vec4_distance(vec4 a, vec4 b)
Definition Mathlib.h:511
static vec2 vec2_add(vec2 a, vec2 b)
Definition Mathlib.h:130
static float float_lerp(float a, float b, float t)
Definition Mathlib.h:67
static vec2 vec2_zero(void)
Definition Mathlib.h:116
static vec3 vec3_sub(vec3 a, vec3 b)
Definition Mathlib.h:283
static float float_degrees(float radians)
Definition Mathlib.h:46
static bool vec2_equal(vec2 a, vec2 b)
Definition Mathlib.h:222
static vec3 mat4_transform(mat4 m, vec3 v)
Definition Mathlib.h:776
static vec2 vec2_normalize(vec2 v)
Definition Mathlib.h:193
static vec3 vec3_lerp(vec3 a, vec3 b, float t)
Definition Mathlib.h:372
static float vec3_length_squared(vec3 v)
Definition Mathlib.h:329
static vec2 vec2_one(void)
Definition Mathlib.h:123
static vec2 vec2_sub(vec2 a, vec2 b)
Definition Mathlib.h:137
static vec4 mat4_transform4(mat4 m, vec4 v)
Definition Mathlib.h:787
static vec4 vec4_new(float x, float y, float z, float w)
Definition Mathlib.h:434
static mat4 mat4_translation(vec3 t)
Definition Mathlib.h:639
static float vec4_dot(vec4 a, vec4 b)
Definition Mathlib.h:490
static float vec2_distance(vec2 a, vec2 b)
Definition Mathlib.h:186
static bool vec3_equal(vec3 a, vec3 b)
Definition Mathlib.h:393
static vec3 vec3_new(float x, float y, float z)
Definition Mathlib.h:255
static vec4 vec4_scale(vec4 v, float s)
Definition Mathlib.h:476
static float vec2_dot(vec2 a, vec2 b)
Definition Mathlib.h:165
static mat4 mat4_inverse(mat4 a)
Definition Mathlib.h:733
static mat4 mat4_perspective(float fovy, float aspect, float znear, float zfar)
Definition Mathlib.h:689
static mat4 mat4_identity(void)
Definition Mathlib.h:595
static vec2 vec2_negate(vec2 v)
Definition Mathlib.h:158
static vec4 vec4_sub(vec4 a, vec4 b)
Definition Mathlib.h:462
static mat4 mat4_rotation(float degrees, vec3 axis)
Definition Mathlib.h:651
static vec3 vec3_mul(vec3 a, vec3 b)
Definition Mathlib.h:290
static float float_smoothstep(float edge0, float edge1, float f)
Definition Mathlib.h:74
static vec2 vec2_mul(vec2 a, vec2 b)
Definition Mathlib.h:144
static vec3 vec3_zero(void)
Definition Mathlib.h:262
static float float_sign(float f)
Definition Mathlib.h:82
static vec3 vec3_one(void)
Definition Mathlib.h:269
static float vec3_dot(vec3 a, vec3 b)
Definition Mathlib.h:311
static mat4 mat4_scale(float s)
Definition Mathlib.h:678
static float float_saturate(float f)
Definition Mathlib.h:60
static vec3 vec3_add(vec3 a, vec3 b)
Definition Mathlib.h:276
static float vec2_length(vec2 v)
Definition Mathlib.h:179
static vec4 vec4_negate(vec4 v)
Definition Mathlib.h:483
static float vec3_length(vec3 v)
Definition Mathlib.h:336
static vec4 vec4_add(vec4 a, vec4 b)
Definition Mathlib.h:455
static vec3 vec3_negate(vec3 v)
Definition Mathlib.h:304
static vec2 vec2_min(vec2 a, vec2 b)
Definition Mathlib.h:201
static vec4 vec4_one(void)
Definition Mathlib.h:448
static mat4 mat4_from_cols(vec4 c0, vec4 c1, vec4 c2, vec4 c3)
Definition Mathlib.h:588
static vec4 vec4_normalize(vec4 v)
Definition Mathlib.h:518
static vec2 vec2_lerp(vec2 a, vec2 b, float t)
Definition Mathlib.h:215
static vec3 vec3_min(vec3 a, vec3 b)
Definition Mathlib.h:358
static mat4 mat4_scale3(vec3 s)
Definition Mathlib.h:666
static vec3 vec3_max(vec3 a, vec3 b)
Definition Mathlib.h:365
static vec4 vec4_zero(void)
Definition Mathlib.h:441
static float vec3_distance(vec3 a, vec3 b)
Definition Mathlib.h:343
static vec2 vec2_new(float x, float y)
Definition Mathlib.h:109
#define M_PI
Definition Mathlib.h:31
static bool vec4_equal(vec4 a, vec4 b)
Definition Mathlib.h:547
static vec3 vec3_fma(vec3 v, vec3 add, float s)
Definition Mathlib.h:379
static vec4 vec4_mul(vec4 a, vec4 b)
Definition Mathlib.h:469
static mat4 mat4_mul(mat4 a, mat4 b)
Definition Mathlib.h:607
static float vec2_length_squared(vec2 v)
Definition Mathlib.h:172
static vec4 vec4_max(vec4 a, vec4 b)
Definition Mathlib.h:533
Column-major 4×4 single-precision matrix. Layout matches GLSL mat4.
Definition Mathlib.h:558
float f[16]
Flat array accessor.
Definition Mathlib.h:563
float m[4][4]
Column-major 2D array accessor. m[col][row].
Definition Mathlib.h:568
vec4 cols[4]
Column vectors.
Definition Mathlib.h:573
Two-component single-precision vector. Component layout matches GLSL vec2.
Definition Mathlib.h:91
float x
Definition Mathlib.h:102
float y
Definition Mathlib.h:102
Three-component single-precision vector. Component layout matches GLSL vec3.
Definition Mathlib.h:232
float x
Definition Mathlib.h:243
vec2 xy
Swizzle to vec2.
Definition Mathlib.h:249
float y
Definition Mathlib.h:243
float z
Definition Mathlib.h:243
Four-component single-precision vector. Component layout matches GLSL vec4.
Definition Mathlib.h:403
float w
Definition Mathlib.h:414
float z
Definition Mathlib.h:414
vec3 xyz
Swizzle to vec3.
Definition Mathlib.h:420
float x
Definition Mathlib.h:414
vec2 zw
Definition Mathlib.h:427
float y
Definition Mathlib.h:414
vec2 xy
Definition Mathlib.h:426