package com.hypixel.hytale.component.spatial;
public class MortonCode {
private static final int BITS_PER_AXIS = 21;
private static final long MAX_COORD = 2097151L;
public MortonCode() {
}
public static long encode(double x, double y, double z, double minX, double minY, double minZ, double maxX, double maxY, double maxZ) {
double nx = (x - minX) / (maxX - minX);
double ny = (y - minY) / (maxY - minY);
double nz = (z - minZ) / (maxZ - minZ);
long ix = Math.min(Math.max((long)(nx * 2097151.0), 0L), 2097151L);
long iy = Math.min(Math.max((long)(ny * 2097151.0), 0L), 2097151L);
long iz = Math.min(Math.max((long)(nz * 2097151.0), 0L), 2097151L);
return interleaveBits(ix, iy, iz);
}
private static long interleaveBits(long x, long y, long z) {
x = expandBits(x);
y = expandBits(y);
z = expandBits(z);
return x | y << 1 | z << 2;
}
private static long expandBits(long value) {
value &= 2097151L;
value = (value | value << 32) & 8725724278095871L;
value = (value | value << 16) & 8725728556220671L;
value = (value | value << 8) & 1157144660301377551L;
value = (value | value << 4) & 75488908039734028L;
value = (value | value << 2) & 1317624576693539401L;
return value;
}
}