use super::*;
#[must_use]
#[inline]
#[allow(clippy::excessive_precision)]
pub fn sh_eval_l2(dir: Vec3) -> [f32; 9] {
let x = dir.x;
let y = dir.y;
let z = dir.z;
[
0.282094792, 0.488602512 * y, 0.488602512 * z, 0.488602512 * x, 1.092548431 * x * y, 1.092548431 * y * z, 0.315391565 * (3.0 * z * z - 1.0), 1.092548431 * x * z, 0.546274215 * (x * x - y * y), ]
}
#[must_use]
pub fn sh_project_l2(samples: &[(Vec3, f32)]) -> [f32; 9] {
let mut coeffs = [0.0f32; 9];
let weight = 4.0 * std::f32::consts::PI / samples.len() as f32;
for &(dir, val) in samples {
let basis = sh_eval_l2(dir);
for i in 0..9 {
coeffs[i] += val * basis[i] * weight;
}
}
coeffs
}
#[must_use]
#[inline]
pub fn sh_evaluate_l2(coeffs: &[f32; 9], dir: Vec3) -> f32 {
let basis = sh_eval_l2(dir);
let mut sum = 0.0;
for i in 0..9 {
sum += coeffs[i] * basis[i];
}
sum
}