float3 :: struct {
    v: [3]float;
}

float16 :: struct {
    v: [16]float;
}

Clamp :: proc(value: float, min: float, max: float): float; @api
Lerp :: proc(start: float, end: float, amount: float): float; @api
Normalize :: proc(value: float, start: float, end: float): float; @api
Remap :: proc(value: float, inputStart: float, inputEnd: float, outputStart: float, outputEnd: float): float; @api
Wrap :: proc(value: float, min: float, max: float): float; @api
FloatEquals :: proc(x: float, y: float): int; @api
Vector2Zero :: proc(): Vector2; @api
Vector2One :: proc(): Vector2; @api
Vector2Add :: proc(v1: Vector2, v2: Vector2): Vector2; @api
Vector2AddValue :: proc(v: Vector2, add: float): Vector2; @api
Vector2Subtract :: proc(v1: Vector2, v2: Vector2): Vector2; @api
Vector2SubtractValue :: proc(v: Vector2, sub: float): Vector2; @api
Vector2Length :: proc(v: Vector2): float; @api
Vector2LengthSqr :: proc(v: Vector2): float; @api
Vector2DotProduct :: proc(v1: Vector2, v2: Vector2): float; @api
Vector2Distance :: proc(v1: Vector2, v2: Vector2): float; @api
Vector2DistanceSqr :: proc(v1: Vector2, v2: Vector2): float; @api
Vector2Angle :: proc(v1: Vector2, v2: Vector2): float; @api
Vector2LineAngle :: proc(start: Vector2, end: Vector2): float; @api
Vector2Scale :: proc(v: Vector2, scale: float): Vector2; @api
Vector2Multiply :: proc(v1: Vector2, v2: Vector2): Vector2; @api
Vector2Negate :: proc(v: Vector2): Vector2; @api
Vector2Divide :: proc(v1: Vector2, v2: Vector2): Vector2; @api
Vector2Normalize :: proc(v: Vector2): Vector2; @api
Vector2Transform :: proc(v: Vector2, mat: Matrix): Vector2; @api
Vector2Lerp :: proc(v1: Vector2, v2: Vector2, amount: float): Vector2; @api
Vector2Reflect :: proc(v: Vector2, normal: Vector2): Vector2; @api
Vector2Rotate :: proc(v: Vector2, angle: float): Vector2; @api
Vector2MoveTowards :: proc(v: Vector2, target: Vector2, maxDistance: float): Vector2; @api
Vector2Invert :: proc(v: Vector2): Vector2; @api
Vector2Clamp :: proc(v: Vector2, min: Vector2, max: Vector2): Vector2; @api
Vector2ClampValue :: proc(v: Vector2, min: float, max: float): Vector2; @api
Vector2Equals :: proc(p: Vector2, q: Vector2): int; @api
Vector3Zero :: proc(): Vector3; @api
Vector3One :: proc(): Vector3; @api
Vector3Add :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3AddValue :: proc(v: Vector3, add: float): Vector3; @api
Vector3Subtract :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3SubtractValue :: proc(v: Vector3, sub: float): Vector3; @api
Vector3Scale :: proc(v: Vector3, scalar: float): Vector3; @api
Vector3Multiply :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3CrossProduct :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3Perpendicular :: proc(v: Vector3): Vector3; @api
Vector3Length :: proc(v: Vector3): float; @api
Vector3LengthSqr :: proc(v: Vector3): float; @api
Vector3DotProduct :: proc(v1: Vector3, v2: Vector3): float; @api
Vector3Distance :: proc(v1: Vector3, v2: Vector3): float; @api
Vector3DistanceSqr :: proc(v1: Vector3, v2: Vector3): float; @api
Vector3Angle :: proc(v1: Vector3, v2: Vector3): float; @api
Vector3Negate :: proc(v: Vector3): Vector3; @api
Vector3Divide :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3Normalize :: proc(v: Vector3): Vector3; @api
Vector3Project :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3Reject :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3OrthoNormalize :: proc(v1: *Vector3, v2: *Vector3); @api
Vector3Transform :: proc(v: Vector3, mat: Matrix): Vector3; @api
Vector3RotateByQuaternion :: proc(v: Vector3, q: Quaternion): Vector3; @api
Vector3RotateByAxisAngle :: proc(v: Vector3, axis: Vector3, angle: float): Vector3; @api
Vector3Lerp :: proc(v1: Vector3, v2: Vector3, amount: float): Vector3; @api
Vector3Reflect :: proc(v: Vector3, normal: Vector3): Vector3; @api
Vector3Min :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3Max :: proc(v1: Vector3, v2: Vector3): Vector3; @api
Vector3Barycenter :: proc(p: Vector3, a: Vector3, b: Vector3, c: Vector3): Vector3; @api
Vector3Unproject :: proc(source: Vector3, projection: Matrix, view: Matrix): Vector3; @api
Vector3ToFloatV :: proc(v: Vector3): float3; @api
Vector3Invert :: proc(v: Vector3): Vector3; @api
Vector3Clamp :: proc(v: Vector3, min: Vector3, max: Vector3): Vector3; @api
Vector3ClampValue :: proc(v: Vector3, min: float, max: float): Vector3; @api
Vector3Equals :: proc(p: Vector3, q: Vector3): int; @api
Vector3Refract :: proc(v: Vector3, n: Vector3, r: float): Vector3; @api
MatrixDeterminant :: proc(mat: Matrix): float; @api
MatrixTrace :: proc(mat: Matrix): float; @api
MatrixTranspose :: proc(mat: Matrix): Matrix; @api
MatrixInvert :: proc(mat: Matrix): Matrix; @api
MatrixIdentity :: proc(): Matrix; @api
MatrixAdd :: proc(left: Matrix, right: Matrix): Matrix; @api
MatrixSubtract :: proc(left: Matrix, right: Matrix): Matrix; @api
MatrixMultiply :: proc(left: Matrix, right: Matrix): Matrix; @api
MatrixTranslate :: proc(x: float, y: float, z: float): Matrix; @api
MatrixRotate :: proc(axis: Vector3, angle: float): Matrix; @api
MatrixRotateX :: proc(angle: float): Matrix; @api
MatrixRotateY :: proc(angle: float): Matrix; @api
MatrixRotateZ :: proc(angle: float): Matrix; @api
MatrixRotateXYZ :: proc(angle: Vector3): Matrix; @api
MatrixRotateZYX :: proc(angle: Vector3): Matrix; @api
MatrixScale :: proc(x: float, y: float, z: float): Matrix; @api
MatrixFrustum :: proc(left: double, right: double, bottom: double, top: double, near: double, far: double): Matrix; @api
MatrixPerspective :: proc(fovY: double, aspect: double, nearPlane: double, farPlane: double): Matrix; @api
MatrixOrtho :: proc(left: double, right: double, bottom: double, top: double, nearPlane: double, farPlane: double): Matrix; @api
MatrixLookAt :: proc(eye: Vector3, target: Vector3, up: Vector3): Matrix; @api
MatrixToFloatV :: proc(mat: Matrix): float16; @api
QuaternionAdd :: proc(q1: Quaternion, q2: Quaternion): Quaternion; @api
QuaternionAddValue :: proc(q: Quaternion, add: float): Quaternion; @api
QuaternionSubtract :: proc(q1: Quaternion, q2: Quaternion): Quaternion; @api
QuaternionSubtractValue :: proc(q: Quaternion, sub: float): Quaternion; @api
QuaternionIdentity :: proc(): Quaternion; @api
QuaternionLength :: proc(q: Quaternion): float; @api
QuaternionNormalize :: proc(q: Quaternion): Quaternion; @api
QuaternionInvert :: proc(q: Quaternion): Quaternion; @api
QuaternionMultiply :: proc(q1: Quaternion, q2: Quaternion): Quaternion; @api
QuaternionScale :: proc(q: Quaternion, mul: float): Quaternion; @api
QuaternionDivide :: proc(q1: Quaternion, q2: Quaternion): Quaternion; @api
QuaternionLerp :: proc(q1: Quaternion, q2: Quaternion, amount: float): Quaternion; @api
QuaternionNlerp :: proc(q1: Quaternion, q2: Quaternion, amount: float): Quaternion; @api
QuaternionSlerp :: proc(q1: Quaternion, q2: Quaternion, amount: float): Quaternion; @api
QuaternionFromVector3ToVector3 :: proc(from: Vector3, to: Vector3): Quaternion; @api
QuaternionFromMatrix :: proc(mat: Matrix): Quaternion; @api
QuaternionToMatrix :: proc(q: Quaternion): Matrix; @api
QuaternionFromAxisAngle :: proc(axis: Vector3, angle: float): Quaternion; @api
QuaternionToAxisAngle :: proc(q: Quaternion, outAxis: *Vector3, outAngle: *float); @api
QuaternionFromEuler :: proc(pitch: float, yaw: float, roll: float): Quaternion; @api
QuaternionToEuler :: proc(q: Quaternion): Vector3; @api
QuaternionTransform :: proc(q: Quaternion, mat: Matrix): Quaternion; @api
QuaternionEquals :: proc(p: Quaternion, q: Quaternion): int; @api
