sparkl2d_core/utils/
morton2.rs1pub fn morton_encode2(x: u32, y: u32) -> u64 {
2 let mut x = x as u64;
3 let mut y = y as u64;
4
5 x = (x | (x << 16)) & 0x0000FFFF0000FFFF;
6 x = (x | (x << 8)) & 0x00FF00FF00FF00FF;
7 x = (x | (x << 4)) & 0x0F0F0F0F0F0F0F0F;
8 x = (x | (x << 2)) & 0x3333333333333333;
9 x = (x | (x << 1)) & 0x5555555555555555;
10
11 y = (y | (y << 16)) & 0x0000FFFF0000FFFF;
12 y = (y | (y << 8)) & 0x00FF00FF00FF00FF;
13 y = (y | (y << 4)) & 0x0F0F0F0F0F0F0F0F;
14 y = (y | (y << 2)) & 0x3333333333333333;
15 y = (y | (y << 1)) & 0x5555555555555555;
16
17 x | (y << 1)
18}
19
20fn unpack(mut x: u64) -> u32 {
24 x = x & 0x5555555555555555;
25 x = (x | (x >> 1)) & 0x3333333333333333;
26 x = (x | (x >> 2)) & 0x0F0F0F0F0F0F0F0F;
27 x = (x | (x >> 4)) & 0x00FF00FF00FF00FF;
28 x = (x | (x >> 8)) & 0x0000FFFF0000FFFF;
29 x = (x | (x >> 16)) & 0xFFFFFFFFFFFFFFFF;
30 x as u32
31}
32
33pub fn morton_decode2(d: u64) -> [u32; 2] {
34 [unpack(d), unpack(d >> 1)]
35}