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() {
}
}
}