From 20de531c8fdc3c7adb808e2baa0d0f0325cabb15 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 15 Jan 2021 15:08:11 -0700 Subject: [PATCH] custom noise functions per palette layer --- .../terra/api/world/palette/NoisePalette.java | 19 +++++---- .../terra/api/world/palette/Palette.java | 39 ++++++++----------- .../api/world/palette/RandomPalette.java | 20 ---------- .../terra/biome/palette/PaletteLayer.java | 9 ++++- .../terra/config/factories/FloraFactory.java | 10 +++-- .../config/factories/PaletteFactory.java | 4 +- .../loaders/palette/PaletteLayerLoader.java | 11 +++++- common/src/test/java/biome/BiomeTest.java | 2 +- 8 files changed, 56 insertions(+), 58 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/world/palette/RandomPalette.java diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java index d2b314dc8..bc5261a05 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/NoisePalette.java @@ -5,19 +5,24 @@ import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import java.util.List; public class NoisePalette extends Palette { - private final NoiseSampler r; + private final NoiseSampler sampler; private final boolean is2D; - public NoisePalette(NoiseSampler r, boolean is2D) { - this.r = r; + public NoisePalette(NoiseSampler sampler, boolean is2D) { + this.sampler = sampler; this.is2D = is2D; } @Override public E get(int layer, double x, double y, double z) { - if(layer > this.getSize()) return this.getLayers().get(this.getLayers().size() - 1).get(r, x, y, z, is2D); - List> pl = getLayers(); - if(layer >= pl.size()) return pl.get(pl.size() - 1).get(r, x, y, z, is2D); - return pl.get(layer).get(r, x, y, z, is2D); + PaletteLayer paletteLayer; + if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); + else { + List> pl = getLayers(); + if(layer >= pl.size()) paletteLayer = pl.get(pl.size() - 1); + else paletteLayer = pl.get(layer); + } + NoiseSampler paletteSampler = paletteLayer.getSampler(); + return paletteLayer.get(paletteSampler == null ? sampler : paletteSampler, x, y, z, is2D); } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java index 618427041..cde3fab01 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java @@ -21,30 +21,16 @@ public abstract class Palette { } - /** - * Adds a material to the palette, for a number of layers. - * - * @param m - The material to add to the palette. - * @param layers - The number of layers the material occupies. - * @return - BlockPalette instance for chaining. - */ - public com.dfsek.terra.api.world.palette.Palette add(E m, int layers) { + public com.dfsek.terra.api.world.palette.Palette add(E m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer<>(m)); + pallet.add(new PaletteLayer<>(m, sampler)); } return this; } - /** - * Adds a ProbabilityCollection to the palette, for a number of layers. - * - * @param m - The ProbabilityCollection to add to the palette. - * @param layers - The number of layers the material occupies. - * @return - BlockPalette instance for chaining. - */ - public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection m, int layers) { + public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer<>(m)); + pallet.add(new PaletteLayer<>(m, sampler)); } return this; } @@ -72,14 +58,17 @@ public abstract class Palette { public static class PaletteLayer { private final boolean col; // Is layer using a collection? private ProbabilityCollection collection; + private final NoiseSampler sampler; private E m; /** * Constructs a PaletteLayer with a ProbabilityCollection of materials and a number of layers. * - * @param type - The collection of materials to choose from. + * @param type The collection of materials to choose from. + * @param sampler Noise sampler to use */ - public PaletteLayer(ProbabilityCollection type) { + public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { + this.sampler = sampler; this.col = true; this.collection = type; } @@ -87,13 +76,19 @@ public abstract class Palette { /** * Constructs a PaletteLayer with a single Material and a number of layers. * - * @param type - The material to use. + * @param type The material to use. + * @param sampler Noise sampler to use */ - public PaletteLayer(E type) { + public PaletteLayer(E type, NoiseSampler sampler) { + this.sampler = sampler; this.col = false; this.m = type; } + public NoiseSampler getSampler() { + return sampler; + } + /** * Gets a material from the layer. * diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/RandomPalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/RandomPalette.java deleted file mode 100644 index 3fff52cbc..000000000 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/RandomPalette.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dfsek.terra.api.world.palette; - -import java.util.List; -import java.util.Random; - -public class RandomPalette extends Palette { - private final Random r; - - public RandomPalette(Random r) { - this.r = r; - } - - @Override - public E get(int layer, double x, double y, double z) { - if(layer > this.getSize()) return this.getLayers().get(this.getLayers().size() - 1).get(r); - List> pl = getLayers(); - if(layer >= pl.size()) return pl.get(pl.size() - 1).get(r); - return pl.get(layer).get(r); - } -} diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java index 56953b1b2..a0e51777c 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java @@ -1,15 +1,18 @@ package com.dfsek.terra.biome.palette; import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.platform.block.BlockData; import org.jetbrains.annotations.NotNull; public class PaletteLayer { private final ProbabilityCollection layer; + private final NoiseSampler sampler; private final int size; - public PaletteLayer(@NotNull ProbabilityCollection layer, int size) { + public PaletteLayer(@NotNull ProbabilityCollection layer, NoiseSampler sampler, int size) { this.layer = layer; + this.sampler = sampler; this.size = size; } @@ -21,4 +24,8 @@ public class PaletteLayer { public int getSize() { return size; } + + public NoiseSampler getSampler() { + return sampler; + } } diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index fbef851e5..5b3ef3c6f 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -1,11 +1,11 @@ package com.dfsek.terra.config.factories; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.flora.Flora; +import com.dfsek.terra.api.world.palette.NoisePalette; import com.dfsek.terra.api.world.palette.Palette; -import com.dfsek.terra.api.world.palette.RandomPalette; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.population.items.flora.TerraFlora; @@ -13,9 +13,11 @@ import com.dfsek.terra.population.items.flora.TerraFlora; public class FloraFactory implements TerraFactory { @Override public TerraFlora build(FloraTemplate config, TerraPlugin main) { - Palette palette = new RandomPalette<>(new FastRandom(2403)); + FastNoiseLite whiteNoise = new FastNoiseLite(); + whiteNoise.setNoiseType(FastNoiseLite.NoiseType.WhiteNoise); + Palette palette = new NoisePalette<>(whiteNoise, false); for(PaletteLayer layer : config.getFloraPalette()) { - palette.add(layer.getLayer(), layer.getSize()); + palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); } return new TerraFlora(palette, config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main); } diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index 47804fef3..25025494e 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -10,9 +10,9 @@ import com.dfsek.terra.config.templates.PaletteTemplate; public class PaletteFactory implements TerraFactory> { @Override public Palette build(PaletteTemplate config, TerraPlugin main) { - Palette palette = new NoisePalette<>(config.getNoise().build(2403), config.getNoise().getDimensions() == 2); + NoisePalette palette = new NoisePalette<>(config.getNoise().build(2403), config.getNoise().getDimensions() == 2); for(PaletteLayer layer : config.getPalette()) { - palette.add(layer.getLayer(), layer.getSize()); + palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); } return palette; } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java index 6513bef8d..2ac7c4718 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java @@ -4,9 +4,12 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.loaders.Types; +import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; +import com.dfsek.terra.generation.config.NoiseBuilder; import java.lang.reflect.Type; import java.util.Map; @@ -17,7 +20,13 @@ public class PaletteLayerLoader implements TypeLoader { public PaletteLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException { Map map = (Map) o; ProbabilityCollection collection = (ProbabilityCollection) configLoader.loadType(Types.BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials")); + + NoiseSampler sampler = null; + if(map.containsKey("noise")) { + sampler = new NoiseBuilderLoader().load(NoiseBuilder.class, map.get("noise"), configLoader).build(2403); + } + if(collection == null) throw new LoadException("Collection is null: " + map.get("materials")); - return new PaletteLayer(collection, (Integer) map.get("layers")); + return new PaletteLayer(collection, sampler, (Integer) map.get("layers")); } } diff --git a/common/src/test/java/biome/BiomeTest.java b/common/src/test/java/biome/BiomeTest.java index 83f760bd9..7f07cbdf7 100644 --- a/common/src/test/java/biome/BiomeTest.java +++ b/common/src/test/java/biome/BiomeTest.java @@ -73,8 +73,8 @@ public class BiomeTest { .addStage(new MutatorStage(new SmoothMutator(whiteNoise(6)))) .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 ExpanderStage(new FractalExpander(whiteNoise(4)))) .addStage(new MutatorStage(new SmoothMutator(whiteNoise(6)))) .addStage(new MutatorStage(new SmoothMutator(whiteNoise(6)))) .build(source), null).build(0);