mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-04 00:45:57 +00:00
protect against biome cell overflow
This commit is contained in:
parent
56a0d5d15b
commit
244f0fba11
@ -16,7 +16,7 @@ import java.util.concurrent.ExecutionException;
|
|||||||
public class StandardBiomeProvider implements BiomeProvider {
|
public class StandardBiomeProvider implements BiomeProvider {
|
||||||
private final BiomePipeline pipeline;
|
private final BiomePipeline pipeline;
|
||||||
private final LoadingCache<Vector2, BiomeHolder> holderCache = CacheBuilder.newBuilder()
|
private final LoadingCache<Vector2, BiomeHolder> holderCache = CacheBuilder.newBuilder()
|
||||||
.maximumSize(1024)
|
.maximumSize(64)
|
||||||
.build(
|
.build(
|
||||||
new CacheLoader<Vector2, BiomeHolder>() {
|
new CacheLoader<Vector2, BiomeHolder>() {
|
||||||
@Override
|
@Override
|
||||||
|
@ -13,4 +13,6 @@ public interface BiomeHolder {
|
|||||||
void fill(BiomeSource source);
|
void fill(BiomeSource source);
|
||||||
|
|
||||||
TerraBiome getBiome(int x, int z);
|
TerraBiome getBiome(int x, int z);
|
||||||
|
|
||||||
|
TerraBiome getBiomeRaw(int x, int z);
|
||||||
}
|
}
|
||||||
|
@ -10,17 +10,21 @@ public class TerraBiomeHolder implements BiomeHolder {
|
|||||||
private final Vector2 origin;
|
private final Vector2 origin;
|
||||||
private final int width;
|
private final int width;
|
||||||
private TerraBiome[][] biomes;
|
private TerraBiome[][] biomes;
|
||||||
|
private final int offset;
|
||||||
|
|
||||||
public TerraBiomeHolder(int width, Vector2 origin) {
|
public TerraBiomeHolder(int width, Vector2 origin) {
|
||||||
|
width += 2;
|
||||||
this.width = width;
|
this.width = width;
|
||||||
biomes = new TerraBiome[width][width];
|
biomes = new TerraBiome[width][width];
|
||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
|
this.offset = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TerraBiomeHolder(TerraBiome[][] biomes, Vector2 origin, int width) {
|
private TerraBiomeHolder(TerraBiome[][] biomes, Vector2 origin, int width, int offset) {
|
||||||
this.biomes = biomes;
|
this.biomes = biomes;
|
||||||
this.origin = origin;
|
this.origin = origin;
|
||||||
this.width = width;
|
this.width = width;
|
||||||
|
this.offset = 2 * offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -41,7 +45,7 @@ public class TerraBiomeHolder implements BiomeHolder {
|
|||||||
biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), old[x][z], old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]);
|
biomes[x * 2 + 1][z * 2 + 1] = expander.getBetween(x + 1 + origin.getX(), z + 1 + origin.getZ(), old[x][z], old[x + 1][z + 1], old[x][z + 1], old[x + 1][z]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new TerraBiomeHolder(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth);
|
return new TerraBiomeHolder(biomes, origin.setX(origin.getX() * 2 - 1).setZ(origin.getZ() * 2 - 1), newWidth, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -65,6 +69,13 @@ public class TerraBiomeHolder implements BiomeHolder {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TerraBiome getBiome(int x, int z) {
|
public TerraBiome getBiome(int x, int z) {
|
||||||
|
x += offset;
|
||||||
|
z += offset;
|
||||||
|
return getBiomeRaw(x, z);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TerraBiome getBiomeRaw(int x, int z) {
|
||||||
if(x >= width || z >= width || x < 0 || z < 0) return null;
|
if(x >= width || z >= width || x < 0 || z < 0) return null;
|
||||||
return biomes[x][z];
|
return biomes[x][z];
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ public interface BiomeMutator {
|
|||||||
|
|
||||||
|
|
||||||
public TerraBiome getBiome(int x, int z) {
|
public TerraBiome getBiome(int x, int z) {
|
||||||
return biomes.getBiome(x + offX, z + offZ);
|
return biomes.getBiomeRaw(x + offX, z + offZ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,8 @@ public class BiomeTest {
|
|||||||
BiomeSource source = new RandomSource(climate, sourceSampler);
|
BiomeSource source = new RandomSource(climate, sourceSampler);
|
||||||
|
|
||||||
|
|
||||||
BiomeProvider provider = new StandardBiomeProvider.StandardBiomeProviderBuilder((seed) -> new BiomePipeline.BiomePipelineBuilder(3)
|
BiomeProvider provider = new StandardBiomeProvider.StandardBiomeProviderBuilder((seed) -> {
|
||||||
|
BiomePipeline pipeline = new BiomePipeline.BiomePipelineBuilder(2)
|
||||||
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(1))))
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(1))))
|
||||||
.addStage(new MutatorStage(new ReplaceMutator("OCEAN_TEMP", oceanBiomes, whiteNoise(243))))
|
.addStage(new MutatorStage(new ReplaceMutator("OCEAN_TEMP", oceanBiomes, whiteNoise(243))))
|
||||||
.addStage(new MutatorStage(new ReplaceMutator("LAND_TEMP", landBiomes, whiteNoise(243))))
|
.addStage(new MutatorStage(new ReplaceMutator("LAND_TEMP", landBiomes, whiteNoise(243))))
|
||||||
@ -69,11 +70,16 @@ public class BiomeTest {
|
|||||||
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(2))))
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(2))))
|
||||||
.addStage(new MutatorStage(new SmoothMutator(whiteNoise(3))))
|
.addStage(new MutatorStage(new SmoothMutator(whiteNoise(3))))
|
||||||
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(4))))
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(4))))
|
||||||
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(4))))
|
||||||
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(4))))
|
||||||
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(4))))
|
||||||
.addStage(new MutatorStage(new BorderMutator("OCEAN", "LAND", whiteNoise(1234), beachBiomes)))
|
.addStage(new MutatorStage(new BorderMutator("OCEAN", "LAND", whiteNoise(1234), beachBiomes)))
|
||||||
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(5))))
|
|
||||||
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(5))))
|
|
||||||
.addStage(new MutatorStage(new SmoothMutator(whiteNoise(6))))
|
.addStage(new MutatorStage(new SmoothMutator(whiteNoise(6))))
|
||||||
.build(source)).build(0);
|
.addStage(new MutatorStage(new SmoothMutator(whiteNoise(6))))
|
||||||
|
.build(source);
|
||||||
|
System.out.println("Size: " + pipeline.getSize());
|
||||||
|
return pipeline;
|
||||||
|
}).build(0);
|
||||||
|
|
||||||
|
|
||||||
int size = 1000;
|
int size = 1000;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user