sparkl2d_core/utils/
morton2.rs

1pub 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
20/*
21 * Decoding.
22 */
23fn 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}