From e831f85d4520253547cae0716a481348cdfc9b0e Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 12 Jul 2022 09:47:29 +1000 Subject: [PATCH] Partial layered generator implementation --- .../chunk-generator-layered/build.gradle.kts | 12 +++ .../LayeredChunkGeneratorAddon.java | 85 ++++++++++++++++++ ...yeredChunkGeneratorPackConfigTemplate.java | 36 ++++++++ .../palette/BlockLayerPaletteTemplate.java | 20 +++++ .../BelowLayerPredicateTemplate.java | 20 +++++ .../RangeLayerPredicateTemplate.java | 20 +++++ .../SamplerLayerPredicateTemplate.java | 21 +++++ .../resolve/PaletteLayerResolverTemplate.java | 37 ++++++++ .../PredicateLayerResolverTemplate.java | 29 ++++++ .../generation/LayeredChunkGenerator.java | 88 +++++++++++++++++++ .../layer/palette/BlockLayerPalette.java | 27 ++++++ .../layer/palette/LayerPalette.java | 12 +++ .../layer/predicate/BelowLayerPredicate.java | 18 ++++ .../layer/predicate/LayerPredicate.java | 8 ++ .../layer/predicate/RangeLayerPredicate.java | 18 ++++ .../predicate/SamplerLayerPredicate.java | 20 +++++ .../layer/resolve/LayerResolver.java | 8 ++ .../layer/resolve/PaletteLayerResolver.java | 18 ++++ .../layer/resolve/PredicateLayerResolver.java | 26 ++++++ .../src/main/resources/terra.addon.yml | 12 +++ 20 files changed, 535 insertions(+) create mode 100644 common/addons/chunk-generator-layered/build.gradle.kts create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java create mode 100644 common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml diff --git a/common/addons/chunk-generator-layered/build.gradle.kts b/common/addons/chunk-generator-layered/build.gradle.kts new file mode 100644 index 000000000..b26c61a77 --- /dev/null +++ b/common/addons/chunk-generator-layered/build.gradle.kts @@ -0,0 +1,12 @@ +version = version("0.1.0") + +dependencies { + compileOnlyApi(project(":common:addons:manifest-addon-loader")) + + implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) + testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) +} + +tasks.named("shadowJar") { + relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama") +} 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 new file mode 100644 index 000000000..850bcffd3 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/LayeredChunkGeneratorAddon.java @@ -0,0 +1,85 @@ +package com.dfsek.terra.addons.chunkgenerator; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.config.LayeredChunkGeneratorPackConfigTemplate; +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.generation.LayeredChunkGenerator; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.manifest.api.AddonInitializer; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.addon.BaseAddon; +import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; +import com.dfsek.terra.api.event.functional.FunctionalEventHandler; +import com.dfsek.terra.api.inject.annotations.Inject; + +import com.dfsek.terra.api.registry.CheckedRegistry; +import com.dfsek.terra.api.util.reflection.TypeKey; +import com.dfsek.terra.api.world.chunk.generation.util.provider.ChunkGeneratorProvider; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.function.Supplier; + + +public class LayeredChunkGeneratorAddon implements AddonInitializer { + + private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); + + public static final TypeKey>> LAYER_PALETTE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey>> LAYER_RESOLVER_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey>> LAYER_PREDICATE_TOKEN = new TypeKey<>() { + }; + + @Inject + private Platform platform; + + @Inject + private BaseAddon addon; + + @Override + public void initialize() { + + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigPackPreLoadEvent.class) + .priority(50) + .then(event -> { + CheckedRegistry>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + paletteRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); + }) + .then(event -> { + logger.info("Registering LayerResolvers.."); + LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate()); + CheckedRegistry>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN); + resolverRegistry.register(addon.key("PREDICATE"), PredicateLayerResolverTemplate::new); + resolverRegistry.register(addon.key("PALETTE"), () -> new PaletteLayerResolverTemplate(config.getPalettes())); + }) + .then(event -> { + CheckedRegistry>> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); + predicateRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); + predicateRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); + predicateRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + }) + .then(event -> { + LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate()); + event.getPack() + .getOrCreateRegistry(ChunkGeneratorProvider.class) + .register(addon.key("LAYERED"), + pack -> new LayeredChunkGenerator(platform, config.getResolver())); + }) + .failThrough(); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java new file mode 100644 index 000000000..0363cd420 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.addons.chunkgenerator.config; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + +import java.util.Map; + + +public class LayeredChunkGeneratorPackConfigTemplate implements ConfigTemplate { + @Value("generation.sampler") + private @Meta NoiseSampler sampler; + + @Value("generation.resolver") + private @Meta LayerResolver resolver; + + @Value("generation.palettes") + private @Meta Map palettes; + + public Map getPalettes() { + return palettes; + } + + public NoiseSampler getSampler() { + return sampler; + } + + public LayerResolver getResolver() { + return resolver; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java new file mode 100644 index 000000000..f3afff5ea --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.BlockLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.api.block.state.BlockState; + + +public class BlockLayerPaletteTemplate implements ObjectTemplate { + + @Value("block") + private BlockState block; + + @Override + public BlockLayerPalette get() { + return new BlockLayerPalette(block); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java new file mode 100644 index 000000000..9b0c41917 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/BelowLayerPredicateTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.BelowLayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.api.config.meta.Meta; + + +public class BelowLayerPredicateTemplate implements ObjectTemplate { + + @Value("y") + private @Meta int y; + + @Override + public LayerPredicate get() { + return new BelowLayerPredicate(y); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java new file mode 100644 index 000000000..309c5ba22 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/RangeLayerPredicateTemplate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate; +import com.dfsek.terra.api.util.Range; + + +public class RangeLayerPredicateTemplate implements ObjectTemplate { + + @Value("range") + private Range range; + + @Override + public LayerPredicate get() { + return new RangeLayerPredicate(range); + } +} 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 new file mode 100644 index 000000000..d47dd33ec --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerLayerPredicateTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; +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; + + @Override + public LayerPredicate get() { + return new SamplerLayerPredicate(sampler); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java new file mode 100644 index 000000000..34955487d --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PaletteLayerResolverTemplate.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.chunkgenerator.config.resolve; + +import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.tectonic.api.exception.ValidationException; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PaletteLayerResolver; + +import java.util.Map; + + +public class PaletteLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { + + private final Map palettes; + + public PaletteLayerResolverTemplate(Map palettes) { + this.palettes = palettes; + } + + @Value("palette") + private String palette; + + @Override + public LayerResolver get() { + return new PaletteLayerResolver(palettes.get(palette)); + } + + @Override + public boolean validate() throws ValidationException { + if(!palettes.containsKey(palette)) throw new ValidationException("The palette " + palette + " does not exist!"); + return true; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java new file mode 100644 index 000000000..3e4da4d6e --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/PredicateLayerResolverTemplate.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.config.resolve; + +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolver; +import com.dfsek.terra.api.config.meta.Meta; + + +public class PredicateLayerResolverTemplate implements ObjectTemplate { + + @Value("if") + private @Meta LayerPredicate predicate; + + @Value("then") + private @Meta LayerResolver trueResolver; + + @Value("else") + private @Meta LayerResolver falseResolver; + + + @Override + public PredicateLayerResolver get() { + return new PredicateLayerResolver(predicate, trueResolver, falseResolver); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java new file mode 100644 index 000000000..98b83a619 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/LayeredChunkGenerator.java @@ -0,0 +1,88 @@ +package com.dfsek.terra.addons.chunkgenerator.generation; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.util.Column; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; +import com.dfsek.terra.api.world.chunk.generation.ProtoChunk; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; + +import org.jetbrains.annotations.NotNull; + + +public class LayeredChunkGenerator implements ChunkGenerator { + + private final Platform platform; + private final LayerResolver resolver; + + public LayeredChunkGenerator(Platform platform, LayerResolver resolver) { + this.platform = platform; + this.resolver = resolver; + } + + @Override + public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldProperties world, @NotNull BiomeProvider biomeProvider, + int chunkX, int chunkZ) { + + platform.getProfiler().push("chunk_base_layered"); + + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + long seed = world.getSeed(); + + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + + int cx = xOrig + x; + int cz = zOrig + z; + int paletteLevel = 0; + LayerPalette previousLayerPalette = null; + Column biomeColumn = biomeProvider.getColumn(cx, cz, world); + + for(int y = world.getMaxHeight() - 1; y >= world.getMinHeight(); y--) { + + Biome biome = biomeColumn.get(y); + + LayerPalette layerPalette = resolver.resolve(seed, biome, x, y, z); + + if (previousLayerPalette == layerPalette) { + paletteLevel++; + } else { + paletteLevel = 0; + } + previousLayerPalette = layerPalette; + + Palette palette = layerPalette.get(seed, biome, x, y, z); + + chunk.setBlock(cx, y, cz, palette.get(paletteLevel, x, y, z, seed)); + + } + } + } + + platform.getProfiler().pop("chunk_base_layered"); + } + + @Override + public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProvider biomeProvider) { + long seed = world.getSeed(); + Biome biome = biomeProvider.getBiome(x, y, z, seed); + int layer = 0; // Default to layer 0 for now + return resolver.resolve(seed, biome, x, y, z) + .get(seed, biome, x, y, z) + .get(layer, x, y, z, seed); + } + + @Override + public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + long seed = world.getSeed(); + Biome biome = biomeProvider.getBiome(x, y, z, seed); + return resolver.resolve(seed, biome, x, y, z) + .get(seed, biome, x, y, z); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java new file mode 100644 index 000000000..28001ddf5 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class BlockLayerPalette implements LayerPalette { + + private final Palette palette; + + public BlockLayerPalette(BlockState block) { + this.palette = new SingletonPalette(block); + } + + @Override + public Palette get(long seed, Biome biome, int x, int y, int z) { + return palette; + } + + private record SingletonPalette(BlockState blockState) implements Palette { + @Override + public BlockState get(int layer, double x, double y, double z, long seed) { + return blockState; + } + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java new file mode 100644 index 000000000..1b654e847 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public interface LayerPalette { + + Palette get(long seed, Biome biome, int x, int y, int z); + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java new file mode 100644 index 000000000..8ccd3d200 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/BelowLayerPredicate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.world.biome.Biome; + + +public class BelowLayerPredicate implements LayerPredicate { + + private final int y; + + public BelowLayerPredicate(int y) { + this.y = y; + } + + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + return y < this.y; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java new file mode 100644 index 000000000..7e80604d0 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.world.biome.Biome; + + +public interface LayerPredicate { + boolean test(long seed, Biome biome, int x, int y, int z); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java new file mode 100644 index 000000000..36d8c7234 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/RangeLayerPredicate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.world.biome.Biome; + + +public class RangeLayerPredicate implements LayerPredicate { + + private final Range range; + + public RangeLayerPredicate(Range range) { + this.range = range; + } + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + return range.isInRange(y); + } +} 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 new file mode 100644 index 000000000..04a770757 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerLayerPredicate.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.predicate; + +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.world.biome.Biome; + + +public class SamplerLayerPredicate implements LayerPredicate { + + private final NoiseSampler sampler; + + public SamplerLayerPredicate(NoiseSampler sampler) { + this.sampler = sampler; + } + + + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + return sampler.noise(seed, x, y, z) > 0; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java new file mode 100644 index 000000000..ed7d1532e --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.resolve; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.api.world.biome.Biome; + +public interface LayerResolver { + LayerPalette resolve(long seed, Biome biome, int x, int y, int z); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java new file mode 100644 index 000000000..454c29139 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PaletteLayerResolver.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.resolve; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.api.world.biome.Biome; + +public class PaletteLayerResolver implements LayerResolver { + + private final LayerPalette palette; + + public PaletteLayerResolver(LayerPalette palette) { + this.palette = palette; + } + + @Override + public LayerPalette resolve(long seed, Biome biome, int x, int y, int z) { + return palette; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java new file mode 100644 index 000000000..fa56c42a7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/PredicateLayerResolver.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.resolve; + +import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.api.world.biome.Biome; + + +public class PredicateLayerResolver implements LayerResolver { + + private final LayerPredicate predicate; + + private final LayerResolver trueResolver; + + private final LayerResolver falseResolver; + + public PredicateLayerResolver(LayerPredicate predicate, LayerResolver trueResolver, LayerResolver falseResolver) { + this.predicate = predicate; + this.trueResolver = trueResolver; + this.falseResolver = falseResolver; + } + + @Override + public LayerPalette resolve(long seed, Biome biome, int x, int y, int z) { + return predicate.test(seed, biome, x, y, z) ? trueResolver.resolve(seed, biome, x, y, z) : falseResolver.resolve(seed, biome, x, y, z); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml b/common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml new file mode 100644 index 000000000..1b7a2d342 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/resources/terra.addon.yml @@ -0,0 +1,12 @@ +schema-version: 1 +contributors: + - Terra contributors +id: chunk-generator-layered +version: @VERSION@ +entrypoints: + - "com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon" +website: + issues: https://github.com/PolyhedralDev/Terra/issues + source: https://github.com/PolyhedralDev/Terra + docs: https://terra.polydev.org +license: MIT License \ No newline at end of file