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 abs_int(a: i32) -> i32 {
if a < 0 {
-a
} else {
a
}
}
pub fn clamp_int(a: i32, lower: i32, upper: i32) -> i32 {
if a < lower {
lower
} else if a > upper {
upper
} else {
a
}
}
pub fn ceiling_int(numerator: i32, denominator: i32) -> i32 {
debug_assert!(denominator > 0 && numerator >= 0);
(numerator + denominator - 1) / denominator
}
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 abs_float(a: f32) -> f32 {
if a < 0.0 {
-a
} else {
a
}
}
pub fn clamp_float(a: f32, lower: f32, upper: f32) -> f32 {
if a < lower {
lower
} else if a > upper {
upper
} else {
a
}
}
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,
}
}