// 
// Decompiled by Procyon v0.6.0
// 

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 static long encode(final double x, final double y, final double z, final double minX, final double minY, final double minZ, final double maxX, final double maxY, final double maxZ) {
        final double nx = (x - minX) / (maxX - minX);
        final double ny = (y - minY) / (maxY - minY);
        final double nz = (z - minZ) / (maxZ - minZ);
        final long ix = Math.min(Math.max((long)(nx * 2097151.0), 0L), 2097151L);
        final long iy = Math.min(Math.max((long)(ny * 2097151.0), 0L), 2097151L);
        final 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 &= 0x1FFFFFL;
        value = ((value | value << 32) & 0x1F00000000FFFFL);
        value = ((value | value << 16) & 0x1F0000FF0000FFL);
        value = ((value | value << 8) & 0x100F00F00F00F00FL);
        value = ((value | value << 4) & 0x10C30C30C30C30CL);
        value = ((value | value << 2) & 0x1249249249249249L);
        return value;
    }
}
