From 698725c921fec844c7ac31137e8bc652d91d3749 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 17:03:28 +1000 Subject: [PATCH] Implement layer samplers --- .../LayeredChunkGeneratorAddon.java | 37 ++++++++++++++----- .../chunkgenerator/api/LayerSampler.java | 11 ++++++ .../pack/LayerSamplerPackConfigTemplate.java | 21 +++++++++++ .../SamplerLayerPredicateTemplate.java | 12 ++++-- .../sampler/SimpleLayerSamplerTemplate.java | 21 +++++++++++ .../predicate/SamplerLayerPredicate.java | 12 +++--- .../layer/sampler/SimpleLayerSampler.java | 25 +++++++++++++ 7 files changed, 121 insertions(+), 18 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java index eb284732c..e766993b8 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -6,19 +6,22 @@ import org.slf4j.LoggerFactory; import java.util.function.Supplier; -import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; -import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPalettePackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerPredicatePackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerResolverPackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pack.LayerSamplerPackConfigTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.resolve.PaletteLayerResolverTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.resolve.PredicateLayerResolverTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; +import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -35,6 +38,12 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); + public static final TypeKey>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey> LAYER_SAMPLER_TOKEN = new TypeKey<>() { + }; + public static final TypeKey>> LAYER_PALETTE_TYPE_TOKEN = new TypeKey<>() { }; @@ -63,6 +72,14 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) + .then(event -> { + CheckedRegistry>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN); + CheckedRegistry> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN); + samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new); + event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> { + samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler)); + }); + }) .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java new file mode 100644 index 000000000..d328b3b5c --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerSampler.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.addons.chunkgenerator.api; + +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.Biome; + + +public interface LayerSampler { + double sample(long seed, Biome biome, int x, int y, int z); + + NoiseSampler getSampler(); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java new file mode 100644 index 000000000..e81131400 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerSamplerPackConfigTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pack; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import java.util.Map; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerSamplerPackConfigTemplate implements ConfigTemplate { + + @Value("generation.samplers") + private @Meta Map samplers; + + public Map getSamplers() { + return samplers; + } + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java index b784320a4..93265156d 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -1,21 +1,27 @@ package com.dfsek.terra.addons.chunkgenerator.config.predicate; +import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; public class SamplerLayerPredicateTemplate implements ObjectTemplate { @Value("sampler") - private @Meta NoiseSampler sampler; + private @Meta InstanceWrapper sampler; + + @Value("threshold") + @Default + private double threshold = 0; @Override public LayerPredicate get() { - return new SamplerLayerPredicate(sampler); + return new SamplerLayerPredicate(sampler.get(), threshold); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java new file mode 100644 index 000000000..46bd115d6 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/SimpleLayerSamplerTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.sampler; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.SimpleLayerSampler; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class SimpleLayerSamplerTemplate implements ObjectTemplate { + + @Value("sampler") + private @Meta NoiseSampler sampler; + + @Override + public LayerSampler get() { + return new SimpleLayerSampler(sampler); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java index fef96a675..632205420 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -1,21 +1,23 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.api.world.biome.Biome; public class SamplerLayerPredicate implements LayerPredicate { - private final NoiseSampler sampler; + private final LayerSampler sampler; - public SamplerLayerPredicate(NoiseSampler sampler) { + private final double threshold; + + public SamplerLayerPredicate(LayerSampler sampler, double threshold) { this.sampler = sampler; + this.threshold = threshold; } - @Override public boolean test(long seed, Biome biome, int x, int y, int z) { - return sampler.noise(seed, x, y, z) > 0; + return sampler.sample(seed, biome, x, y, z) > threshold; } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java new file mode 100644 index 000000000..71dbb96c5 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.Biome; + + +public class SimpleLayerSampler implements LayerSampler { + + private NoiseSampler sampler; + + public SimpleLayerSampler(NoiseSampler sampler) { + this.sampler = sampler; + } + + @Override + public double sample(long seed, Biome biome, int x, int y, int z) { + return sampler.noise(seed, x, y, z); + } + + @Override + public NoiseSampler getSampler() { + return sampler; + } +}