BiomeDistanceEntries class

Пакет: com.hypixel.hytale.builtin.hytalegenerator.engine.stages

Файл: com/hypixel/hytale/builtin/hytalegenerator/engine/stages/BiomeDistanceStage.java

Поля (3)

МодификаторыТипИмя
public final List<BiomeDistanceStage.BiomeDistanceEntry> entries
double var2
var2

Методы (3)

МодификаторыВозвратСигнатура
public double distanceToClosestOtherBiomepublic double distanceToClosestOtherBiome(int var1)
for for(BiomeDistanceStage.BiomeDistanceEntry var5 : this.entries)
if if(var5.biomeId != var1)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.engine.stages;

class="kw">import com.hypixel.hytale.builtin.hytalegenerator.GridUtils;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.BufferBundle;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.CountedPixelBuffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.PixelBuffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.SimplePixelBuffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.type.BufferType;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.type.ParametrizedBufferType;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.views.PixelBufferView;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.math.Calculator;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;

class="kw">public class BiomeDistanceStage class="kw">implements Stage {
   class="kw">private class="kw">static class="kw">final double ORIGIN_REACH = 1.0;
   class="kw">private class="kw">static class="kw">final double BUFFER_DIAGONAL_VOXEL_GRID = Math.sqrt(PixelBuffer.SIZE.x * PixelBuffer.SIZE.x + PixelBuffer.SIZE.z * PixelBuffer.SIZE.z);
   class="kw">public class="kw">static class="kw">final double DEFAULT_DISTANCE_TO_BIOME_EDGE = Double.MAX_VALUE;
   @Nonnull
   class="kw">public class="kw">static class="kw">final Class<CountedPixelBuffer> biomeBufferClass = CountedPixelBuffer.class;
   @Nonnull
   class="kw">public class="kw">static class="kw">final Class<Integer> biomeClass = Integer.class;
   @Nonnull
   class="kw">public class="kw">static class="kw">final Class<SimplePixelBuffer> biomeDistanceBufferClass = SimplePixelBuffer.class;
   @Nonnull
   class="kw">public class="kw">static class="kw">final Class<BiomeDistanceStage.BiomeDistanceEntries> biomeDistanceClass = BiomeDistanceStage.BiomeDistanceEntries.class;
   @Nonnull
   class="kw">private class="kw">final ParametrizedBufferType biomeInputBufferType;
   @Nonnull
   class="kw">private class="kw">final ParametrizedBufferType biomeDistanceOutputBufferType;
   @Nonnull
   class="kw">private class="kw">final String stageName;
   class="kw">private class="kw">final double maxDistance_voxelGrid;
   class="kw">private class="kw">final int maxDistance_bufferGrid;
   @Nonnull
   class="kw">private class="kw">final Bounds3i inputBounds_bufferGrid;

   class="kw">public BiomeDistanceStage(@Nonnull String var1, @Nonnull ParametrizedBufferType var2, @Nonnull ParametrizedBufferType var3, double var4) {
      assert var4 >= 0.0;
      this.stageName = var1;
      this.biomeInputBufferType = var2;
      this.biomeDistanceOutputBufferType = var3;
      this.maxDistance_voxelGrid = var4;
      this.maxDistance_bufferGrid = GridUtils.toBufferDistanceInclusive_fromVoxelDistance((int)Math.ceil(var4));
      Bounds3i var6 = GridUtils.createBounds_fromRadius_originVoxelInclusive((int)Math.ceil(var4));
      Bounds3i var7 = GridUtils.createColumnBounds_voxelGrid(new Vector3i(), 0, 1);
      var6.stack(var7);
      this.inputBounds_bufferGrid = GridUtils.createBufferBoundsInclusive_fromVoxelBounds(var6);
      GridUtils.setBoundsYToWorldHeight_bufferGrid(this.inputBounds_bufferGrid);
   }

   @Override
   class="kw">public void run(@Nonnull Stage.Context var1) {
      BufferBundle.Access.View var2 = var1.bufferAccess.get(this.biomeInputBufferType);
      PixelBufferView var3 = new PixelBufferView<>(var2, biomeClass);
      BufferBundle.Access.View var4 = var1.bufferAccess.get(this.biomeDistanceOutputBufferType);
      PixelBufferView var5 = new PixelBufferView<>(var4, biomeDistanceClass);
      Bounds3i var6 = var5.getBounds();
      Vector3i var7 = new Vector3i();

      for (var7.x = var6.min.x; var7.x < var6.max.x; var7.x++) {
         for (var7.z = var6.min.z; var7.z < var6.max.z; var7.z++) {
            BiomeDistanceStage.BiomeDistanceEntries var8 = this.createDistanceTracker(var2, var3, var7);
            var5.set(var8, var7);
         }
      }
   }

   @Nonnull
   class="kw">private BiomeDistanceStage.BiomeDistanceEntries createDistanceTracker(
      @Nonnull BufferBundle.Access.View var1, @Nonnull PixelBufferView<Integer> var2, @Nonnull Vector3i var3
   ) {
      BiomeDistanceStage.BiomeDistanceCounter var4 = new BiomeDistanceStage.BiomeDistanceCounter();
      Vector3i var5 = new Vector3i();
      Bounds3i var6 = GridUtils.createBounds_fromRadius_originVoxelInclusive((int)Math.ceil(this.maxDistance_voxelGrid));
      var6.offset(var3);
      Bounds3i var7 = GridUtils.createBufferBoundsInclusive_fromVoxelBounds(var6);

      for (var5.x = var7.min.x; var5.x < var7.max.x; var5.x++) {
         for (var5.z = var7.min.z; var5.z < var7.max.z; var5.z++) {
            double var8 = distanceToBuffer_voxelGrid(var3, var5);
            var8 = Math.max(var8 - 1.0, 0.0);
            if (!(var8 > this.maxDistance_voxelGrid)) {
               CountedPixelBuffer var10 = (CountedPixelBuffer<Integer>)var1.getBuffer(var5).buffer();
               List var11 = var10.getUniqueEntries();
               assert !var11.isEmpty();
               if (!allBiomesAreCountedAndFarther(var4, var11, var8)) {
                  if (var11.size() == 1) {
                     if (!(var8 > this.maxDistance_voxelGrid)) {
                        var4.accountFor(var11.getFirst(), var8);
                     }
                  } else {
                     Bounds3i var12 = GridUtils.createColumnBounds_voxelGrid(var5, 0, 1);
                     Vector3i var13 = new Vector3i();

                     for (var13.x = var12.min.x; var13.x < var12.max.x; var13.x++) {
                        for (var13.z = var12.min.z; var13.z < var12.max.z; var13.z++) {
                           double var14 = Calculator.distance(var13.x, var13.z, var3.x, var3.z);
                           var14 = Math.max(var14 - 1.0, 0.0);
                           if (!(var14 > this.maxDistance_voxelGrid)) {
                              Integer var16 = var2.get(var13);
                              assert var16 != null;
                              var4.accountFor(var16, var14);
                           }
                        }
                     }
                  }
               }
            }
         }
      }

      class="kw">return new BiomeDistanceStage.BiomeDistanceEntries(var4.entries);
   }

   @Nonnull
   @Override
   class="kw">public Map<BufferType, Bounds3i> getInputTypesAndBounds_bufferGrid() {
      class="kw">return Map.of(this.biomeInputBufferType, this.inputBounds_bufferGrid);
   }

   @Nonnull
   @Override
   class="kw">public List<BufferType> getOutputTypes() {
      class="kw">return List.of(this.biomeDistanceOutputBufferType);
   }

   @Nonnull
   @Override
   class="kw">public String getName() {
      class="kw">return this.stageName;
   }

   class="kw">public class="kw">static double distanceToBuffer_voxelGrid(@Nonnull Vector3i var0, @Nonnull Vector3i var1) {
      assert var0.y == 0.0;
      assert var1.y == 0.0;
      Vector3i var2 = new Vector3i(var0);
      GridUtils.toBufferGrid_fromVoxelGrid(var2);
      if (var2.x == var1.x && var2.z == var1.z) {
         class="kw">return 0.0;
      }

      int var7 = CountedPixelBuffer.SIZE_VOXEL_GRID.x - 1;
      Vector3i var3 = new Vector3i(var1);
      GridUtils.toVoxelGrid_fromBufferGrid(var3);
      Vector3i var4 = new Vector3i(var3);
      var4.z += var7;
      if (var0.x >= var3.x && var0.x <= var3.x + var7) {
         class="kw">return Math.min(Math.abs(var0.z - var3.z), Math.abs(var0.z - var4.z));
      }

      Vector3i var5 = new Vector3i(var3);
      var5.x += var7;
      if (var0.z >= var3.z && var0.z <= var3.z + var7) {
         class="kw">return Math.min(Math.abs(var0.x - var3.x), Math.abs(var0.x - var5.x));
      }

      if (var0.x < var3.x && var0.z < var3.z) {
         class="kw">return var0.distance(var3);
      }

      if (var0.x < var4.x && var0.z > var4.z) {
         class="kw">return var0.distance(var4);
      }

      if (var0.x > var5.x && var0.z < var5.z) {
         class="kw">return var0.distance(var5);
      }

      Vector3i var6 = new Vector3i(var5.x, 0, var4.z);
      class="kw">return var0.distance(var6);
   }

   class="kw">private class="kw">static boolean allBiomesAreCountedAndFarther(@Nonnull BiomeDistanceStage.BiomeDistanceCounter var0, @Nonnull List<Integer> var1, double var2) {
      for (Integer var5 : var1) {
         if (var0.isCloserThanCounted(var5, var2)) {
            class="kw">return false;
         }
      }

      class="kw">return true;
   }

   class="kw">private class="kw">static class BiomeDistanceCounter {
      @Nonnull
      class="kw">final List<BiomeDistanceStage.BiomeDistanceEntry> entries = new ArrayList<>(3);
      @Nullable
      BiomeDistanceStage.BiomeDistanceEntry cachedEntry = null;

      BiomeDistanceCounter() {
      }

      boolean isCloserThanCounted(int var1, double var2) {
         for (BiomeDistanceStage.BiomeDistanceEntry var5 : this.entries) {
            if (var5.biomeId == var1) {
               class="kw">return var2 < var5.distance_voxelGrid;
            }
         }

         class="kw">return true;
      }

      void accountFor(int var1, double var2) {
         if (this.cachedEntry != null && this.cachedEntry.biomeId == var1) {
            if (!(this.cachedEntry.distance_voxelGrid <= var2)) {
               this.cachedEntry.distance_voxelGrid = var2;
            }
         } else {
            for (BiomeDistanceStage.BiomeDistanceEntry var5 : this.entries) {
               if (var5.biomeId == var1) {
                  this.cachedEntry = var5;
                  if (var5.distance_voxelGrid <= var2) {
                     class="kw">return;
                  }

                  var5.distance_voxelGrid = var2;
                  class="kw">return;
               }
            }

            BiomeDistanceStage.BiomeDistanceEntry var6 = new BiomeDistanceStage.BiomeDistanceEntry();
            var6.biomeId = var1;
            var6.distance_voxelGrid = var2;
            this.entries.add(var6);
            this.cachedEntry = var6;
         }
      }
   }

   class="kw">public class="kw">static class BiomeDistanceEntries {
      @Nonnull
      class="kw">public class="kw">final List<BiomeDistanceStage.BiomeDistanceEntry> entries;

      class="kw">public BiomeDistanceEntries(@Nonnull List<BiomeDistanceStage.BiomeDistanceEntry> var1) {
         this.entries = var1;
      }

      class="kw">public double distanceToClosestOtherBiome(int var1) {
         double var2 = Double.MAX_VALUE;

         for (BiomeDistanceStage.BiomeDistanceEntry var5 : this.entries) {
            if (var5.biomeId != var1) {
               var2 = Math.min(var2, var5.distance_voxelGrid);
            }
         }

         class="kw">return var2;
      }
   }

   class="kw">public class="kw">static class BiomeDistanceEntry {
      class="kw">public int biomeId;
      class="kw">public double distance_voxelGrid;

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