BiomeDistanceStage class

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

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

implements: Stage

Поля (39)

МодификаторыТипИмя
final double ORIGIN_REACH
public int biomeId
BiomeDistanceStage.BiomeDistanceEntry cachedEntry
public double distance_voxelGrid
final List<BiomeDistanceStage.BiomeDistanceEntry> entries
public final List<BiomeDistanceStage.BiomeDistanceEntry> entries
return
return
CountedPixelBuffer var10
List var11
Bounds3i var12
Vector3i var13
double var14
var14
Integer var16
BufferBundle.Access.View var2
Vector3i var2
double var2
var2
PixelBufferView var3
Vector3i var3
BufferBundle.Access.View var4
BiomeDistanceStage.BiomeDistanceCounter var4
Vector3i var4
PixelBufferView var5
Vector3i var5
Vector3i var5
Bounds3i var6
Bounds3i var6
Bounds3i var6
Vector3i var6
BiomeDistanceStage.BiomeDistanceEntry var6
Bounds3i var7
Vector3i var7
Bounds3i var7
int var7
BiomeDistanceStage.BiomeDistanceEntries var8
double var8
var8

Методы (29)

МодификаторыВозвратСигнатура
BiomeDistanceCounter BiomeDistanceCounter()
public BiomeDistanceEntriespublic BiomeDistanceEntries(@Nonnull List<BiomeDistanceStage.BiomeDistanceEntry> var1)
public BiomeDistanceEntrypublic BiomeDistanceEntry()
void accountForvoid accountFor(int var1, double var2)
static boolean allBiomesAreCountedAndFartherboolean allBiomesAreCountedAndFarther(@Nonnull BiomeDistanceStage.BiomeDistanceCounter var0, @Nonnull List<Integer> var1, double var2)
static double distanceToBuffer_voxelGriddouble distanceToBuffer_voxelGrid(@Nonnull Vector3i var0, @Nonnull Vector3i var1)
public double distanceToClosestOtherBiomepublic double distanceToClosestOtherBiome(int var1)
for for(var7.x = var6.min.x; var7.x < var6.max.x; var7.x++)
for for(var7.z = var6.min.z; var7.z < var6.max.z; var7.z++)
for for(var5.x = var7.min.x; var5.x < var7.max.x; var5.x++)
for for(var5.z = var7.min.z; var5.z < var7.max.z; var5.z++)
for for(var13.x = var12.min.x; var13.x < var12.max.x; var13.x++)
for for(var13.z = var12.min.z; var13.z < var12.max.z; var13.z++)
for for(Integer var5 : var1)
for for(BiomeDistanceStage.BiomeDistanceEntry var5 : this.entries)
for for(BiomeDistanceStage.BiomeDistanceEntry var5 : this.entries)
for for(BiomeDistanceStage.BiomeDistanceEntry var5 : this.entries)
if if(var2.x == var1.x && var2.z == var1.z)
if if(var0.x >= var3.x && var0.x <= var3.x + var7)
if if(var0.z >= var3.z && var0.z <= var3.z + var7)
if if(var0.x < var3.x && var0.z < var3.z)
if if(var0.x < var4.x && var0.z > var4.z)
if if(var0.x > var5.x && var0.z < var5.z)
if if(var5.biomeId == var1)
if if(this.cachedEntry != null && this.cachedEntry.biomeId == var1)
if if(var5.biomeId == var1)
if if(var5.distance_voxelGrid <= var2)
if if(var5.biomeId != var1)
boolean isCloserThanCountedboolean isCloserThanCounted(int var1, double var2)

Исходный код

Показать/скрыть
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() {
      }
   }
}