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;
}
}
}
}
}
}