#[inline]
pub fn perlin_grad(hash: i32, x: f32, y: f32, z: f32) -> f32 {
const KPERLINGRAD: [[f32; 3]; 16] = [
[1.0, 1.0, 0.0],
[-1.0, 1.0, 0.0],
[1.0, -1.0, 0.0],
[-1.0, -1.0, 0.0],
[1.0, 0.0, 1.0],
[-1.0, 0.0, 1.0],
[1.0, 0.0, -1.0],
[-1.0, 0.0, -1.0],
[0.0, 1.0, 1.0],
[0.0, -1.0, 1.0],
[0.0, 1.0, -1.0],
[0.0, -1.0, -1.0],
[1.0, 1.0, 0.0],
[0.0, -1.0, 1.0],
[-1.0, 1.0, 0.0],
[0.0, -1.0, -1.0],
];
let g = KPERLINGRAD[(hash & 15) as usize];
g[0] * x + g[1] * y + g[2] * z
}