sqrtf :: #foreign (value: F32): F32 cosf :: #foreign (value: F32): F32 sinf :: #foreign (value: F32): F32 Vec2I :: struct;; x: S64; y: S64 Vec2 :: struct;; x: F32; y: F32 Vec3 :: struct;; x: F32; y: F32; z: F32 "+" :: (a: Vec3, b: Vec3): Vec3 return Vec3_Add(a,b) Vec3_Cross :: (a: Vec3, b: Vec3): Vec3 result := Vec3{ a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x, } return result Vec3_Normalize :: (a: Vec3): Vec3 length := Vec3_Length(a) result := Vec3{ a.x / length, a.y / length, a.z / length, } return result Vec3_Reflect :: (a: Vec3, normal: Vec3): Vec3 an := Vec3_Dot(a, normal)*2 result := Vec3_Sub(a, Vec3_MulF32(a, an)) return result Vec3_ConvertToARGB :: (a: Vec3): U32 a.x = F32_Clamp(0, a.x, 1) a.y = F32_Clamp(0, a.y, 1) a.z = F32_Clamp(0, a.z, 1) r := (a.x * 255)->U32 << 16 g := (a.y * 255)->U32 << 8 b := (a.z * 255)->U32 << 0 result := r | g | b return result Vec3_Length :: (a: Vec3): F32 ;; return sqrtf(a.x*a.x + a.y*a.y + a.z*a.z) Vec3_Negate :: (a: Vec3): Vec3 ;; return Vec3{-a.x, -a.y, -a.z} Vec3_Dot :: (a: Vec3, b: Vec3): F32 ;; return a.x*b.x + a.y*b.y + a.z*b.z Vec3_Mul :: (a: Vec3, b: Vec3): Vec3 ;; return Vec3{a.x*b.x, a.y*b.y, a.z*b.z} Vec3_MulF32 :: (a: Vec3, b: F32) : Vec3 ;; return Vec3{a.x*b, a.y*b, a.z*b} Vec3_Add :: (a: Vec3, b: Vec3): Vec3 ;; return Vec3{a.x+b.x, a.y+b.y, a.z+b.z} Vec3_Div :: (a: Vec3, b: Vec3): Vec3 ;; return Vec3{a.x/b.x, a.y/b.y, a.z/b.z} Vec3_Sub :: (a: Vec3, b: Vec3): Vec3 ;; return Vec3{a.x-b.x, a.y-b.y, a.z-b.z} F32_Clamp :: (min: F32, value: F32, max: F32): F32 if value > max;; return max if value < min;; return min return value F32_ClampBottom :: (min: F32, value: F32): F32 if value < min;; return min return value F32_Absolute :: (val: F32): F32 if val < 0;; return -val return val