use super::*;
pub fn min_int(a: i32, b: i32) -> i32 {
if a < b {
a
} else {
b
}
}
pub fn max_int(a: i32, b: i32) -> i32 {
if a > b {
a
} else {
b
}
}
pub fn clamp_int(a: i32, lower: i32, upper: i32) -> i32 {
if a < lower {
lower
} else if upper < a {
upper
} else {
a
}
}
pub fn abs_float(a: f32) -> f32 {
if a < 0.0 {
-a
} else {
a
}
}
pub fn min_float(a: f32, b: f32) -> f32 {
if a < b {
a
} else {
b
}
}
pub fn max_float(a: f32, b: f32) -> f32 {
if a > b {
a
} else {
b
}
}
pub fn clamp_float(a: f32, lower: f32, upper: f32) -> f32 {
if a < lower {
lower
} else if upper < a {
upper
} else {
a
}
}
pub fn lerp_float(a: f32, b: f32, alpha: f32) -> f32 {
(1.0 - alpha) * a + alpha * b
}
pub fn atan2(y: f32, x: f32) -> f32 {
if x == 0.0 && y == 0.0 {
return 0.0;
}
let ax = abs_float(x);
let ay = abs_float(y);
let mx = max_float(ay, ax);
let mn = min_float(ay, ax);
let a = mn / mx;
let s = a * a;
let c = s * a;
let q = s * s;
let mut r = 0.024840285 * q + 0.18681418;
let t = -0.094097948 * q - 0.33213072;
r = r * s + t;
r = r * c + a;
if ay > ax {
r = 1.57079637 - r;
}
if x < 0.0 {
r = 3.14159274 - r;
}
if y < 0.0 {
r = -r;
}
r
}
pub fn compute_cos_sin(radians: f32) -> CosSin {
let x = unwind_angle(radians);
let pi2 = PI * PI;
let c: f32 = if x < -0.5 * PI {
let y = x + PI;
let y2 = y * y;
-(pi2 - 4.0 * y2) / (pi2 + y2)
} else if x > 0.5 * PI {
let y = x - PI;
let y2 = y * y;
-(pi2 - 4.0 * y2) / (pi2 + y2)
} else {
let y2 = x * x;
(pi2 - 4.0 * y2) / (pi2 + y2)
};
let s: f32 = if x < 0.0 {
let y = x + PI;
-16.0 * y * (PI - y) / (5.0 * pi2 - 4.0 * y * (PI - y))
} else {
16.0 * x * (PI - x) / (5.0 * pi2 - 4.0 * x * (PI - x))
};
let mag = (s * s + c * c).sqrt();
let inv_mag = if mag > 0.0 { 1.0 / mag } else { 0.0 };
CosSin {
cosine: c * inv_mag,
sine: s * inv_mag,
}
}
pub fn sin(radians: f32) -> f32 {
let cs = compute_cos_sin(radians);
cs.sine
}
pub fn cos(radians: f32) -> f32 {
let cs = compute_cos_sin(radians);
cs.cosine
}
pub fn unwind_angle(radians: f32) -> f32 {
remainder_f32(radians, 2.0 * PI)
}
pub(crate) fn remainder_f32(x: f32, y: f32) -> f32 {
if y == 0.0 || x.is_infinite() || x.is_nan() || y.is_nan() {
return f32::NAN;
}
let q = (x as f64 / y as f64).round_ties_even();
(x as f64 - q * y as f64) as f32
}