SquirrelHash class

Пакет: com.hypixel.hytale.procedurallib.logic.cell

Файл: com/hypixel/hytale/procedurallib/logic/cell/HexCellDistanceFunction.java

Поля (5)

МодификаторыТипИмя
protected static final int BIT_NOISE1
protected static final int BIT_NOISE2
protected static final int BIT_NOISE3
protected static final int HASH0
int var3

Методы (1)

МодификаторыВозвратСигнатура
public static int hashpublic static int hash(int var0, int var1, int var2)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.procedurallib.logic.cell;

class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.procedurallib.logic.CellularNoise;
class="kw">import com.hypixel.hytale.procedurallib.logic.DoubleArray;
class="kw">import com.hypixel.hytale.procedurallib.logic.ResultBuffer;
class="kw">import com.hypixel.hytale.procedurallib.logic.cell.evaluator.PointEvaluator;
class="kw">import com.hypixel.hytale.procedurallib.logic.cell.jitter.CellJitter;
class="kw">import com.hypixel.hytale.procedurallib.logic.point.PointConsumer;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;

class="kw">public class HexCellDistanceFunction class="kw">implements CellDistanceFunction {
   class="kw">public class="kw">static class="kw">final HexCellDistanceFunction DISTANCE_FUNCTION = new HexCellDistanceFunction();
   class="kw">public class="kw">static class="kw">final CellPointFunction POINT_FUNCTION = new CellPointFunction() {
      @Override
      class="kw">public double scale(double var1) {
         class="kw">return var1 * HexCellDistanceFunction.SCALE;
      }

      @Override
      class="kw">public double normalize(double var1) {
         class="kw">return var1 * 0.3333333333333333;
      }

      @Override
      class="kw">public int getHash(int var1, int var2, int var3) {
         class="kw">return HexCellDistanceFunction.getHash(var1, var2, var3);
      }

      @Override
      class="kw">public double getX(double var1, double var3) {
         class="kw">return HexCellDistanceFunction.toHexX(var1, var3);
      }

      @Override
      class="kw">public double getY(double var1, double var3) {
         class="kw">return HexCellDistanceFunction.toHexY(var1, var3);
      }

      @Override
      class="kw">public DoubleArray.Double2 getOffsets(int var1) {
         class="kw">return HexCellDistanceFunction.HEX_CELL_2D[var1 & 0xFF];
      }
   };
   class="kw">protected class="kw">static class="kw">final double X_TO_GRID_X = Math.sqrt(3.0) / 3.0;
   class="kw">protected class="kw">static class="kw">final double Y_TO_GRID_X = -0.3333333333333333;
   class="kw">protected class="kw">static class="kw">final double Y_TO_GRID_Y = 0.6666666666666666;
   class="kw">protected class="kw">static class="kw">final double X_TO_HEX_X = Math.sqrt(3.0);
   class="kw">protected class="kw">static class="kw">final double Y_TO_HEX_X = Math.sqrt(3.0) / 2.0;
   class="kw">protected class="kw">static class="kw">final double Y_TO_HEX_Y = 1.5;
   class="kw">protected class="kw">static class="kw">final double NORMALIZATION = 0.3333333333333333;
   class="kw">protected class="kw">static class="kw">final double SCALE = (X_TO_HEX_X + 1.5) / 2.0;
   class="kw">public class="kw">static class="kw">final DoubleArray.Double2[] HEX_CELL_2D = Stream.of(CellularNoise.CELL_2D)
      .map(var0 -> new DoubleArray.Double2(var0.x - 0.5, var0.y - 0.5))
      .toArray(DoubleArray.Double2[]::new);

   class="kw">public HexCellDistanceFunction() {
   }

   @Override
   class="kw">public double scale(double var1) {
      class="kw">return var1 * SCALE;
   }

   @Override
   class="kw">public double invScale(double var1) {
      class="kw">return var1 / SCALE;
   }

   @Override
   class="kw">public int getCellX(double var1, double var3) {
      class="kw">return toGridX(var1, var3);
   }

   @Override
   class="kw">public int getCellY(double var1, double var3) {
      class="kw">return toGridY(var1, var3);
   }

   @Override
   class="kw">public void nearest2D(int var1, double var2, double var4, int var6, int var7, @Nonnull ResultBuffer.ResultBuffer2d var8, @Nonnull PointEvaluator var9) {
      this.evalPoint(var1, var2, var4, var6 - 1, var7 - 1, var8, var9);
      this.evalPoint(var1, var2, var4, var6 + 0, var7 - 1, var8, var9);
      this.evalPoint(var1, var2, var4, var6 + 1, var7 - 1, var8, var9);
      this.evalPoint(var1, var2, var4, var6 - 1, var7 + 0, var8, var9);
      this.evalPoint(var1, var2, var4, var6 + 0, var7 + 0, var8, var9);
      this.evalPoint(var1, var2, var4, var6 + 1, var7 + 0, var8, var9);
      this.evalPoint(var1, var2, var4, var6 - 1, var7 + 1, var8, var9);
      this.evalPoint(var1, var2, var4, var6 + 0, var7 + 1, var8, var9);
      this.evalPoint(var1, var2, var4, var6 + 1, var7 + 1, var8, var9);
      var8.distance *= 0.3333333333333333;
   }

   @Override
   class="kw">public void nearest3D(
      int var1, double var2, double var4, double var6, int var8, int var9, int var10, ResultBuffer.ResultBuffer3d var11, PointEvaluator var12
   ) {
      throw new UnsupportedOperationException();
   }

   @Override
   class="kw">public void transition2D(int var1, double var2, double var4, int var6, int var7, @Nonnull ResultBuffer.ResultBuffer2d var8, @Nonnull PointEvaluator var9) {
      this.evalPoint2(var1, var2, var4, var6 - 1, var7 - 1, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 + 0, var7 - 1, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 + 1, var7 - 1, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 - 1, var7 + 0, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 + 0, var7 + 0, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 + 1, var7 + 0, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 - 1, var7 + 1, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 + 0, var7 + 1, var8, var9);
      this.evalPoint2(var1, var2, var4, var6 + 1, var7 + 1, var8, var9);
      CellJitter var10 = var9.getJitter();
      if (var10.getMaxX() > 0.5) {
         this.evalPoint2(var1, var2, var4, var6 - 2, var7 - 1, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 - 2, var7 + 0, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 - 2, var7 + 1, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 + 2, var7 + 0, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 + 2, var7 - 1, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 + 2, var7 + 1, var8, var9);
      }

      if (var10.getMaxY() > 0.5) {
         this.evalPoint2(var1, var2, var4, var6 - 1, var7 - 2, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 + 0, var7 - 2, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 + 1, var7 - 2, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 - 1, var7 + 2, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 + 0, var7 + 2, var8, var9);
         this.evalPoint2(var1, var2, var4, var6 + 1, var7 + 2, var8, var9);
      }

      var8.distance *= 0.3333333333333333;
      var8.distance2 *= 0.3333333333333333;
   }

   @Override
   class="kw">public void transition3D(
      int var1, double var2, double var4, double var6, int var8, int var9, int var10, ResultBuffer.ResultBuffer3d var11, PointEvaluator var12
   ) {
      throw new UnsupportedOperationException();
   }

   @Override
   class="kw">public void evalPoint(int var1, double var2, double var4, int var6, int var7, ResultBuffer.ResultBuffer2d var8, @Nonnull PointEvaluator var9) {
      int var10 = getHash(var1, var6, var7);
      DoubleArray.Double2 var11 = HEX_CELL_2D[var10 & 0xFF];
      CellJitter var12 = var9.getJitter();
      double var13 = var12.getPointX(var6, var11);
      double var15 = var12.getPointY(var7, var11);
      double var17 = toHexX(var13, var15);
      double var19 = toHexY(var13, var15);
      var9.evalPoint(var1, var2, var4, var10, var6, var7, var17, var19, var8);
   }

   @Override
   class="kw">public void evalPoint(
      int var1, double var2, double var4, double var6, int var8, int var9, int var10, ResultBuffer.ResultBuffer3d var11, PointEvaluator var12
   ) {
      throw new UnsupportedOperationException();
   }

   @Override
   class="kw">public void evalPoint2(int var1, double var2, double var4, int var6, int var7, ResultBuffer.ResultBuffer2d var8, @Nonnull PointEvaluator var9) {
      int var10 = getHash(var1, var6, var7);
      DoubleArray.Double2 var11 = HEX_CELL_2D[var10 & 0xFF];
      CellJitter var12 = var9.getJitter();
      double var13 = var12.getPointX(var6, var11);
      double var15 = var12.getPointY(var7, var11);
      double var17 = toHexX(var13, var15);
      double var19 = toHexY(var13, var15);
      var9.evalPoint2(var1, var2, var4, var10, var6, var7, var17, var19, var8);
   }

   @Override
   class="kw">public void evalPoint2(
      int var1, double var2, double var4, double var6, int var8, int var9, int var10, ResultBuffer.ResultBuffer3d var11, PointEvaluator var12
   ) {
      throw new UnsupportedOperationException();
   }

   @Override
   class="kw">public <T> void collect(
      int var1,
      int var2,
      int var3,
      int var4,
      int var5,
      int var6,
      @Nonnull ResultBuffer.Bounds2d var7,
      T var8,
      @Nonnull PointConsumer<T> var9,
      @Nonnull PointEvaluator var10
   ) {
      var3--;
      var4--;
      var5++;
      var6++;
      int var11 = var6 - var4;
      int var12 = var5 - var3 + (var11 >> 1);
      CellJitter var13 = var10.getJitter();

      for (int var14 = 0; var14 <= var11; var14++) {
         int var15 = var4 + var14;
         int var16 = var3 - (var14 >> 1);

         for (int var17 = 0; var17 <= var12; var17++) {
            int var18 = var16 + var17;
            int var19 = getHash(var2, var18, var15);
            DoubleArray.Double2 var20 = HEX_CELL_2D[var19 & 0xFF];
            double var21 = var13.getPointX(var18, var20);
            double var23 = var13.getPointY(var15, var20);
            double var25 = toHexX(var21, var23);
            double var27 = toHexY(var21, var23);
            if (var7.contains(var25, var27)) {
               var25 /= SCALE;
               var27 /= SCALE;
               var10.collectPoint(var19, var18, var15, var25, var27, var8, var9);
            }
         }
      }
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "HexCellDistanceFunction{}";
   }

   class="kw">public class="kw">static int getHash(int var0, int var1, int var2) {
      class="kw">return HexCellDistanceFunction.SquirrelHash.hash(var0, var1, var2);
   }

   class="kw">public class="kw">static int toGridX(double var0, double var2) {
      class="kw">return (int)MathUtil.fastRound(X_TO_GRID_X * var0 + -0.3333333333333333 * var2);
   }

   class="kw">public class="kw">static int toGridY(double var0, double var2) {
      class="kw">return (int)MathUtil.fastRound(0.6666666666666666 * var2);
   }

   class="kw">public class="kw">static double toHexX(double var0, double var2) {
      class="kw">return X_TO_HEX_X * var0 + Y_TO_HEX_X * var2;
   }

   class="kw">public class="kw">static double toHexY(double var0, double var2) {
      class="kw">return 1.5 * var2;
   }

   class="kw">public class="kw">static class SquirrelHash {
      class="kw">protected class="kw">static class="kw">final int HASH0 = 198491317;
      class="kw">protected class="kw">static class="kw">final int BIT_NOISE1 = -1255572915;
      class="kw">protected class="kw">static class="kw">final int BIT_NOISE2 = -1255572915;
      class="kw">protected class="kw">static class="kw">final int BIT_NOISE3 = -1255572915;

      class="kw">public SquirrelHash() {
      }

      class="kw">public class="kw">static int hash(int var0, int var1, int var2) {
         int var3 = var1 + var2 * 198491317;
         var3 *= -1255572915;
         var3 += var0;
         var3 ^= var3 >> 8;
         var3 -= 1255572915;
         var3 ^= var3 << 8;
         var3 *= -1255572915;
         class="kw">return var3 ^ var3 >> 8;
      }
   }
}