From 5c9a9c7dfa15cfd791cfc1f19e621f3fe3041332 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 12 Jan 2021 22:36:16 -0700 Subject: [PATCH] implement BiomePipeline --- .../com/dfsek/terra/biome/BiomeCache.java | 25 +++++++++ .../terra/biome/pipeline/BiomePipeline.java | 54 +++++++++++++++++++ .../dfsek/terra/biome/pipeline/Position.java | 33 ------------ .../biome/pipeline/stages/ExpanderStage.java | 22 ++++++++ .../biome/pipeline/stages/MutatorStage.java | 23 ++++++++ .../terra/biome/pipeline/stages/Stage.java | 9 ++++ common/src/test/java/biome/BiomeTest.java | 44 ++++++++------- 7 files changed, 154 insertions(+), 56 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/biome/BiomeCache.java create mode 100644 common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java delete mode 100644 common/src/main/java/com/dfsek/terra/biome/pipeline/Position.java create mode 100644 common/src/main/java/com/dfsek/terra/biome/pipeline/stages/ExpanderStage.java create mode 100644 common/src/main/java/com/dfsek/terra/biome/pipeline/stages/MutatorStage.java create mode 100644 common/src/main/java/com/dfsek/terra/biome/pipeline/stages/Stage.java diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeCache.java b/common/src/main/java/com/dfsek/terra/biome/BiomeCache.java new file mode 100644 index 000000000..b4b656bd0 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeCache.java @@ -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 cache; + + public BiomeCache() { + cache = CacheBuilder.newBuilder() + .maximumSize(1024) + .build( + new CacheLoader() { + @Override + public BiomeHolder load(@NotNull Vector2 key) throws Exception { + return null; + } + } + ); + } +} diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java new file mode 100644 index 000000000..fcc4e2b10 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/BiomePipeline.java @@ -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 stages; + private final int size; + private final int init; + + private BiomePipeline(BiomeSource source, List 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 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; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/Position.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/Position.java deleted file mode 100644 index 096b39378..000000000 --- a/common/src/main/java/com/dfsek/terra/biome/pipeline/Position.java +++ /dev/null @@ -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); - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/ExpanderStage.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/ExpanderStage.java new file mode 100644 index 000000000..44b962525 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/ExpanderStage.java @@ -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); + } +} diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/MutatorStage.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/MutatorStage.java new file mode 100644 index 000000000..b3ab37386 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/MutatorStage.java @@ -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; + } +} diff --git a/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/Stage.java b/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/Stage.java new file mode 100644 index 000000000..6830c7da5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/biome/pipeline/stages/Stage.java @@ -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); +} diff --git a/common/src/test/java/biome/BiomeTest.java b/common/src/test/java/biome/BiomeTest.java index 660c646cd..e3fee0794 100644 --- a/common/src/test/java/biome/BiomeTest.java +++ b/common/src/test/java/biome/BiomeTest.java @@ -3,15 +3,17 @@ package biome; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; 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.world.biome.Generator; import com.dfsek.terra.api.world.biome.TerraBiome; 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.mutator.SmoothMutator; import com.dfsek.terra.biome.pipeline.source.BiomeSource; 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 javax.swing.*; @@ -55,29 +57,22 @@ public class BiomeTest { 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(); - holder.fill(source); - holder2.fill(source); - holder3.fill(source); - holder4.fill(source); - for(int i = 0; i < 5; i++) { - holder = holder.expand(new FractalExpander(whiteNoise(i))); - holder2 = holder2.expand(new FractalExpander(whiteNoise(i))); - holder3 = holder3.expand(new FractalExpander(whiteNoise(i))); - holder4 = holder4.expand(new FractalExpander(whiteNoise(i))); - size = size * 2 - 1; - } - int og = size; - size *= 2; + BiomePipeline pipeline = new BiomePipeline.BiomePipelineBuilder(20) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(1)))) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(2)))) + .addStage(new MutatorStage(new SmoothMutator(whiteNoise(3)))) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(4)))) + .addStage(new ExpanderStage(new FractalExpander(whiteNoise(5)))) + .addStage(new MutatorStage(new SmoothMutator(whiteNoise(6)))) + .build(source); + + 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.mutate(new ReplaceMutator("OCEAN_TEMP", oceanBiomes, whiteNoise(234))); @@ -99,6 +94,9 @@ public class BiomeTest { long e = System.nanoTime(); + int size = pipeline.getSize(); + int og = size; + size *= 2; double time = e - s; time /= 1000000; System.out.println(time + "ms for " + size + "x" + size);