From 5542dee7b70184f9712c78b3792d53f6172d3882 Mon Sep 17 00:00:00 2001 From: Astrashh Date: Thu, 29 Apr 2021 10:03:04 +1000 Subject: [PATCH 1/2] Implement multiple slant thresholds --- .../terra/api/util/world/PaletteUtil.java | 13 ++++---- .../api/world/palette/slant/SlantHolder.java | 24 +++++++++++++++ .../dfsek/terra/config/GenericLoaders.java | 3 ++ .../config/builder/GeneratorBuilder.java | 7 +++-- .../builder/UserDefinedBiomeBuilder.java | 2 +- .../palette/slant/SlantHolderLoader.java | 30 +++++++++++++++++++ .../terra/config/templates/BiomeTemplate.java | 18 ++++------- .../world/generation/WorldGenerator.java | 9 ++---- 8 files changed, 78 insertions(+), 28 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/world/palette/slant/SlantHolder.java create mode 100644 common/src/main/java/com/dfsek/terra/config/loaders/palette/slant/SlantHolderLoader.java diff --git a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java index 491341ad9..c0247814c 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java @@ -2,16 +2,19 @@ package com.dfsek.terra.api.util.world; import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.world.palette.Palette; -import com.dfsek.terra.api.world.palette.holder.PaletteHolder; +import com.dfsek.terra.api.world.palette.slant.SlantHolder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.world.generation.math.samplers.Sampler; public final class PaletteUtil { public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { - PaletteHolder slant = c.getSlantPalette(); - if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { - return slant.getPalette(y); + + SlantHolder slant = c.getSlant(); + double slope = MathUtil.derivative(sampler, x, y, z); + if (slant != null && slope > slant.getMinSlope()) { + return slant.getPalette(slope).getPalette(y); } + return c.getPalette().getPalette(y); } -} +} \ No newline at end of file diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/slant/SlantHolder.java b/common/src/main/java/com/dfsek/terra/api/world/palette/slant/SlantHolder.java new file mode 100644 index 000000000..d74da5eb3 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/slant/SlantHolder.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.api.world.palette.slant; + +import com.dfsek.terra.api.world.palette.Palette; +import com.dfsek.terra.api.world.palette.holder.PaletteHolder; + +import java.util.TreeMap; + +public class SlantHolder { + private final TreeMap layers; + private final double minSlope; + + public SlantHolder(TreeMap layers, double minSlope) { + this.layers = layers; + this.minSlope = minSlope; + } + + public PaletteHolder getPalette(double slope) { + return layers.floorEntry(slope).getValue(); + } + + public double getMinSlope() { + return minSlope; + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 0726b8d97..5667a8efb 100644 --- a/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -20,6 +20,7 @@ import com.dfsek.terra.api.world.biome.provider.BiomeProvider; import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; +import com.dfsek.terra.api.world.palette.slant.SlantHolder; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; @@ -49,6 +50,7 @@ import com.dfsek.terra.config.loaders.config.sampler.templates.normalizer.Normal import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; +import com.dfsek.terra.config.loaders.palette.slant.SlantHolderLoader; import com.dfsek.terra.world.population.items.flora.FloraLayer; import com.dfsek.terra.world.population.items.flora.TerraFlora; import com.dfsek.terra.world.population.items.ores.Ore; @@ -72,6 +74,7 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(GridSpawn.class, new GridSpawnLoader()) .registerLoader(PaletteHolder.class, new PaletteHolderLoader()) .registerLoader(PaletteLayerHolder.class, new PaletteLayerLoader()) + .registerLoader(SlantHolder.class, new SlantHolderLoader()) .registerLoader(FloraLayer.class, new FloraLayerLoader()) .registerLoader(Ore.Type.class, (t, o, l) -> Ore.Type.valueOf(o.toString())) .registerLoader(OreConfig.class, new OreConfigLoader()) diff --git a/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java index 798e91245..17a3c9222 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java @@ -7,6 +7,7 @@ import com.dfsek.terra.api.math.noise.samplers.ExpressionSampler; import com.dfsek.terra.api.math.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; +import com.dfsek.terra.api.world.palette.slant.SlantHolder; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.world.generation.WorldGenerator; @@ -31,7 +32,7 @@ public class GeneratorBuilder { private PaletteHolder palettes; - private PaletteHolder slantPalettes; + private SlantHolder slantPalettes; private boolean preventInterpolation; @@ -121,11 +122,11 @@ public class GeneratorBuilder { this.palettes = palettes; } - public PaletteHolder getSlantPalettes() { + public SlantHolder getSlantPalettes() { return slantPalettes; } - public void setSlantPalettes(PaletteHolder slantPalettes) { + public void setSlantPalettes(SlantHolder slantPalettes) { this.slantPalettes = slantPalettes; } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java index a4a39e3e3..5dca280c9 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/UserDefinedBiomeBuilder.java @@ -54,7 +54,7 @@ public class UserDefinedBiomeBuilder implements BiomeBuilder { throw new RuntimeException(e); } - WorldGenerator generator = new WorldGenerator(template.getPalette(), template.getSlantPalette(), noise, elevation, carving, template.getBiomeNoise().apply(seed), template.getElevationWeight(), + WorldGenerator generator = new WorldGenerator(template.getPalette(), template.getSlant(), noise, elevation, carving, template.getBiomeNoise().apply(seed), template.getElevationWeight(), template.getBlendDistance(), template.getBlendStep(), template.getBlendWeight()); return new UserDefinedBiome(template.getVanilla(), generator, template); } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/slant/SlantHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/slant/SlantHolderLoader.java new file mode 100644 index 000000000..8828197f4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/slant/SlantHolderLoader.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.config.loaders.palette.slant; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.world.palette.holder.PaletteHolder; +import com.dfsek.terra.api.world.palette.slant.SlantHolder; + +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +@SuppressWarnings("unchecked") +public class SlantHolderLoader implements TypeLoader { + @Override + public SlantHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + List> layers = (List>) o; + TreeMap slantLayers = new TreeMap<>(); + double minThreshold = Double.MAX_VALUE; + + for(Map layer : layers) { + double threshold = ((Number) layer.get("threshold")).doubleValue(); + if (threshold < minThreshold) minThreshold = threshold; + slantLayers.put(threshold, (PaletteHolder) configLoader.loadType(PaletteHolder.class, layer.get("palette"))); + } + + return new SlantHolder(slantLayers, minThreshold); + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index a34a2c8b4..baff39e3b 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -21,6 +21,7 @@ import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.SinglePalette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; +import com.dfsek.terra.api.world.palette.slant.SlantHolder; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.loaders.config.function.FunctionTemplate; import com.dfsek.terra.config.pack.ConfigPack; @@ -67,10 +68,10 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Abstractable private PaletteHolder palette; - @Value("slant.palette") + @Value("slant") @Abstractable @Default - private PaletteHolder slantPalette = null; + private SlantHolder slant = null; @Value("vanilla") @Abstractable @@ -165,11 +166,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Default private Map stairPalettes; - @Value("slant.threshold") - @Abstractable - @Default - private double slantThreshold = 0.1; - @Value("interpolate-elevation") @Abstractable @Default @@ -230,8 +226,8 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return extend; } - public double getSlantThreshold() { - return slantThreshold; + public SlantHolder getSlant() { + return slant; } public double getSlabThreshold() { @@ -306,10 +302,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return trees; } - public PaletteHolder getSlantPalette() { - return slantPalette; - } - public ProbabilityCollection getVanilla() { return vanilla; } diff --git a/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java index 2a46d1c2a..f4b80c410 100644 --- a/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/world/generation/WorldGenerator.java @@ -4,12 +4,13 @@ import com.dfsek.terra.api.math.noise.NoiseSampler; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.holder.PaletteHolder; +import com.dfsek.terra.api.world.palette.slant.SlantHolder; public class WorldGenerator implements Generator { @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) private final PaletteHolder palettes; @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) - private final PaletteHolder slantPalettes; + private final SlantHolder slantPalettes; private final NoiseSampler noise; private final NoiseSampler elevation; @@ -21,7 +22,7 @@ public class WorldGenerator implements Generator { private final int blendStep; private final double blendWeight; - public WorldGenerator(PaletteHolder palettes, PaletteHolder slantPalettes, NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, double elevationWeight, int blendDistance, int blendStep, double blendWeight) { + public WorldGenerator(PaletteHolder palettes, SlantHolder slantPalettes, NoiseSampler noise, NoiseSampler elevation, NoiseSampler carving, NoiseSampler biomeNoise, double elevationWeight, int blendDistance, int blendStep, double blendWeight) { this.palettes = palettes; this.slantPalettes = slantPalettes; this.noise = noise; @@ -84,8 +85,4 @@ public class WorldGenerator implements Generator { public int getBlendStep() { return blendStep; } - - public Palette getSlantPalette(int y) { - return slantPalettes.getPalette(y); - } } From df2c6541923ef1cbb47c1637809b1a15a7949568 Mon Sep 17 00:00:00 2001 From: Astrashh Date: Thu, 29 Apr 2021 16:42:00 +1000 Subject: [PATCH 2/2] Only calculate slope if slant is defined --- .../java/com/dfsek/terra/api/util/world/PaletteUtil.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java index c0247814c..d79fe1e9a 100644 --- a/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/util/world/PaletteUtil.java @@ -10,9 +10,11 @@ public final class PaletteUtil { public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { SlantHolder slant = c.getSlant(); - double slope = MathUtil.derivative(sampler, x, y, z); - if (slant != null && slope > slant.getMinSlope()) { - return slant.getPalette(slope).getPalette(y); + if (slant != null) { + double slope = MathUtil.derivative(sampler, x, y, z); + if (slope > slant.getMinSlope()) { + return slant.getPalette(slope).getPalette(y); + } } return c.getPalette().getPalette(y);