HyCodeYourTale
classpublicPriority 3

MortonCode

com.hypixel.hytale.component.spatial.MortonCode

1

Methods

1

Public Methods

0

Fields

1

Constructors

Constants

intBITS_PER_AXIS= 21
longMAX_COORD= 2097151L

Constructors

public
MortonCode()

Methods

Public Methods (1)

publicstatic
long encode(double x, double y, double z, double minX, double minY, double minZ, double maxX, double maxY, double maxZ)

Source Code

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;
      return (value | value << 2) & 1317624576693539401L;
   }
}