1use crate::math::Vector;
11
12#[inline]
13fn split_by_3_u64(a: u32) -> u64 {
14 let mut x = a as u64 & 0x1fffff; x = (x | x << 32) & 0x1f00000000ffff;
16 x = (x | x << 16) & 0x1f0000ff0000ff;
17 x = (x | x << 8) & 0x100f00f00f00f00f;
18 x = (x | x << 4) & 0x10c30c30c30c30c3;
19 x = (x | x << 2) & 0x1249249249249249;
20 x
21}
22
23#[inline]
24fn morton_encode_u64(x: u32, y: u32, z: u32) -> u64 {
27 split_by_3_u64(x) | split_by_3_u64(y) << 1 | split_by_3_u64(z) << 2
28}
29
30#[inline]
31pub fn morton_encode_u64_unorm(p: Vector) -> u64 {
34 #[cfg(feature = "dim2")]
35 #[cfg_attr(feature = "f64", expect(clippy::unnecessary_cast))]
36 let p = glamx::DVec2::new(p.x as f64, p.y as f64) * (1 << 21) as f64;
37 #[cfg(feature = "dim3")]
38 #[cfg_attr(feature = "f64", expect(clippy::unnecessary_cast))]
39 let p = glamx::DVec3::new(p.x as f64, p.y as f64, p.z as f64) * (1 << 21) as f64;
40
41 #[cfg(feature = "dim2")]
42 return morton_encode_u64(p.x as u32, p.y as u32, 0);
43 #[cfg(feature = "dim3")]
44 return morton_encode_u64(p.x as u32, p.y as u32, p.z as u32);
45}