mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 14:21:08 +00:00
implement BiomePipeline
This commit is contained in:
@@ -0,0 +1,25 @@
|
|||||||
|
package com.dfsek.terra.biome;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Vector2;
|
||||||
|
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
||||||
|
import com.google.common.cache.CacheBuilder;
|
||||||
|
import com.google.common.cache.CacheLoader;
|
||||||
|
import com.google.common.cache.LoadingCache;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class BiomeCache {
|
||||||
|
LoadingCache<Vector2, BiomeHolder> cache;
|
||||||
|
|
||||||
|
public BiomeCache() {
|
||||||
|
cache = CacheBuilder.newBuilder()
|
||||||
|
.maximumSize(1024)
|
||||||
|
.build(
|
||||||
|
new CacheLoader<Vector2, BiomeHolder>() {
|
||||||
|
@Override
|
||||||
|
public BiomeHolder load(@NotNull Vector2 key) throws Exception {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
package com.dfsek.terra.biome.pipeline;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.math.vector.Vector2;
|
||||||
|
import com.dfsek.terra.api.util.GlueList;
|
||||||
|
import com.dfsek.terra.biome.pipeline.source.BiomeSource;
|
||||||
|
import com.dfsek.terra.biome.pipeline.stages.Stage;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class BiomePipeline {
|
||||||
|
private final BiomeSource source;
|
||||||
|
private final List<Stage> stages;
|
||||||
|
private final int size;
|
||||||
|
private final int init;
|
||||||
|
|
||||||
|
private BiomePipeline(BiomeSource source, List<Stage> stages, int size, int init) {
|
||||||
|
this.source = source;
|
||||||
|
this.stages = stages;
|
||||||
|
this.size = size;
|
||||||
|
this.init = init;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomeHolder getBiomes(int x, int z) {
|
||||||
|
BiomeHolder holder = new TerraBiomeHolder(25, new Vector2(x * (init - 1), z * (init - 1)));
|
||||||
|
holder.fill(source);
|
||||||
|
for(Stage stage : stages) holder = stage.apply(holder);
|
||||||
|
return holder;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSize() {
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class BiomePipelineBuilder {
|
||||||
|
private final int init;
|
||||||
|
List<Stage> stages = new GlueList<>();
|
||||||
|
private int expand;
|
||||||
|
|
||||||
|
public BiomePipelineBuilder(int init) {
|
||||||
|
this.init = init;
|
||||||
|
expand = init;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomePipeline build(BiomeSource source) {
|
||||||
|
return new BiomePipeline(source, stages, expand, init);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BiomePipelineBuilder addStage(Stage stage) {
|
||||||
|
stages.add(stage);
|
||||||
|
if(stage.isExpansion()) expand = expand * 2 - 1;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
package com.dfsek.terra.biome.pipeline;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.math.vector.Vector2;
|
|
||||||
|
|
||||||
public class Position {
|
|
||||||
private final int x;
|
|
||||||
private final int y;
|
|
||||||
|
|
||||||
public Position(int x, int y) {
|
|
||||||
this.x = x;
|
|
||||||
this.y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getX() {
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getY() {
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Vector2 getAsVector() {
|
|
||||||
return new Vector2(x, y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Position newFromAdd(Position other) {
|
|
||||||
return new Position(x + other.getX(), y + other.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
public Position newMultiply(int m) {
|
|
||||||
return new Position(x * m, y * m);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package com.dfsek.terra.biome.pipeline.stages;
|
||||||
|
|
||||||
|
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
||||||
|
import com.dfsek.terra.biome.pipeline.expand.BiomeExpander;
|
||||||
|
|
||||||
|
public class ExpanderStage implements Stage {
|
||||||
|
private final BiomeExpander expander;
|
||||||
|
|
||||||
|
public ExpanderStage(BiomeExpander expander) {
|
||||||
|
this.expander = expander;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExpansion() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeHolder apply(BiomeHolder in) {
|
||||||
|
return in.expand(expander);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.dfsek.terra.biome.pipeline.stages;
|
||||||
|
|
||||||
|
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
||||||
|
import com.dfsek.terra.biome.pipeline.mutator.BiomeMutator;
|
||||||
|
|
||||||
|
public class MutatorStage implements Stage {
|
||||||
|
private final BiomeMutator mutator;
|
||||||
|
|
||||||
|
public MutatorStage(BiomeMutator mutator) {
|
||||||
|
this.mutator = mutator;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isExpansion() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BiomeHolder apply(BiomeHolder in) {
|
||||||
|
in.mutate(mutator);
|
||||||
|
return in;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package com.dfsek.terra.biome.pipeline.stages;
|
||||||
|
|
||||||
|
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
||||||
|
|
||||||
|
public interface Stage {
|
||||||
|
boolean isExpansion();
|
||||||
|
|
||||||
|
BiomeHolder apply(BiomeHolder in);
|
||||||
|
}
|
||||||
@@ -3,15 +3,17 @@ package biome;
|
|||||||
import com.dfsek.terra.api.math.ProbabilityCollection;
|
import com.dfsek.terra.api.math.ProbabilityCollection;
|
||||||
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
|
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
|
||||||
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
|
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
|
||||||
import com.dfsek.terra.api.math.vector.Vector2;
|
|
||||||
import com.dfsek.terra.api.platform.world.World;
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
import com.dfsek.terra.api.world.biome.Generator;
|
import com.dfsek.terra.api.world.biome.Generator;
|
||||||
import com.dfsek.terra.api.world.biome.TerraBiome;
|
import com.dfsek.terra.api.world.biome.TerraBiome;
|
||||||
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
||||||
import com.dfsek.terra.biome.pipeline.TerraBiomeHolder;
|
import com.dfsek.terra.biome.pipeline.BiomePipeline;
|
||||||
import com.dfsek.terra.biome.pipeline.expand.FractalExpander;
|
import com.dfsek.terra.biome.pipeline.expand.FractalExpander;
|
||||||
|
import com.dfsek.terra.biome.pipeline.mutator.SmoothMutator;
|
||||||
import com.dfsek.terra.biome.pipeline.source.BiomeSource;
|
import com.dfsek.terra.biome.pipeline.source.BiomeSource;
|
||||||
import com.dfsek.terra.biome.pipeline.source.RandomSource;
|
import com.dfsek.terra.biome.pipeline.source.RandomSource;
|
||||||
|
import com.dfsek.terra.biome.pipeline.stages.ExpanderStage;
|
||||||
|
import com.dfsek.terra.biome.pipeline.stages.MutatorStage;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
@@ -55,29 +57,22 @@ public class BiomeTest {
|
|||||||
|
|
||||||
BiomeSource source = new RandomSource(climate, sourceSampler);
|
BiomeSource source = new RandomSource(climate, sourceSampler);
|
||||||
|
|
||||||
int size = 25;
|
|
||||||
int expand = 6;
|
|
||||||
|
|
||||||
BiomeHolder holder = new TerraBiomeHolder(size, new Vector2(0, 0));
|
|
||||||
BiomeHolder holder2 = new TerraBiomeHolder(size, new Vector2(24, 0));
|
|
||||||
BiomeHolder holder3 = new TerraBiomeHolder(size, new Vector2(0, 24));
|
|
||||||
BiomeHolder holder4 = new TerraBiomeHolder(size, new Vector2(24, 24));
|
|
||||||
|
|
||||||
long s = System.nanoTime();
|
long s = System.nanoTime();
|
||||||
holder.fill(source);
|
|
||||||
holder2.fill(source);
|
|
||||||
holder3.fill(source);
|
|
||||||
holder4.fill(source);
|
|
||||||
|
|
||||||
for(int i = 0; i < 5; i++) {
|
BiomePipeline pipeline = new BiomePipeline.BiomePipelineBuilder(20)
|
||||||
holder = holder.expand(new FractalExpander(whiteNoise(i)));
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(1))))
|
||||||
holder2 = holder2.expand(new FractalExpander(whiteNoise(i)));
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(2))))
|
||||||
holder3 = holder3.expand(new FractalExpander(whiteNoise(i)));
|
.addStage(new MutatorStage(new SmoothMutator(whiteNoise(3))))
|
||||||
holder4 = holder4.expand(new FractalExpander(whiteNoise(i)));
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(4))))
|
||||||
size = size * 2 - 1;
|
.addStage(new ExpanderStage(new FractalExpander(whiteNoise(5))))
|
||||||
}
|
.addStage(new MutatorStage(new SmoothMutator(whiteNoise(6))))
|
||||||
int og = size;
|
.build(source);
|
||||||
size *= 2;
|
|
||||||
|
BiomeHolder holder = pipeline.getBiomes(0, 0);
|
||||||
|
BiomeHolder holder2 = pipeline.getBiomes(1, 0);
|
||||||
|
BiomeHolder holder3 = pipeline.getBiomes(0, 1);
|
||||||
|
BiomeHolder holder4 = pipeline.getBiomes(1, 1);
|
||||||
|
|
||||||
//holder = holder.expand(new FractalExpander(whiteNoise(4)));
|
//holder = holder.expand(new FractalExpander(whiteNoise(4)));
|
||||||
|
|
||||||
//holder.mutate(new ReplaceMutator("OCEAN_TEMP", oceanBiomes, whiteNoise(234)));
|
//holder.mutate(new ReplaceMutator("OCEAN_TEMP", oceanBiomes, whiteNoise(234)));
|
||||||
@@ -99,6 +94,9 @@ public class BiomeTest {
|
|||||||
|
|
||||||
long e = System.nanoTime();
|
long e = System.nanoTime();
|
||||||
|
|
||||||
|
int size = pipeline.getSize();
|
||||||
|
int og = size;
|
||||||
|
size *= 2;
|
||||||
double time = e - s;
|
double time = e - s;
|
||||||
time /= 1000000;
|
time /= 1000000;
|
||||||
System.out.println(time + "ms for " + size + "x" + size);
|
System.out.println(time + "ms for " + size + "x" + size);
|
||||||
|
|||||||
Reference in New Issue
Block a user