Skip to content

std.math

f32 vectors, rects and scalar helpers for games; v2_/v3_ prefixes

pub PI :: 3.14159265f32

constants

pub TAU :: 6.28318531f32
pub DEG2RAD :: 0.01745329f32
pub RAD2DEG :: 57.2957795f32
pub lerp :: fn(a: f32, b: f32, t: f32) -> f32

a at t=0, b at t=1

pub approach :: fn(cur: f32, tgt: f32, step: f32) -> f32

toward tgt by at most step; no overshoot

pub signf :: fn(x: f32) -> f32

-1, 0 or +1

pub deg2rad :: fn(deg: f32) -> f32
pub rad2deg :: fn(rad: f32) -> f32
pub sin :: fn(x: f32) -> f32
pub cos :: fn(x: f32) -> f32
pub tan :: fn(x: f32) -> f32
pub wrapf :: fn(x: f32, lo: f32, hi: f32) -> f32

into [lo, hi)

pub Vec2 :: struct {
x: f32,
y: f32,
}
pub v2 :: fn(x: f32, y: f32) -> Vec2
pub v2_zero :: fn() -> Vec2
pub v2_splat :: fn(s: f32) -> Vec2
pub v2_add :: fn(a: Vec2, b: Vec2) -> Vec2
pub v2_sub :: fn(a: Vec2, b: Vec2) -> Vec2
pub v2_mul :: fn(a: Vec2, b: Vec2) -> Vec2
pub v2_scale :: fn(a: Vec2, s: f32) -> Vec2
pub v2_neg :: fn(a: Vec2) -> Vec2
pub v2_dot :: fn(a: Vec2, b: Vec2) -> f32
pub v2_len2 :: fn(a: Vec2) -> f32
pub v2_len :: fn(a: Vec2) -> f32
pub v2_dist2 :: fn(a: Vec2, b: Vec2) -> f32
pub v2_dist :: fn(a: Vec2, b: Vec2) -> f32
pub v2_normalize :: fn(a: Vec2) -> Vec2

zero vector if a is ~zero

pub v2_lerp :: fn(a: Vec2, b: Vec2, t: f32) -> Vec2
pub v2_perp :: fn(a: Vec2) -> Vec2

90 deg counter-clockwise

pub v2_rotate :: fn(a: Vec2, rad: f32) -> Vec2

by rad radians

pub v2_from_angle :: fn(rad: f32) -> Vec2

unit vector at rad; 0 = +x

pub Vec3 :: struct {
x: f32,
y: f32,
z: f32,
}
pub v3 :: fn(x: f32, y: f32, z: f32) -> Vec3
pub v3_add :: fn(a: Vec3, b: Vec3) -> Vec3
pub v3_sub :: fn(a: Vec3, b: Vec3) -> Vec3
pub v3_scale :: fn(a: Vec3, s: f32) -> Vec3
pub v3_dot :: fn(a: Vec3, b: Vec3) -> f32
pub v3_len :: fn(a: Vec3) -> f32
pub v3_cross :: fn(a: Vec3, b: Vec3) -> Vec3
pub v3_normalize :: fn(a: Vec3) -> Vec3
pub Rect :: struct {
x: f32,
y: f32,
w: f32,
h: f32,
}

axis-aligned rect for sprites, UI, collisions

pub rect :: fn(x: f32, y: f32, w: f32, h: f32) -> Rect
pub rect_contains :: fn(r: Rect, px: f32, py: f32) -> bool
pub rect_overlaps :: fn(a: Rect, b: Rect) -> bool

AABB overlap

pub rect_center :: fn(r: Rect) -> Vec2
pub gcd :: fn(a: u64, b: u64) -> u64

gcd(0, 0) is 0

pub lcm :: fn(a: u64, b: u64) -> ?u64

0 when either is 0; null on u64 overflow

pub ipow :: fn(base: u64, exp: u32) -> ?u64

null on u64 overflow

pub isqrt :: fn(n: u64) -> u64

floor(sqrt(n))

pub div_ceil :: fn(a: u64, b: u64) -> u64

rounds up; b != 0

pub align_up :: fn(x: u64, align: u64) -> u64

align must be a power of two

pub align_down :: fn(x: u64, align: u64) -> u64

align must be a power of two

pub log2_floor :: fn(x: u64) -> u32

floor(log2(x)); 0 for 0

pub next_power_of_two :: fn(x: u64) -> ?u64

smallest power of two >= x (1 for 0); null past 2^63

pub mod_floor :: fn(a: i64, b: i64) -> i64

remainder with the sign of b: mod_floor(-7, 3) == 2; b != 0