Cogs.Core
MortonCode.h
1#pragma once
2#include <cstdint>
3
4namespace Cogs
5{
6 // Morton Code, aka. Z-order curve:
7 // https://en.wikipedia.org/wiki/Z-order_curve
8
10 constexpr uint64_t mortonCode(uint16_t i, uint16_t j, uint16_t k)
11 {
12 uint64_t I, J, K; // 40 32 24 16 8 0
13 I = i; // -------- -------- -------- -------- FEDCBA98 76543210
14 J = j;
15 K = k;
16 I = (I << 16 | I) & 0x0000ff0000ff; // -------- -------- FEDCBA98 -------- -------- 76543210
17 J = (J << 16 | J) & 0x0000ff0000ff;
18 K = (K << 16 | K) & 0x0000ff0000ff;
19 I = (I << 8 | I) & 0x00f00f00f00f; // -------- FEDC---- ----BA98 -------- 7654---- ----3210
20 J = (J << 8 | J) & 0x00f00f00f00f;
21 K = (K << 8 | K) & 0x00f00f00f00f;
22 I = (I << 4 | I) & 0x0c30c30c30c3; // ----FE-- --DC---- BA----98 ----76-- --54---- 32----10
23 J = (J << 4 | J) & 0x0c30c30c30c3;
24 K = (K << 4 | K) & 0x0c30c30c30c3;
25 I = (I << 2 | I) & 0x024249249249; // --F--E-- D--C--B- -A--9--8 --7--6-- 5--4--3- -2--1--0
26 J = (J << 2 | J) & 0x024249249249;
27 K = (K << 2 | K) & 0x024249249249;
28 return K << 2 | J << 1 | I;
29 }
30
32 constexpr uint32_t mortonCode(uint16_t a, uint16_t b)
33 {
34 uint64_t res = a | (uint64_t(b) << 32);
35 res = (res | (res << 8)) & 0x00ff00ff00ff00ff;
36 res = (res | (res << 4)) & 0x0f0f0f0f0f0f0f0f;
37 res = (res | (res << 2)) & 0x3333333333333333;
38 res = (res | (res << 1)) & 0x5555555555555555;
39 return uint32_t(res | (res >> 31));
40 }
41}
Contains all Cogs related functionality.
Definition: FieldSetter.h:23
constexpr uint64_t mortonCode(uint16_t i, uint16_t j, uint16_t k)
Interleave bits of 3 values to form the 3-way Morton code.
Definition: MortonCode.h:10