TerrainStage class

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

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

implements: Stage

Поля (66)

МодификаторыТипИмя
final double DEFAULT_BACKGROUND_DENSITY
int arrayLength
int bottom
FloatContainer3d densityBuffer
int[] depthIntoCeiling
int[] depthIntoFloor
MaterialProvider<Material> materialProvider
int[] spaceAboveFloor
int[] spaceBelowCeiling
int top
int topExclusive
Map var1
Registry var10
BiomeWeights var10
Integer var10
boolean var10
boolean var11
var11
Biome var11
boolean var11
Biome var12
MaterialProvider var12
Density var13
double var13
int var13
Biome var14
float var14
double var14
Density var15
float var15
int var15
float var16
Material var16
float var17
float var18
float var19
BufferBundle.Access.View var2
float var20
PixelBufferView var3
BufferBundle.Access.View var4
Vector3i var4
PixelBufferView var5
Bounds3i var5
Density.Context var5
Vector3i var5
BufferBundle.Access.View var6
Vector3i var6
Integer var6
Bounds3i var6
Vector3i var6
VoxelBufferView var7
Density.Context var7
BiomeDistanceStage.BiomeDistanceEntries var7
MaterialProvider.Context var7
Bounds3i var8
Integer var8
BiomeWeights var8
TerrainStage.ColumnData var8
int var8
FloatContainer3d var9
BiomeDistanceStage.BiomeDistanceEntries var9
float var9
Vector3i var9
float var9
int worldX
int worldZ

Методы (24)

МодификаторыВозвратСигнатура
ColumnData ColumnData(int var1, int var2, @Nonnull FloatContainer3d var3)
for for(var6.x = var5.min.x; var6.x < var5.max.x; var6.x++)
for for(var6.z = var5.min.z; var6.z < var5.max.z; var6.z++)
for for(BiomeWeights.Entry var13 : var10.entries)
for for(var6.y = var5.min.y; var6.y < var5.max.y; var6.y++)
for for(var6.y = var5.min.y; var6.y < var5.max.y; var6.y++)
for for(BiomeWeights.Entry var11 : var8.entries)
for for(var9.x = var6.min.x; var9.x < var6.max.x; var9.x++)
for for(var9.z = var6.min.z; var9.z < var6.max.z; var9.z++)
for for(var9.y = var6.min.y; var9.y < var6.max.y; var9.y++)
for for(int var7 = this.top; var7 >= this.bottom; var7--)
for for(int var12 = this.bottom; var12 <= this.top; var12++)
private void generateDensityvoid generateDensity(@Nonnull FloatContainer3d var1, @Nonnull PixelBufferView<Integer> var2, @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var3, @Nonnull Registry<Biome> var4)
private float generateDensityfloat generateDensity(@Nonnull Vector3i var1, @Nonnull PixelBufferView<Integer> var2, @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var3, @Nonnull Registry<Biome> var4)
private void generateMaterialsvoid generateMaterials(@Nonnull PixelBufferView<Integer> var1, @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var2, @Nonnull FloatContainer3d var3, @Nonnull VoxelBufferView<Material> var4, @Nonnull Registry<Biome> var5)
private float getOrGenerateDensityfloat getOrGenerateDensity(@Nonnull Vector3i var1, @Nonnull FloatContainer3d var2, @Nonnull PixelBufferView<Integer> var3, @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var4, @Nonnull Registry<Biome> var5)
if if(var11)
if if(!var11)
if if(var16 != null)
if if(var7 == this.top)
if if(var10)
if if(var12 == this.bottom)
if if(var11)
void resolvevoid resolve(int var1, int var2, @Nonnull MaterialProvider<Material> var3)

Исходный код

Показать/скрыть
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.Registry;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.biome.Biome;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.biometransitionutils.BiomeTransitionUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.biometransitionutils.BiomeWeights;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.density.Density;
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.SimplePixelBuffer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.bufferbundle.buffers.VoxelBuffer;
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.chunkgenerator.StagedChunkGenerator;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.containers.FloatContainer3d;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.views.PixelBufferView;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.engine.views.VoxelBufferView;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.Material;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.MaterialCache;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.materialproviders.MaterialProvider;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.workerindexer.WorkerIndexer;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.worldstructure.WorldStructure;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import java.util.HashMap;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3i;

class="kw">public class TerrainStage class="kw">implements Stage {
   class="kw">public class="kw">static class="kw">final double DEFAULT_BACKGROUND_DENSITY = 0.0;
   @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">public class="kw">static class="kw">final Class<VoxelBuffer> materialBufferClass = VoxelBuffer.class;
   @Nonnull
   class="kw">public class="kw">static class="kw">final Class<Material> materialClass = Material.class;
   @Nonnull
   class="kw">private class="kw">final ParametrizedBufferType biomeInputBufferType;
   @Nonnull
   class="kw">private class="kw">final ParametrizedBufferType biomeDistanceInputBufferType;
   @Nonnull
   class="kw">private class="kw">final ParametrizedBufferType materialOutputBufferType;
   @Nonnull
   class="kw">private class="kw">final Bounds3i inputBounds_bufferGrid;
   @Nonnull
   class="kw">private class="kw">final String stageName;
   class="kw">private class="kw">final int maxInterpolationRadius_voxelGrid;
   @Nonnull
   class="kw">private class="kw">final MaterialCache materialCache;
   @Nonnull
   class="kw">private class="kw">final WorkerIndexer.Data<FloatContainer3d> densityContainers;
   @Nonnull
   class="kw">private class="kw">final WorkerIndexer.Data<WorldStructure> worldStructure_workerdata;

   class="kw">public TerrainStage(
      @Nonnull String var1,
      @Nonnull ParametrizedBufferType var2,
      @Nonnull ParametrizedBufferType var3,
      @Nonnull ParametrizedBufferType var4,
      int var5,
      @Nonnull MaterialCache var6,
      @Nonnull WorkerIndexer var7,
      @Nonnull WorkerIndexer.Data<WorldStructure> var8
   ) {
      assert var2.isValidType(biomeBufferClass, biomeClass);
      assert var3.isValidType(biomeDistanceBufferClass, biomeDistanceClass);
      assert var4.isValidType(materialBufferClass, materialClass);
      assert var5 >= 0;
      this.worldStructure_workerdata = var8;
      this.biomeInputBufferType = var2;
      this.biomeDistanceInputBufferType = var3;
      this.materialOutputBufferType = var4;
      this.stageName = var1;
      this.maxInterpolationRadius_voxelGrid = var5;
      this.materialCache = var6;
      this.densityContainers = new WorkerIndexer.Data<>(
         var7.getWorkerCount(), () -> new FloatContainer3d(StagedChunkGenerator.SINGLE_BUFFER_TILE_BOUNDS_BUFFER_GRID, 0.0F)
      );
      this.inputBounds_bufferGrid = GridUtils.createColumnBounds_bufferGrid(new Vector3i(), 0, 40);
      this.inputBounds_bufferGrid.min.sub(Vector3iUtil.ALL_ONES);
      this.inputBounds_bufferGrid.max.add(Vector3iUtil.ALL_ONES);
      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.biomeDistanceInputBufferType);
      PixelBufferView var5 = new PixelBufferView<>(var4, biomeDistanceClass);
      BufferBundle.Access.View var6 = var1.bufferAccess.get(this.materialOutputBufferType);
      VoxelBufferView var7 = new VoxelBufferView<>(var6, materialClass);
      Bounds3i var8 = var7.getBounds();
      FloatContainer3d var9 = this.densityContainers.get(var1.workerId);
      var9.moveMinTo(var8.min);
      Registry var10 = this.worldStructure_workerdata.get(var1.workerId).getBiomeRegistry();
      this.generateDensity(var9, var3, var5, var10);
      this.generateMaterials(var3, var5, var9, var7, var10);
   }

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

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

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

   class="kw">private void generateDensity(
      @Nonnull FloatContainer3d var1,
      @Nonnull PixelBufferView<Integer> var2,
      @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var3,
      @Nonnull Registry<Biome> var4
   ) {
      Bounds3i var5 = var1.getBounds_voxelGrid();
      Vector3i var6 = new Vector3i(var5.min);
      Density.Context var7 = new Density.Context();
      var7.position = Vector3iUtil.toVector3d(var6);

      for (var6.x = var5.min.x; var6.x < var5.max.x; var6.x++) {
         var7.position.x = var6.x;

         for (var6.z = var5.min.z; var6.z < var5.max.z; var6.z++) {
            var7.position.z = var6.z;
            var6.y = 0;
            Integer var8 = var2.get(var6);
            assert var8 != null;
            BiomeDistanceStage.BiomeDistanceEntries var9 = var3.get(var6);
            BiomeWeights var10 = BiomeTransitionUtil.createWeights(var9, var8, this.maxInterpolationRadius_voxelGrid);
            var7.distanceToBiomeEdge = var9.distanceToClosestOtherBiome(var8);
            boolean var11 = true;

            for (BiomeWeights.Entry var13 : var10.entries) {
               Biome var14 = var4.getObject(var13.biomeId);
               Density var15 = var14.getTerrainDensity();
               if (var11) {
                  for (var6.y = var5.min.y; var6.y < var5.max.y; var6.y++) {
                     var7.position.y = var6.y;
                     float var16 = (float)var15.process(var7);
                     float var17 = var16 * var13.weight;
                     var1.set(var6, var17);
                  }
               }

               if (!var11) {
                  for (var6.y = var5.min.y; var6.y < var5.max.y; var6.y++) {
                     var7.position.y = var6.y;
                     float var19 = var1.get(var6);
                     float var20 = (float)var15.process(var7);
                     float var18 = var20 * var13.weight;
                     var1.set(var6, var19 + var18);
                  }
               }

               var11 = false;
            }
         }
      }
   }

   class="kw">private float getOrGenerateDensity(
      @Nonnull Vector3i var1,
      @Nonnull FloatContainer3d var2,
      @Nonnull PixelBufferView<Integer> var3,
      @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var4,
      @Nonnull Registry<Biome> var5
   ) {
      class="kw">return var2.getBounds_voxelGrid().contains(var1) ? var2.get(var1) : this.generateDensity(var1, var3, var4, var5);
   }

   class="kw">private float generateDensity(
      @Nonnull Vector3i var1,
      @Nonnull PixelBufferView<Integer> var2,
      @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var3,
      @Nonnull Registry<Biome> var4
   ) {
      if (!var3.getBounds().contains(var1.x, 0, var1.z)) {
         class="kw">return 0.0F;
      }

      Density.Context var5 = new Density.Context();
      var5.position = Vector3iUtil.toVector3d(var1);
      Integer var6 = var2.get(var1.x, 0, var1.z);
      assert var6 != null;
      BiomeDistanceStage.BiomeDistanceEntries var7 = var3.get(var1.x, 0, var1.z);
      BiomeWeights var8 = BiomeTransitionUtil.createWeights(var7, var6, this.maxInterpolationRadius_voxelGrid);
      float var9 = 0.0F;

      for (BiomeWeights.Entry var11 : var8.entries) {
         Biome var12 = var4.getObject(var11.biomeId);
         Density var13 = var12.getTerrainDensity();
         var5.distanceToBiomeEdge = var7.distanceToClosestOtherBiome(var11.biomeId);
         float var14 = (float)var13.process(var5);
         float var15 = var14 * var11.weight;
         var9 += var15;
      }

      class="kw">return var9;
   }

   class="kw">private void generateMaterials(
      @Nonnull PixelBufferView<Integer> var1,
      @Nonnull PixelBufferView<BiomeDistanceStage.BiomeDistanceEntries> var2,
      @Nonnull FloatContainer3d var3,
      @Nonnull VoxelBufferView<Material> var4,
      @Nonnull Registry<Biome> var5
   ) {
      Bounds3i var6 = var4.getBounds();
      MaterialProvider.Context var7 = new MaterialProvider.Context(
         new Vector3i(), 0.0, 0, 0, 0, 0, var5x -> this.getOrGenerateDensity(var5x, var3, var1, var2, var5), 0.0, null, null
      );
      TerrainStage.ColumnData var8 = new TerrainStage.ColumnData(var6.min.y, var6.max.y, var3);
      Vector3i var9 = new Vector3i();

      for (var9.x = var6.min.x; var9.x < var6.max.x; var9.x++) {
         for (var9.z = var6.min.z; var9.z < var6.max.z; var9.z++) {
            var9.y = var6.min.y;
            Integer var10 = var1.get(var9.x, 0, var9.z);
            Biome var11 = var5.getObject(var10);
            MaterialProvider var12 = var11.getMaterialProvider();
            var8.resolve(var9.x, var9.z, var12);
            double var13 = var2.get(var9).distanceToClosestOtherBiome(var10);

            for (var9.y = var6.min.y; var9.y < var6.max.y; var9.y++) {
               int var15 = var9.y - var6.min.y;
               var7.position.set(var9);
               var7.density = var3.get(var9);
               var7.depthIntoFloor = var8.depthIntoFloor[var15];
               var7.depthIntoCeiling = var8.depthIntoCeiling[var15];
               var7.spaceAboveFloor = var8.spaceAboveFloor[var15];
               var7.spaceBelowCeiling = var8.spaceBelowCeiling[var15];
               var7.distanceToBiomeEdge = var13;
               Material var16 = var8.materialProvider.getVoxelTypeAt(var7);
               if (var16 != null) {
                  var4.set(var16, var9);
               } else {
                  var4.set(this.materialCache.EMPTY, var9);
               }
            }
         }
      }
   }

   class="kw">private class="kw">static class ColumnData {
      int worldX;
      int worldZ;
      MaterialProvider<Material> materialProvider;
      int topExclusive;
      int bottom;
      int arrayLength;
      int[] depthIntoFloor;
      int[] spaceBelowCeiling;
      int[] depthIntoCeiling;
      int[] spaceAboveFloor;
      int top;
      FloatContainer3d densityBuffer;

      ColumnData(int var1, int var2, @Nonnull FloatContainer3d var3) {
         this.topExclusive = var2;
         this.bottom = var1;
         this.densityBuffer = var3;
      }

      void resolve(int var1, int var2, @Nonnull MaterialProvider<Material> var3) {
         this.worldX = var1;
         this.worldZ = var2;
         this.arrayLength = this.topExclusive - this.bottom;
         this.depthIntoFloor = new int[this.arrayLength];
         this.spaceBelowCeiling = new int[this.arrayLength];
         this.depthIntoCeiling = new int[this.arrayLength];
         this.spaceAboveFloor = new int[this.arrayLength];
         this.top = this.topExclusive - 1;
         this.materialProvider = var3;
         Vector3i var4 = new Vector3i(var1, 0, var2);
         Vector3i var5 = new Vector3i(var1, 0, var2);
         Vector3i var6 = new Vector3i(var1, 0, var2);

         for (int var7 = this.top; var7 >= this.bottom; var7--) {
            var4.y = var7;
            var5.y = var7 + 1;
            int var8 = var7 - this.bottom;
            float var9 = this.densityBuffer.get(var4);
            boolean var10 = var9 > 0.0;
            if (var7 == this.top) {
               if (var10) {
                  this.depthIntoFloor[var8] = 1;
               } else {
                  this.depthIntoFloor[var8] = 0;
               }

               this.spaceAboveFloor[var8] = 1073741823;
            } else if (var10) {
               this.depthIntoFloor[var8] = this.depthIntoFloor[var8 + 1] + 1;
               this.spaceAboveFloor[var8] = this.spaceAboveFloor[var8 + 1];
            } else {
               this.depthIntoFloor[var8] = 0;
               if (this.densityBuffer.get(var5) > 0.0) {
                  this.spaceAboveFloor[var8] = 0;
               } else {
                  this.spaceAboveFloor[var8] = this.spaceAboveFloor[var8 + 1] + 1;
               }
            }
         }

         for (int var12 = this.bottom; var12 <= this.top; var12++) {
            var4.y = var12;
            var6.y = var12 - 1;
            int var13 = var12 - this.bottom;
            double var14 = this.densityBuffer.get(var4);
            boolean var11 = var14 > 0.0;
            if (var12 == this.bottom) {
               if (var11) {
                  this.depthIntoCeiling[var13] = 1;
               } else {
                  this.depthIntoCeiling[var13] = 0;
               }

               this.spaceBelowCeiling[var13] = Integer.MAX_VALUE;
            } else if (var11) {
               this.depthIntoCeiling[var13] = this.depthIntoCeiling[var13 - 1] + 1;
               this.spaceBelowCeiling[var13] = this.spaceBelowCeiling[var13 - 1];
            } else {
               this.depthIntoCeiling[var13] = 0;
               if (this.densityBuffer.get(var6) > 0.0) {
                  this.spaceBelowCeiling[var13] = 0;
               } else {
                  this.spaceBelowCeiling[var13] = this.spaceBelowCeiling[var13 - 1] + 1;
               }
            }
         }
      }
   }
}