From e831f85d4520253547cae0716a481348cdfc9b0e Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 12 Jul 2022 09:47:29 +1000 Subject: [PATCH 01/26] 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 0000000000..b26c61a77a --- /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 0000000000..850bcffd30 --- /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 0000000000..0363cd420a --- /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 0000000000..f3afff5ea4 --- /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 0000000000..9b0c41917a --- /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 0000000000..309c5ba22a --- /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 0000000000..d47dd33ec5 --- /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 0000000000..34955487d9 --- /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 0000000000..3e4da4d6e1 --- /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 0000000000..98b83a6193 --- /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 0000000000..28001ddf55 --- /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 0000000000..1b654e847e --- /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 0000000000..8ccd3d2003 --- /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 0000000000..7e80604d09 --- /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 0000000000..36d8c72343 --- /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 0000000000..04a7707573 --- /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 0000000000..ed7d1532e7 --- /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 0000000000..454c29139c --- /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 0000000000..fa56c42a7f --- /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 0000000000..1b7a2d3427 --- /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 From 2a9d94094cd62d6f07e31ee5af5dd5f8b9aab502 Mon Sep 17 00:00:00 2001 From: Astrash Date: Tue, 12 Jul 2022 13:15:27 +1000 Subject: [PATCH 02/26] Finish initial layered generator implementation --- .../LayeredChunkGeneratorAddon.java | 38 ++++++++++--------- ...yeredChunkGeneratorPackConfigTemplate.java | 36 ------------------ .../LayerPalettePackConfigTemplate.java | 21 ++++++++++ .../LayerPredicatePackConfigTemplate.java | 21 ++++++++++ .../LayerResolverPackConfigTemplate.java | 18 +++++++++ .../PredicateLayerResolverTemplate.java | 23 +++++++++-- .../generation/LayeredChunkGenerator.java | 10 ++--- .../layer/palette/LayerPalette.java | 2 - 8 files changed, 105 insertions(+), 64 deletions(-) delete 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/LayerPalettePackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.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 850bcffd30..4b03f5121c 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 @@ -1,12 +1,18 @@ package com.dfsek.terra.addons.chunkgenerator; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.function.Supplier; -import com.dfsek.terra.addons.chunkgenerator.config.LayeredChunkGeneratorPackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.LayerPalettePackConfigTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.predicate.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.resolve.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; @@ -19,16 +25,10 @@ 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 { @@ -51,34 +51,38 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { @Override public void initialize() { + + LayerPalettePackConfigTemplate paletteConfig = new LayerPalettePackConfigTemplate(); + LayerPredicatePackConfigTemplate predicateConfig = new LayerPredicatePackConfigTemplate(); + LayerResolverPackConfigTemplate resolverConfig = new LayerResolverPackConfigTemplate(); platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) - .priority(50) + .priority(1000) .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())); + event.loadTemplate(paletteConfig); }) .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); + event.loadTemplate(predicateConfig); + }) + .then(event -> { + CheckedRegistry>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN); + resolverRegistry.register(addon.key("TEST_PREDICATE"), () -> new PredicateLayerResolverTemplate(predicateConfig.getPredicates())); + resolverRegistry.register(addon.key("USE_PALETTE"), () -> new PaletteLayerResolverTemplate(paletteConfig.getPalettes())); + event.loadTemplate(resolverConfig); }) .then(event -> { - LayeredChunkGeneratorPackConfigTemplate config = event.loadTemplate(new LayeredChunkGeneratorPackConfigTemplate()); event.getPack() .getOrCreateRegistry(ChunkGeneratorProvider.class) .register(addon.key("LAYERED"), - pack -> new LayeredChunkGenerator(platform, config.getResolver())); + pack -> new LayeredChunkGenerator(platform, resolverConfig.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 deleted file mode 100644 index 0363cd420a..0000000000 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/LayeredChunkGeneratorPackConfigTemplate.java +++ /dev/null @@ -1,36 +0,0 @@ -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/LayerPalettePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java new file mode 100644 index 0000000000..e68a0628d4 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +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.layer.palette.LayerPalette; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerPalettePackConfigTemplate implements ConfigTemplate { + + @Value("generation.palettes") + private @Meta Map palettes; + + public Map getPalettes() { + return palettes; + } + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java new file mode 100644 index 0000000000..fbddab2c0f --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.predicate; + +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.layer.predicate.LayerPredicate; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerPredicatePackConfigTemplate implements ConfigTemplate { + + @Value("generation.predicates") + private @Meta Map predicates; + + public Map getPredicates() { + return predicates; + } + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java new file mode 100644 index 0000000000..8f848a27a7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.config.resolve; + +import com.dfsek.tectonic.api.config.template.ConfigTemplate; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.api.config.meta.Meta; + + +public class LayerResolverPackConfigTemplate implements ConfigTemplate { + + @Value("generation.resolver") + private @Meta LayerResolver resolver; + + public LayerResolver getResolver() { + return resolver; + } +} 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 index 3e4da4d6e1..03a9c3346d 100644 --- 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 @@ -1,8 +1,11 @@ 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 java.util.Map; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; @@ -10,10 +13,16 @@ import com.dfsek.terra.api.config.meta.Meta; -public class PredicateLayerResolverTemplate implements ObjectTemplate { +public class PredicateLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { + + private final Map predicates; + + public PredicateLayerResolverTemplate(Map predicates) { + this.predicates = predicates; + } @Value("if") - private @Meta LayerPredicate predicate; + private @Meta String predicate; @Value("then") private @Meta LayerResolver trueResolver; @@ -24,6 +33,12 @@ public class PredicateLayerResolverTemplate implements ObjectTemplate Date: Sat, 16 Jul 2022 16:28:57 +1000 Subject: [PATCH 03/26] Store palettes and predicates in registries --- .../LayeredChunkGeneratorAddon.java | 64 +++++++++++-------- .../{layer/palette => api}/LayerPalette.java | 2 +- .../predicate => api}/LayerPredicate.java | 2 +- .../{layer/resolve => api}/LayerResolver.java | 3 +- .../LayerPalettePackConfigTemplate.java | 4 +- .../LayerPredicatePackConfigTemplate.java | 9 ++- .../LayerResolverPackConfigTemplate.java | 4 +- .../palette/BlockLayerPaletteTemplate.java | 2 +- .../BelowLayerPredicateTemplate.java | 2 +- .../RangeLayerPredicateTemplate.java | 2 +- .../SamplerLayerPredicateTemplate.java | 2 +- .../resolve/PaletteLayerResolverTemplate.java | 28 ++------ .../PredicateLayerResolverTemplate.java | 28 ++------ .../generation/LayeredChunkGenerator.java | 4 +- .../layer/palette/BlockLayerPalette.java | 1 + .../layer/predicate/BelowLayerPredicate.java | 1 + .../layer/predicate/RangeLayerPredicate.java | 1 + .../predicate/SamplerLayerPredicate.java | 1 + .../layer/resolve/PaletteLayerResolver.java | 3 +- .../layer/resolve/PredicateLayerResolver.java | 5 +- .../chunkgenerator/util/InstanceWrapper.java | 12 ++++ 21 files changed, 88 insertions(+), 92 deletions(-) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/{layer/palette => api}/LayerPalette.java (78%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/{layer/predicate => api}/LayerPredicate.java (70%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/{layer/resolve => api}/LayerResolver.java (53%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/{palette => pack}/LayerPalettePackConfigTemplate.java (77%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/{predicate => pack}/LayerPredicatePackConfigTemplate.java (56%) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/{resolve => pack}/LayerResolverPackConfigTemplate.java (75%) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.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 4b03f5121c..3062d20277 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 @@ -7,18 +7,19 @@ import java.util.function.Supplier; import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.palette.LayerPalettePackConfigTemplate; +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.predicate.LayerPredicatePackConfigTemplate; +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.resolve.LayerResolverPackConfigTemplate; +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.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.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.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.addon.BaseAddon; @@ -34,13 +35,19 @@ 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_PALETTE_TYPE_TOKEN = new TypeKey<>() { }; - public static final TypeKey>> LAYER_RESOLVER_TOKEN = new TypeKey<>() { + public static final TypeKey> LAYER_PALETTE_TOKEN = new TypeKey<>() { }; - public static final TypeKey>> LAYER_PREDICATE_TOKEN = new TypeKey<>() { + public static final TypeKey>> LAYER_PREDICATE_TYPE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey> LAYER_PREDICATE_TOKEN = new TypeKey<>() { + }; + + public static final TypeKey>> LAYER_RESOLVER_TYPE_TOKEN = new TypeKey<>() { }; @Inject @@ -51,38 +58,39 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { @Override public void initialize() { - - LayerPalettePackConfigTemplate paletteConfig = new LayerPalettePackConfigTemplate(); - LayerPredicatePackConfigTemplate predicateConfig = new LayerPredicatePackConfigTemplate(); - LayerResolverPackConfigTemplate resolverConfig = new LayerResolverPackConfigTemplate(); platform.getEventManager() .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) .then(event -> { - CheckedRegistry>> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); - paletteRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); - event.loadTemplate(paletteConfig); - }) - .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); - event.loadTemplate(predicateConfig); + CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); + paletteTypeRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); + CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { + paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); + }); }) .then(event -> { - CheckedRegistry>> resolverRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TOKEN); - resolverRegistry.register(addon.key("TEST_PREDICATE"), () -> new PredicateLayerResolverTemplate(predicateConfig.getPredicates())); - resolverRegistry.register(addon.key("USE_PALETTE"), () -> new PaletteLayerResolverTemplate(paletteConfig.getPalettes())); - event.loadTemplate(resolverConfig); + CheckedRegistry>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN); + predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); + event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { + predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); + }); }) .then(event -> { + CheckedRegistry>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN); + resolverTypeRegistry.register(addon.key("TEST_PREDICATE"), PredicateLayerResolverTemplate::new); + resolverTypeRegistry.register(addon.key("USE_PALETTE"), PaletteLayerResolverTemplate::new); + LayerResolver resolver = event.loadTemplate(new LayerResolverPackConfigTemplate()).getResolver(); + event.getPack() .getOrCreateRegistry(ChunkGeneratorProvider.class) .register(addon.key("LAYERED"), - pack -> new LayeredChunkGenerator(platform, resolverConfig.getResolver())); + pack -> new LayeredChunkGenerator(platform, resolver)); }) .failThrough(); } 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/api/LayerPalette.java similarity index 78% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/LayerPalette.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java index c75b0491d1..f5e6321654 100644 --- 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/api/LayerPalette.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.palette; +package com.dfsek.terra.addons.chunkgenerator.api; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.util.Palette; 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/api/LayerPredicate.java similarity index 70% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/LayerPredicate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java index 7e80604d09..bed38a3b0e 100644 --- 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/api/LayerPredicate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.predicate; +package com.dfsek.terra.addons.chunkgenerator.api; import com.dfsek.terra.api.world.biome.Biome; 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/api/LayerResolver.java similarity index 53% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/resolve/LayerResolver.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java index ed7d1532e7..def10d8ec2 100644 --- 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/api/LayerResolver.java @@ -1,6 +1,5 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.resolve; +package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; import com.dfsek.terra.api.world.biome.Biome; public interface LayerResolver { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java similarity index 77% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java index e68a0628d4..1fed5f9e70 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPalettePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.addons.chunkgenerator.config.palette; +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.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; import com.dfsek.terra.api.config.meta.Meta; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java similarity index 56% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java index fbddab2c0f..ca7d472542 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/LayerPredicatePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java @@ -1,18 +1,21 @@ -package com.dfsek.terra.addons.chunkgenerator.config.predicate; +package com.dfsek.terra.addons.chunkgenerator.config.pack; 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 java.util.LinkedHashMap; import java.util.Map; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.config.meta.Meta; public class LayerPredicatePackConfigTemplate implements ConfigTemplate { @Value("generation.predicates") - private @Meta Map predicates; + @Default + private @Meta Map predicates = new LinkedHashMap<>(); public Map getPredicates() { return predicates; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerResolverPackConfigTemplate.java similarity index 75% rename from common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java rename to common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerResolverPackConfigTemplate.java index 8f848a27a7..71e8363afd 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/resolve/LayerResolverPackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerResolverPackConfigTemplate.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.addons.chunkgenerator.config.resolve; +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 com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.config.meta.Meta; 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 index f3afff5ea4..d3fbfacb2a 100644 --- 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 @@ -4,7 +4,7 @@ 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.addons.chunkgenerator.api.LayerPalette; import com.dfsek.terra.api.block.state.BlockState; 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 index 9b0c41917a..b6ec6d6c11 100644 --- 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 @@ -4,7 +4,7 @@ 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.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.config.meta.Meta; 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 index 309c5ba22a..fec9f8a77a 100644 --- 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 @@ -3,7 +3,7 @@ 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.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate; import com.dfsek.terra.api.util.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 index d47dd33ec5..b784320a4e 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 @@ -3,7 +3,7 @@ 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.api.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; 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 index 34955487d9..53d7669d3c 100644 --- 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 @@ -1,37 +1,21 @@ 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.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PaletteLayerResolver; - -import java.util.Map; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; -public class PaletteLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { - - private final Map palettes; - - public PaletteLayerResolverTemplate(Map palettes) { - this.palettes = palettes; - } +public class PaletteLayerResolverTemplate implements ObjectTemplate { @Value("palette") - private String palette; + private InstanceWrapper 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; + return new PaletteLayerResolver(palette.get()); } } 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 index 03a9c3346d..b143a9c839 100644 --- 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 @@ -1,28 +1,19 @@ 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 java.util.Map; - -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.LayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.addons.chunkgenerator.layer.resolve.PredicateLayerResolver; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; -public class PredicateLayerResolverTemplate implements ObjectTemplate, ValidatedConfigTemplate { - - private final Map predicates; - - public PredicateLayerResolverTemplate(Map predicates) { - this.predicates = predicates; - } +public class PredicateLayerResolverTemplate implements ObjectTemplate { @Value("if") - private @Meta String predicate; + private @Meta InstanceWrapper predicate; @Value("then") private @Meta LayerResolver trueResolver; @@ -30,15 +21,8 @@ public PredicateLayerResolverTemplate(Map predicates) { @Value("else") private @Meta LayerResolver falseResolver; - @Override public PredicateLayerResolver get() { - return new PredicateLayerResolver(predicates.get(predicate), trueResolver, falseResolver); - } - - @Override - public boolean validate() throws ValidationException { - if (!predicates.containsKey(predicate)) throw new ValidationException("The predicate " + predicate + " does not exist!"); - return true; + return new PredicateLayerResolver(predicate.get(), 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 index cb8866f2b4..5104f0ca61 100644 --- 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 @@ -2,8 +2,8 @@ import org.jetbrains.annotations.NotNull; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.resolve.LayerResolver; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.Column; 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 index 28001ddf55..4054609e81 100644 --- 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 @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.palette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; 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; 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 index 8ccd3d2003..1ffb519392 100644 --- 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 @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.world.biome.Biome; 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 index 36d8c72343..9e0ab8ba05 100644 --- 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 @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.biome.Biome; 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 04a7707573..fef96a675d 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,5 +1,6 @@ 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.api.world.biome.Biome; 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 index 454c29139c..e0780c9217 100644 --- 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 @@ -1,6 +1,7 @@ package com.dfsek.terra.addons.chunkgenerator.layer.resolve; -import com.dfsek.terra.addons.chunkgenerator.layer.palette.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.world.biome.Biome; public class PaletteLayerResolver implements LayerResolver { 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 index fa56c42a7f..b23e846526 100644 --- 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 @@ -1,7 +1,8 @@ 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.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.api.LayerResolver; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.java new file mode 100644 index 0000000000..ebb1e6ad7a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/InstanceWrapper.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.addons.chunkgenerator.util; + +import java.util.function.Supplier; + + +public record InstanceWrapper(T instance) implements Supplier { + + @Override + public T get() { + return instance; + } +} From 809a6422a15ddb6a4ac748cd914f311f6a9ec752 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 16:36:45 +1000 Subject: [PATCH 04/26] Rename some keys --- .../addons/chunkgenerator/LayeredChunkGeneratorAddon.java | 4 ++-- .../config/pack/LayerPalettePackConfigTemplate.java | 2 +- .../config/resolve/PaletteLayerResolverTemplate.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) 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 3062d20277..eb284732cb 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 @@ -83,8 +83,8 @@ public void initialize() { }) .then(event -> { CheckedRegistry>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN); - resolverTypeRegistry.register(addon.key("TEST_PREDICATE"), PredicateLayerResolverTemplate::new); - resolverTypeRegistry.register(addon.key("USE_PALETTE"), PaletteLayerResolverTemplate::new); + resolverTypeRegistry.register(addon.key("TEST"), PredicateLayerResolverTemplate::new); + resolverTypeRegistry.register(addon.key("LAYER"), PaletteLayerResolverTemplate::new); LayerResolver resolver = event.loadTemplate(new LayerResolverPackConfigTemplate()).getResolver(); event.getPack() diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java index 1fed5f9e70..8485ec8366 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPalettePackConfigTemplate.java @@ -11,7 +11,7 @@ public class LayerPalettePackConfigTemplate implements ConfigTemplate { - @Value("generation.palettes") + @Value("generation.layers") private @Meta Map palettes; public Map getPalettes() { 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 index 53d7669d3c..de1474dbff 100644 --- 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 @@ -11,7 +11,7 @@ public class PaletteLayerResolverTemplate implements ObjectTemplate { - @Value("palette") + @Value("layer") private InstanceWrapper palette; @Override From 698725c921fec844c7ac31137e8bc652d91d3749 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 17:03:28 +1000 Subject: [PATCH 05/26] Implement layer samplers --- .../LayeredChunkGeneratorAddon.java | 29 +++++++++++++++---- .../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, 117 insertions(+), 14 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 eb284732cb..e766993b82 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 java.util.function.Supplier; -import com.dfsek.terra.addons.chunkgenerator.config.palette.BlockLayerPaletteTemplate; +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.predicate.BelowLayerPredicateTemplate; 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.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.config.sampler.SimpleLayerSamplerTemplate; 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.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 void initialize() { .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 0000000000..d328b3b5c9 --- /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 0000000000..e811314007 --- /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 b784320a4e..93265156d8 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 0000000000..46bd115d63 --- /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 fef96a675d..6322054201 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 0000000000..71dbb96c53 --- /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; + } +} From b57b71baa76f1e4628e7423e953c04547af5e21e Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 17:17:18 +1000 Subject: [PATCH 06/26] Replace BLOCK layer palette with PALETTE --- .../LayeredChunkGeneratorAddon.java | 4 +-- .../palette/BlockLayerPaletteTemplate.java | 20 ------------- .../palette/SimpleLayerPaletteTemplate.java | 20 +++++++++++++ .../layer/palette/BlockLayerPalette.java | 28 ------------------- .../layer/palette/SimpleLayerPalette.java | 20 +++++++++++++ 5 files changed, 42 insertions(+), 50 deletions(-) delete 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/palette/SimpleLayerPaletteTemplate.java delete 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/SimpleLayerPalette.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 e766993b82..72b8658115 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 @@ -14,7 +14,7 @@ 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.palette.SimpleLayerPaletteTemplate; 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; @@ -82,7 +82,7 @@ public void initialize() { }) .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); - paletteTypeRegistry.register(addon.key("BLOCK"), BlockLayerPaletteTemplate::new); + paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); 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 deleted file mode 100644 index d3fbfacb2a..0000000000 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BlockLayerPaletteTemplate.java +++ /dev/null @@ -1,20 +0,0 @@ -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.api.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/palette/SimpleLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java new file mode 100644 index 0000000000..2ee6a2a2fd --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.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.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class SimpleLayerPaletteTemplate implements ObjectTemplate { + + @Value("palette") + private Palette palette; + + @Override + public LayerPalette get() { + return new SimpleLayerPalette(palette); + } +} 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 deleted file mode 100644 index 4054609e81..0000000000 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BlockLayerPalette.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.palette; - -import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; -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/SimpleLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java new file mode 100644 index 0000000000..4bfbe21333 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class SimpleLayerPalette implements LayerPalette { + + private final Palette palette; + + public SimpleLayerPalette(Palette palette) { + this.palette = palette; + } + + @Override + public Palette get(long seed, Biome biome, int x, int y, int z) { + return palette; + } +} From edcba9707d5a5a63882c1fd9e20cda6f13db69ee Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 18:56:30 +1000 Subject: [PATCH 07/26] Implement biome defined layer palettes --- .../LayeredChunkGeneratorAddon.java | 10 +++ .../BiomeDefinedLayerPaletteTemplate.java | 22 ++++++ .../palette/BiomeDefinedLayerPalette.java | 67 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.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 72b8658115..884466636f 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 @@ -14,6 +14,7 @@ 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.BiomeDefinedLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; @@ -22,10 +23,12 @@ 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.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; 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.ConfigurationLoadEvent; 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; @@ -83,6 +86,7 @@ public void initialize() { .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); + paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); @@ -110,5 +114,11 @@ public void initialize() { pack -> new LayeredChunkGenerator(platform, resolver)); }) .failThrough(); + + platform.getEventManager() + .getHandler(FunctionalEventHandler.class) + .register(addon, ConfigurationLoadEvent.class) + .priority(1000) + .then(BiomeDefinedLayerPalette.injectLayerPalettes); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java new file mode 100644 index 0000000000..133e491b56 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +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.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate { + + @Value("default") + @Default + private Palette defaultPalette = null; + + @Override + public LayerPalette get() { + return new BiomeDefinedLayerPalette(defaultPalette); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java new file mode 100644 index 0000000000..94489dece0 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -0,0 +1,67 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate; +import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon; +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; +import com.dfsek.terra.api.properties.Properties; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class BiomeDefinedLayerPalette implements LayerPalette { + + private final Palette defaultPalette; + + public BiomeDefinedLayerPalette(Palette defaultPalette) { + this.defaultPalette = defaultPalette; + } + + @Override + public Palette get(long seed, Biome biome, int x, int y, int z) { + return biome.getContext().get(BiomeLayerPalettes.class).palettes().get(this); + } + + public Optional getDefaultPalette() { + return Optional.ofNullable(defaultPalette); + } + + public static Consumer injectLayerPalettes = event -> { + if(event.is(Biome.class)) { + + Map paletteFields = new HashMap<>(); + DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder(); + + event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_PALETTE_TOKEN).forEach((registryKey, registryEntry) -> { + LayerPalette layerPalette = registryEntry.get(); + // Add template value for each BiomeDefinedLayerPalette + if (layerPalette instanceof BiomeDefinedLayerPalette biomeLayerPalette) { + String id = registryKey.getID(); + String fieldName = id + "LayerPalette"; + paletteFields.put(biomeLayerPalette, fieldName); + DynamicValue.Builder value = DynamicValue.builder("layers." + id, Palette.class); + biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault); + templateBuilder.value(fieldName, value.build()); + } + }); + + DynamicTemplate layerPaletteBiomeTemplate = event.load(templateBuilder.build()); + + Map paletteMap = paletteFields.entrySet().stream().collect( + Collectors.toMap(Entry::getKey, entry -> layerPaletteBiomeTemplate.get(entry.getValue(), Palette.class))); + event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerPalettes(paletteMap)); + } + }; + + public record BiomeLayerPalettes(Map palettes) implements Properties { + } +} From 4d31fda79f44f228f5ea34abbb54269183de3ff2 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 16 Jul 2022 20:11:17 +1000 Subject: [PATCH 08/26] Implement layer palette groups --- .../LayeredChunkGeneratorAddon.java | 1 + .../chunkgenerator/api/LayerPalette.java | 65 ++++++++++++++++++- .../BiomeDefinedLayerPaletteTemplate.java | 5 +- .../config/palette/LayerPaletteTemplate.java | 21 ++++++ .../palette/SimpleLayerPaletteTemplate.java | 5 +- .../generation/LayeredChunkGenerator.java | 4 ++ .../palette/BiomeDefinedLayerPalette.java | 5 +- .../layer/palette/SimpleLayerPalette.java | 5 +- 8 files changed, 99 insertions(+), 12 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/LayerPaletteTemplate.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 884466636f..aa502eb58a 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 @@ -88,6 +88,7 @@ public void initialize() { paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack())); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); }); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java index f5e6321654..c4eb14f066 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java @@ -1,10 +1,71 @@ package com.dfsek.terra.addons.chunkgenerator.api; +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; +import java.util.HashMap; +import java.util.Map; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public interface LayerPalette { + +public abstract class LayerPalette { + + private final Group group; + + private final boolean resetsGroup; + + protected LayerPalette(Group group, boolean resetsGroup) { + this.group = group; + this.resetsGroup = resetsGroup; + } + + public abstract Palette get(long seed, Biome biome, int x, int y, int z); + + public final Group getGroup() { + return group; + } + + public final boolean resetsGroup() { + return resetsGroup; + } + + public static class Group { + + public static Group NO_GROUP = new Group(); + + private Group() {} + + public static Group get(String string, ConfigPack pack) { + if (!pack.getContext().has(Holder.class)) { + pack.getContext().put(new Holder(new HashMap<>())); + } + return pack.getContext().get(Holder.class).groups.computeIfAbsent(string, s -> new Group()); + } - Palette get(long seed, Biome biome, int x, int y, int z); + private record Holder(Map groups) implements Properties {} + + public static class Loader implements TypeLoader { + private final ConfigPack pack; + + public Loader(ConfigPack pack) { + this.pack = pack; + } + + @Override + public Group load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, + DepthTracker depthTracker) throws LoadException { + String groupName = (String) o; + return Group.get(groupName, pack); + } + } + } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java index 133e491b56..f04d81ffd7 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/BiomeDefinedLayerPaletteTemplate.java @@ -2,14 +2,13 @@ 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.LayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate { +public class BiomeDefinedLayerPaletteTemplate extends LayerPaletteTemplate { @Value("default") @Default @@ -17,6 +16,6 @@ public class BiomeDefinedLayerPaletteTemplate implements ObjectTemplate { + + @Value("group") + @Default + protected LayerPalette.Group group = LayerPalette.Group.NO_GROUP; + + @Value("resets-group") + @Default + protected boolean resetsGroup = false; + +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java index 2ee6a2a2fd..43432b43cb 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/SimpleLayerPaletteTemplate.java @@ -1,20 +1,19 @@ 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.api.LayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette; import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class SimpleLayerPaletteTemplate implements ObjectTemplate { +public class SimpleLayerPaletteTemplate extends LayerPaletteTemplate { @Value("palette") private Palette palette; @Override public LayerPalette get() { - return new SimpleLayerPalette(palette); + return new SimpleLayerPalette(group, resetsGroup, palette); } } 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 index 5104f0ca61..2de7cfd903 100644 --- 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 @@ -52,6 +52,10 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie if (previousLayerPalette == layerPalette) { paletteLevel++; + } else if (layerPalette.resetsGroup()) { + paletteLevel = 0; + } else if (previousLayerPalette != null && layerPalette.getGroup() == previousLayerPalette.getGroup()) { + paletteLevel++; } else { paletteLevel = 0; } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java index 94489dece0..56f5953811 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -18,11 +18,12 @@ import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class BiomeDefinedLayerPalette implements LayerPalette { +public class BiomeDefinedLayerPalette extends LayerPalette { private final Palette defaultPalette; - public BiomeDefinedLayerPalette(Palette defaultPalette) { + public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaultPalette) { + super(group, resetsGroup); this.defaultPalette = defaultPalette; } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java index 4bfbe21333..e39beacef6 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java @@ -5,11 +5,12 @@ import com.dfsek.terra.api.world.chunk.generation.util.Palette; -public class SimpleLayerPalette implements LayerPalette { +public class SimpleLayerPalette extends LayerPalette { private final Palette palette; - public SimpleLayerPalette(Palette palette) { + public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) { + super(group, resetsGroup); this.palette = palette; } From fea7d7a4fd256cf49b810db847f7e174cb6be402 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 17 Jul 2022 20:35:05 +1000 Subject: [PATCH 09/26] Implement sampler operators + sampler list predicate --- .../LayeredChunkGeneratorAddon.java | 9 +++ .../SamplerLayerPredicateTemplate.java | 7 ++- .../SamplerListLayerPredicateTemplate.java | 38 ++++++++++++ .../predicate/SamplerLayerPredicate.java | 48 ++++++++++++++- .../predicate/SamplerListLayerPredicate.java | 58 +++++++++++++++++++ 5 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/predicate/SamplerListLayerPredicateTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.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 aa502eb58a..956d85784e 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 @@ -19,11 +19,14 @@ 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.predicate.SamplerListLayerPredicateTemplate; 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.layer.palette.BiomeDefinedLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; +import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -98,6 +101,12 @@ public void initialize() { predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER_LIST"), SamplerListLayerPredicateTemplate::new); + + event.getPack().applyLoader(CoordinateTest.class, CoordinateTest.Template::new) + .applyLoader(SamplerLayerPredicate.Operator.class, + (type, o, loader, depthTracker) -> SamplerLayerPredicate.Operator.valueOf((String) o)); + CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); 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 93265156d8..63a6fe4da9 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 @@ -7,6 +7,7 @@ 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.layer.predicate.SamplerLayerPredicate.Operator; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; @@ -20,8 +21,12 @@ public class SamplerLayerPredicateTemplate implements ObjectTemplate { + + @Value("sampler") + private @Meta InstanceWrapper sampler; + + @Value("tests") + private List tests; + + @Value("default-threshold") + @Default + private double defaultThreshold = 0; + + @Value("default-operator") + @Default + private Operator defaultOperator = Operator.GreaterThan; + + @Override + public LayerPredicate get() { + return new SamplerListLayerPredicate(sampler.get(), defaultOperator, tests); + } +} 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 6322054201..27fd6d886b 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 @@ -11,13 +11,57 @@ public class SamplerLayerPredicate implements LayerPredicate { private final double threshold; - public SamplerLayerPredicate(LayerSampler sampler, double threshold) { + private final Operator operator; + + public SamplerLayerPredicate(LayerSampler sampler, Operator operator, double threshold) { this.sampler = sampler; + this.operator = operator; this.threshold = threshold; } @Override public boolean test(long seed, Biome biome, int x, int y, int z) { - return sampler.sample(seed, biome, x, y, z) > threshold; + return operator.evaluate(sampler.sample(seed, biome, x, y, z), threshold); + } + + public enum Operator { + GreaterThan { + @Override + public boolean evaluate(double a, double b) { + return a > b; + } + }, + GreaterThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a >= b; + } + }, + LessThan { + @Override + public boolean evaluate(double a, double b) { + return a < b; + } + }, + LessThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a <= b; + } + }, + Equals { + @Override + public boolean evaluate(double a, double b) { + return a == b; + } + }, + NotEquals { + @Override + public boolean evaluate(double a, double b) { + return a != b; + } + }; + + public abstract boolean evaluate(double a, double b); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java new file mode 100644 index 0000000000..6735c33104 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.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 java.util.List; + +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.Operator; +import com.dfsek.terra.api.world.biome.Biome; + + +public class SamplerListLayerPredicate implements LayerPredicate { + + private final List tests; + private final Operator operator; + private final LayerSampler sampler; + + public SamplerListLayerPredicate(LayerSampler sampler, Operator operator, List tests) { + this.sampler = sampler; + this.operator = operator; + this.tests = tests; + } + + @Override + public boolean test(long seed, Biome biome, int x, int y, int z) { + for (CoordinateTest test : tests) { + if (operator.evaluate(sampler.sample(seed, biome, x + test.x, y + test.y, z + test.z), test.threshold)) return true; + } + return false; + } + + public record CoordinateTest(int x, int y, int z, double threshold) { + + public static class Template implements ObjectTemplate { + + @Value("x") + private int x; + + @Value("y") + private int y; + + @Value("z") + private int z; + + @Value("threshold") + @Default + private double threshold = 0; + + @Override + public CoordinateTest get() { + return new CoordinateTest(x, y, z, threshold); + } + } + } +} From 0b057c5a74f6dc2c36a91718f92ec7b5372cd468 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 17 Jul 2022 20:36:12 +1000 Subject: [PATCH 10/26] Add platform air layer palette --- .../LayeredChunkGeneratorAddon.java | 7 +++++- .../PlatformAirLayerPaletteTemplate.java | 22 +++++++++++++++++++ .../palette/SingletonPalette.java | 18 +++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.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 956d85784e..9fc2e85300 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 @@ -15,6 +15,7 @@ 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.BiomeDefinedLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.BelowLayerPredicateTemplate; import com.dfsek.terra.addons.chunkgenerator.config.predicate.RangeLayerPredicateTemplate; @@ -82,6 +83,7 @@ public void initialize() { 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)); }); @@ -90,8 +92,11 @@ public void initialize() { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); - CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); + paletteTypeRegistry.register(addon.key("AIR"), () -> new PlatformAirLayerPaletteTemplate(platform)); + event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack())); + + CheckedRegistry> paletteRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TOKEN); event.loadTemplate(new LayerPalettePackConfigTemplate()).getPalettes().forEach((key, palette) -> { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); }); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java new file mode 100644 index 0000000000..00e4feadf3 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/PlatformAirLayerPaletteTemplate.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.SimpleLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.palette.SingletonPalette; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.block.state.BlockState; + + +public class PlatformAirLayerPaletteTemplate extends LayerPaletteTemplate { + + private BlockState air; + + public PlatformAirLayerPaletteTemplate(Platform platform) { + this.air = platform.getWorldHandle().air(); + } + + @Override + public LayerPalette get() { + return new SimpleLayerPalette(group, resetsGroup, new SingletonPalette(air)); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.java new file mode 100644 index 0000000000..fb83db0ea3 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/SingletonPalette.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.addons.chunkgenerator.palette; + +import com.dfsek.terra.api.block.state.BlockState; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class SingletonPalette implements Palette { + private final BlockState blockState; + + public SingletonPalette(BlockState blockState) { + this.blockState = blockState; + } + + @Override + public BlockState get(int layer, double x, double y, double z, long seed) { + return blockState; + } +} From 237b897146a64455c552076b99c6a89f0b854075 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sun, 17 Jul 2022 20:36:26 +1000 Subject: [PATCH 11/26] Rename predicates key to tests --- .../config/pack/LayerPredicatePackConfigTemplate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java index ca7d472542..cf4bb2172b 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pack/LayerPredicatePackConfigTemplate.java @@ -13,7 +13,7 @@ public class LayerPredicatePackConfigTemplate implements ConfigTemplate { - @Value("generation.predicates") + @Value("generation.tests") @Default private @Meta Map predicates = new LinkedHashMap<>(); From 7baace047b8c0d1e496ecfb683231604c7fa125d Mon Sep 17 00:00:00 2001 From: Astrash Date: Mon, 18 Jul 2022 11:59:25 +1000 Subject: [PATCH 12/26] Change layer class method signatures --- .../addons/chunkgenerator/api/LayerPredicate.java | 5 +++-- .../addons/chunkgenerator/api/LayerResolver.java | 6 ++++-- .../addons/chunkgenerator/api/LayerSampler.java | 8 +++----- .../generation/LayeredChunkGenerator.java | 12 +++++------- .../layer/predicate/BelowLayerPredicate.java | 5 +++-- .../layer/predicate/RangeLayerPredicate.java | 5 +++-- .../layer/predicate/SamplerLayerPredicate.java | 7 ++++--- .../layer/predicate/SamplerListLayerPredicate.java | 7 ++++--- .../layer/resolve/PaletteLayerResolver.java | 6 ++++-- .../layer/resolve/PredicateLayerResolver.java | 7 ++++--- .../layer/sampler/SimpleLayerSampler.java | 12 ++++-------- 11 files changed, 41 insertions(+), 39 deletions(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java index bed38a3b0e..ce2170d346 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java @@ -1,8 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public interface LayerPredicate { - boolean test(long seed, Biome biome, int x, int y, int z); + boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider provider); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java index def10d8ec2..5d0efbd069 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerResolver.java @@ -1,7 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + public interface LayerResolver { - LayerPalette resolve(long seed, Biome biome, int x, int y, int z); + LayerPalette resolve(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider); } 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 index d328b3b5c9..5a782494e6 100644 --- 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 @@ -1,11 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.api; -import com.dfsek.terra.api.noise.NoiseSampler; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public interface LayerSampler { - double sample(long seed, Biome biome, int x, int y, int z); - - NoiseSampler getSampler(); + double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider); } 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 index 2de7cfd903..c89766682a 100644 --- 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 @@ -48,7 +48,7 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie Biome biome = biomeColumn.get(y); - LayerPalette layerPalette = resolver.resolve(seed, biome, cx, y, cz); + LayerPalette layerPalette = resolver.resolve(cx, y, cz, world, biomeProvider); if (previousLayerPalette == layerPalette) { paletteLevel++; @@ -60,11 +60,9 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie paletteLevel = 0; } previousLayerPalette = layerPalette; - - Palette palette = layerPalette.get(seed, biome, cx, y, cz); - chunk.setBlock(cx, y, cz, palette.get(paletteLevel, cx, y, cz, seed)); - + chunk.setBlock(cx, y, cz, layerPalette.get(seed, biome, cx, y, cz) + .get(paletteLevel, cx, y, cz, seed)); } } } @@ -77,7 +75,7 @@ public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProv 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) + return resolver.resolve(x, y, z, world, biomeProvider) .get(seed, biome, x, y, z) .get(layer, x, y, z, seed); } @@ -86,7 +84,7 @@ public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProv 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) + return resolver.resolve(x, y, z, world, biomeProvider) .get(seed, biome, x, y, 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 index 1ffb519392..5eb85d4f87 100644 --- 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 @@ -1,7 +1,8 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class BelowLayerPredicate implements LayerPredicate { @@ -13,7 +14,7 @@ public BelowLayerPredicate(int y) { } @Override - public boolean test(long seed, Biome biome, int x, int y, int z) { + public boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider biomeProvider) { return y < this.y; } } 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 index 9e0ab8ba05..d116bb686d 100644 --- 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 @@ -2,7 +2,8 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.api.util.Range; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class RangeLayerPredicate implements LayerPredicate { @@ -13,7 +14,7 @@ public RangeLayerPredicate(Range range) { this.range = range; } @Override - public boolean test(long seed, Biome biome, int x, int y, int z) { + public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider provider) { 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 index 27fd6d886b..e7de52e255 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 @@ -2,7 +2,8 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class SamplerLayerPredicate implements LayerPredicate { @@ -20,8 +21,8 @@ public SamplerLayerPredicate(LayerSampler sampler, Operator operator, double thr } @Override - public boolean test(long seed, Biome biome, int x, int y, int z) { - return operator.evaluate(sampler.sample(seed, biome, x, y, z), threshold); + public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + return operator.evaluate(sampler.sample(x, y, z, world, biomeProvider), threshold); } public enum Operator { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java index 6735c33104..173f796826 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java @@ -9,7 +9,8 @@ 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.Operator; -import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; public class SamplerListLayerPredicate implements LayerPredicate { @@ -25,9 +26,9 @@ public SamplerListLayerPredicate(LayerSampler sampler, Operator operator, List Date: Mon, 18 Jul 2022 12:00:28 +1000 Subject: [PATCH 13/26] Implement biome defined layer samplers --- .../LayeredChunkGeneratorAddon.java | 6 +- .../BiomeDefinedLayerSamplerTemplate.java | 23 ++++++ .../palette/BiomeDefinedLayerPalette.java | 2 +- .../sampler/BiomeDefinedLayerSampler.java | 75 +++++++++++++++++++ 4 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.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 9fc2e85300..418631c397 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 @@ -23,11 +23,13 @@ import com.dfsek.terra.addons.chunkgenerator.config.predicate.SamplerListLayerPredicateTemplate; 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.BiomeDefinedLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -83,6 +85,7 @@ public void initialize() { CheckedRegistry>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN); CheckedRegistry> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN); samplerTypeRegistry.register(addon.key("SIMPLE"), SimpleLayerSamplerTemplate::new); + samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new); event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> { samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler)); @@ -134,6 +137,7 @@ public void initialize() { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigurationLoadEvent.class) .priority(1000) - .then(BiomeDefinedLayerPalette.injectLayerPalettes); + .then(BiomeDefinedLayerPalette.injectLayerPalettes) + .then(BiomeDefinedLayerSampler.injectLayerSamplers); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java new file mode 100644 index 0000000000..4fb7965c30 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.addons.chunkgenerator.config.sampler; + +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.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.noise.NoiseSampler; + + +public class BiomeDefinedLayerSamplerTemplate implements ObjectTemplate { + + @Value("default") + @Default + private @Meta NoiseSampler defaultSampler = null; + + @Override + public LayerSampler get() { + return new BiomeDefinedLayerSampler(defaultSampler); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java index 56f5953811..c53efea264 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -49,7 +49,7 @@ public Optional getDefaultPalette() { String id = registryKey.getID(); String fieldName = id + "LayerPalette"; paletteFields.put(biomeLayerPalette, fieldName); - DynamicValue.Builder value = DynamicValue.builder("layers." + id, Palette.class); + DynamicValue.Builder value = DynamicValue.builder("generation.layers." + id, Palette.class); biomeLayerPalette.getDefaultPalette().ifPresent(value::setDefault); templateBuilder.value(fieldName, value.build()); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java new file mode 100644 index 0000000000..804acdf0df --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java @@ -0,0 +1,75 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler; + +import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate; +import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; +import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.terra.api.properties.Properties; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class BiomeDefinedLayerSampler implements LayerSampler { + + private final NoiseSampler defaultSampler; + + public BiomeDefinedLayerSampler(@Nullable NoiseSampler defaultSampler) { + this.defaultSampler = defaultSampler; + } + + @Override + public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + return biomeProvider.getBiome(x, y, z, world.getSeed()) + .getContext() + .get(BiomeLayerSamplers.class) + .samplers() + .get(this) + .noise(world.getSeed(), x, y, z); + } + + private Optional getDefaultSampler() { + return Optional.ofNullable(defaultSampler); + } + + public static Consumer injectLayerSamplers = event -> { + if(event.is(Biome.class)) { + + Map samplerFields = new HashMap<>(); + DynamicTemplate.Builder templateBuilder = DynamicTemplate.builder(); + + event.getPack().getRegistry(LayeredChunkGeneratorAddon.LAYER_SAMPLER_TOKEN).forEach((registryKey, registryEntry) -> { + LayerSampler layerSampler = registryEntry.get(); + + if (layerSampler instanceof BiomeDefinedLayerSampler biomeLayerSampler) { + String id = registryKey.getID(); + String fieldName = id + "LayerSampler"; + samplerFields.put(biomeLayerSampler, fieldName); + DynamicValue.Builder value = DynamicValue.builder("generation.samplers." + id, NoiseSampler.class); + biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault); + templateBuilder.value(fieldName, value.build()); + } + }); + + DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build()); + + Map samplerMap = samplerFields.entrySet().stream().collect( + Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), NoiseSampler.class))); + event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap)); + } + }; + + public record BiomeLayerSamplers(Map samplers) implements Properties { + } +} From 55e024dab04fb3f029de50b8f8620b41b22bed77 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:51:54 +1000 Subject: [PATCH 14/26] Change layer signatures --- .../dfsek/terra/addons/chunkgenerator/api/LayerPalette.java | 5 +++-- .../terra/addons/chunkgenerator/api/LayerPredicate.java | 2 +- .../layer/palette/BiomeDefinedLayerPalette.java | 6 ++++-- .../chunkgenerator/layer/palette/SimpleLayerPalette.java | 5 +++-- .../chunkgenerator/layer/predicate/BelowLayerPredicate.java | 2 +- .../chunkgenerator/layer/predicate/RangeLayerPredicate.java | 2 +- 6 files changed, 13 insertions(+), 9 deletions(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java index c4eb14f066..bce83f62b3 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPalette.java @@ -12,8 +12,9 @@ import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.properties.Properties; -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.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; public abstract class LayerPalette { @@ -27,7 +28,7 @@ protected LayerPalette(Group group, boolean resetsGroup) { this.resetsGroup = resetsGroup; } - public abstract Palette get(long seed, Biome biome, int x, int y, int z); + public abstract Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider); public final Group getGroup() { return group; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java index ce2170d346..95c09b7989 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/LayerPredicate.java @@ -5,5 +5,5 @@ public interface LayerPredicate { - boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider provider); + boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java index c53efea264..2eb965f031 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/BiomeDefinedLayerPalette.java @@ -15,7 +15,9 @@ import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; import com.dfsek.terra.api.properties.Properties; 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.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; public class BiomeDefinedLayerPalette extends LayerPalette { @@ -28,8 +30,8 @@ public BiomeDefinedLayerPalette(Group group, boolean resetsGroup, Palette defaul } @Override - public Palette get(long seed, Biome biome, int x, int y, int z) { - return biome.getContext().get(BiomeLayerPalettes.class).palettes().get(this); + public Palette get(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { + return biomeProvider.getBiome(x, y, z, worldProperties.getSeed()).getContext().get(BiomeLayerPalettes.class).palettes().get(this); } public Optional getDefaultPalette() { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java index e39beacef6..ff98582302 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/SimpleLayerPalette.java @@ -1,8 +1,9 @@ package com.dfsek.terra.addons.chunkgenerator.layer.palette; import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; -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.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; public class SimpleLayerPalette extends LayerPalette { @@ -15,7 +16,7 @@ public SimpleLayerPalette(Group group, boolean resetsGroup, Palette palette) { } @Override - public Palette get(long seed, Biome biome, int x, int y, int z) { + public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { return palette; } } 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 index 5eb85d4f87..2f5f4faf38 100644 --- 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 @@ -14,7 +14,7 @@ public BelowLayerPredicate(int y) { } @Override - public boolean test(int x, int y, int z, WorldProperties properties, BiomeProvider biomeProvider) { + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { return y < this.y; } } 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 index d116bb686d..c7d108a118 100644 --- 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 @@ -14,7 +14,7 @@ public RangeLayerPredicate(Range range) { this.range = range; } @Override - public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider provider) { + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { return range.isInRange(y); } } From 50397a4a6b2c2979978446fd47f2dda26cc65406 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:53:00 +1000 Subject: [PATCH 15/26] Add loaders for vector classes --- .../dfsek/terra/config/GenericLoaders.java | 8 ++++- .../config/loaders/Vector3IntLoader.java | 31 ++++++++++++++++++ .../terra/config/loaders/Vector3Loader.java | 32 +++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java create mode 100644 common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index f4f5c6cfd2..964f30f092 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -31,10 +31,14 @@ import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.collection.MaterialSet; import com.dfsek.terra.api.util.collection.ProbabilityCollection; +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; +import com.dfsek.terra.config.loaders.Vector3IntLoader; +import com.dfsek.terra.config.loaders.Vector3Loader; import com.dfsek.terra.config.loaders.VersionLoader; import com.dfsek.terra.config.loaders.VersionRangeLoader; @@ -53,7 +57,9 @@ public void register(TypeRegistry registry) { .registerLoader(Version.class, new VersionLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) - .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()); + .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) + .registerLoader(Vector3.class, new Vector3Loader()) + .registerLoader(Vector3Int.class, new Vector3IntLoader()); if(platform != null) { registry.registerLoader(BaseAddon.class, platform.getAddons()) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java new file mode 100644 index 0000000000..06d470594e --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.config.loaders; + +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; +import java.util.List; +import java.util.Map; + +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class Vector3IntLoader implements TypeLoader { + + @SuppressWarnings("unchecked") + @Override + public Vector3Int load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, + DepthTracker depthTracker) throws LoadException { + if (o instanceof List) { + List list = (List) o; + return Vector3Int.of(list.get(0), list.get(1), list.get(2)); + } + else { + Map map = (Map) o; + return Vector3Int.of(map.get("x"), map.get("y"), map.get("z")); + } + } +} + diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java new file mode 100644 index 0000000000..cdfffe15ad --- /dev/null +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.config.loaders; + +import com.dfsek.tectonic.api.depth.DepthTracker; +import com.dfsek.tectonic.api.exception.LoadException; +import com.dfsek.tectonic.api.loader.ConfigLoader; +import com.dfsek.tectonic.api.loader.type.TypeLoader; +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.AnnotatedType; +import java.util.List; +import java.util.Map; + +import com.dfsek.terra.api.util.vector.Vector3; + + +public class Vector3Loader implements TypeLoader { + + @SuppressWarnings("unchecked") + @Override + public Vector3 load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader, + DepthTracker depthTracker) throws LoadException { + if (o instanceof List) { + List list = (List) o; + return Vector3.of(list.get(0), list.get(1), list.get(2)); + } + else { + Map map = (Map) o; + return Vector3.of(map.get("x"), map.get("y"), map.get("z")); + } + } +} + From d9bd9135de72968f7b957691f0121afd51046aac Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:58:59 +1000 Subject: [PATCH 16/26] Add point sets to layered gen --- .../LayeredChunkGeneratorAddon.java | 33 ++++++++++++ .../generative/AdjacentPointSetTemplate.java | 15 ++++++ .../generative/SimplePointSetTemplate.java | 22 ++++++++ .../geometric/CubePointSetTemplate.java | 19 +++++++ .../geometric/CuboidPointSetTemplate.java | 25 ++++++++++ .../geometric/SphericalPointSetTemplate.java | 19 +++++++ .../operative/DifferencePointSetTemplate.java | 21 ++++++++ .../ExpressionFilterPointSetTemplate.java | 27 ++++++++++ .../IntersectionPointSetTemplate.java | 21 ++++++++ .../operative/UnionPointSetTemplate.java | 21 ++++++++ .../SamplerLayerPredicateTemplate.java | 4 +- .../SamplerListLayerPredicateTemplate.java | 18 +++---- .../predicate/SamplerLayerPredicate.java | 49 ++---------------- .../predicate/SamplerListLayerPredicate.java | 50 +++++-------------- .../chunkgenerator/math/BooleanOperator.java | 42 ++++++++++++++++ .../math/pointset/PointSet.java | 14 ++++++ .../pointset/generative/AdjacentPointSet.java | 20 ++++++++ .../pointset/generative/SimplePointSet.java | 22 ++++++++ .../generative/geometric/CuboidPointSet.java | 31 ++++++++++++ .../geometric/SphericalPointSet.java | 36 +++++++++++++ .../operative/DifferencePointSet.java | 29 +++++++++++ .../operative/ExpressionFilterPointSet.java | 32 ++++++++++++ .../operative/IntersectionPointSet.java | 29 +++++++++++ .../pointset/operative/UnionPointSet.java | 29 +++++++++++ platforms/fabric/build.gradle.kts | 4 +- 25 files changed, 536 insertions(+), 96 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.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 418631c397..8445945779 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 @@ -17,6 +17,15 @@ import com.dfsek.terra.addons.chunkgenerator.config.palette.BiomeDefinedLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.SimplePointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CubePointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.CuboidPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric.SphericalPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.DifferencePointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.ExpressionFilterPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.IntersectionPointSetTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.pointset.operative.UnionPointSetTemplate; 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; @@ -30,6 +39,8 @@ import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.api.Platform; @@ -47,6 +58,9 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); + public static final TypeKey>> POINT_SET_TYPE_TOKEN = new TypeKey<>() { + }; + public static final TypeKey>> LAYER_SAMPLER_TYPE_TOKEN = new TypeKey<>() { }; @@ -81,6 +95,25 @@ public void initialize() { .getHandler(FunctionalEventHandler.class) .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) + .then(event -> { + event.getPack().applyLoader(BooleanOperator.class, + (type, o, loader, depthTracker) -> BooleanOperator.valueOf((String) o)); + + CheckedRegistry>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry( + POINT_SET_TYPE_TOKEN); + pointSetTypeRegistry.register(addon.key("LIST"), SimplePointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("ADJACENT"), AdjacentPointSetTemplate::new); + + pointSetTypeRegistry.register(addon.key("SPHERE"), SphericalPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("CUBOID"), CuboidPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("CUBE"), CubePointSetTemplate::new); + + pointSetTypeRegistry.register(addon.key("UNION"), UnionPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("INTERSECTION"), IntersectionPointSetTemplate::new); + pointSetTypeRegistry.register(addon.key("DIFFERENCE"), DifferencePointSetTemplate::new); + + pointSetTypeRegistry.register(addon.key("EXPRESSION"), ExpressionFilterPointSetTemplate::new); + }) .then(event -> { CheckedRegistry>> samplerTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TYPE_TOKEN); CheckedRegistry> samplerRegistry = event.getPack().getOrCreateRegistry(LAYER_SAMPLER_TOKEN); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java new file mode 100644 index 0000000000..8379cce2e9 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/AdjacentPointSetTemplate.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative; + +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet; + + +public class AdjacentPointSetTemplate implements ObjectTemplate { + + @Override + public PointSet get() { + return new AdjacentPointSet(); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java new file mode 100644 index 0000000000..b8104cf07b --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.Set; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.SimplePointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class SimplePointSetTemplate implements ObjectTemplate { + + @Value("points") + private Set list; + + @Override + public PointSet get() { + return new SimplePointSet(list); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java new file mode 100644 index 0000000000..340dd1985d --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CubePointSetTemplate.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet; + + +public class CubePointSetTemplate implements ObjectTemplate { + + @Value("size") + private int size; + + @Override + public PointSet get() { + return new CuboidPointSet(-size, -size, -size, size, size, size); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java new file mode 100644 index 0000000000..457548a2ae --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/CuboidPointSetTemplate.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.CuboidPointSet; + + +public class CuboidPointSetTemplate implements ObjectTemplate { + + @Value("size.x") + private int xSize; + + @Value("size.y") + private int ySize; + + @Value("size.z") + private int zSize; + + @Override + public PointSet get() { + return new CuboidPointSet(-xSize, -ySize, -zSize, xSize, ySize, zSize); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java new file mode 100644 index 0000000000..b822f119f7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/geometric/SphericalPointSetTemplate.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.geometric; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric.SphericalPointSet; + + +public class SphericalPointSetTemplate implements ObjectTemplate { + + @Value("radius") + private double radius; + + @Override + public PointSet get() { + return new SphericalPointSet(radius); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java new file mode 100644 index 0000000000..5a381513e2 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/DifferencePointSetTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.List; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.DifferencePointSet; + + +public class DifferencePointSetTemplate implements ObjectTemplate { + + @Value("point-sets") + private List set; + + @Override + public PointSet get() { + return new DifferencePointSet(set); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java new file mode 100644 index 0000000000..ef30b76658 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/ExpressionFilterPointSetTemplate.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +import com.dfsek.paralithic.eval.tokenizer.ParseException; +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.ExpressionFilterPointSet; + + +public class ExpressionFilterPointSetTemplate implements ObjectTemplate { + + @Value("point-set") + private PointSet set; + + @Value("expression") + private String expression; + + @Override + public PointSet get() { + try { + return new ExpressionFilterPointSet(set, expression); + } catch(ParseException e) { + throw new RuntimeException("Failed to parse expression.", e); + } + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java new file mode 100644 index 0000000000..d860287e61 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/IntersectionPointSetTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.List; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.IntersectionPointSet; + + +public class IntersectionPointSetTemplate implements ObjectTemplate { + + @Value("point-sets") + private List sets; + + @Override + public PointSet get() { + return new IntersectionPointSet(sets); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java new file mode 100644 index 0000000000..2a4ba8ac97 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/operative/UnionPointSetTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.pointset.operative; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import java.util.List; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.operative.UnionPointSet; + + +public class UnionPointSetTemplate implements ObjectTemplate { + + @Value("point-sets") + private List sets; + + @Override + public PointSet get() { + return new UnionPointSet(sets); + } +} 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 63a6fe4da9..c9be753707 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 @@ -7,7 +7,7 @@ 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.layer.predicate.SamplerLayerPredicate.Operator; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; @@ -23,7 +23,7 @@ public class SamplerLayerPredicateTemplate implements ObjectTemplate sampler; - @Value("tests") - private List tests; + @Value("point-set") + private PointSet points; - @Value("default-threshold") + @Value("threshold") @Default private double defaultThreshold = 0; - @Value("default-operator") + @Value("operator") @Default - private Operator defaultOperator = Operator.GreaterThan; + private BooleanOperator defaultOperator = BooleanOperator.GreaterThan; @Override public LayerPredicate get() { - return new SamplerListLayerPredicate(sampler.get(), defaultOperator, tests); + return new SamplerListLayerPredicate(sampler.get(), defaultThreshold, defaultOperator, points); } } 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 e7de52e255..8143da5808 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 @@ -2,6 +2,7 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; @@ -12,57 +13,17 @@ public class SamplerLayerPredicate implements LayerPredicate { private final double threshold; - private final Operator operator; + private final BooleanOperator operator; - public SamplerLayerPredicate(LayerSampler sampler, Operator operator, double threshold) { + public SamplerLayerPredicate(LayerSampler sampler, BooleanOperator operator, double threshold) { this.sampler = sampler; this.operator = operator; this.threshold = threshold; } @Override - public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { - return operator.evaluate(sampler.sample(x, y, z, world, biomeProvider), threshold); + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { + return operator.evaluate(sampler.sample(x, y, z, worldProperties, biomeProvider), threshold); } - public enum Operator { - GreaterThan { - @Override - public boolean evaluate(double a, double b) { - return a > b; - } - }, - GreaterThanOrEqual { - @Override - public boolean evaluate(double a, double b) { - return a >= b; - } - }, - LessThan { - @Override - public boolean evaluate(double a, double b) { - return a < b; - } - }, - LessThanOrEqual { - @Override - public boolean evaluate(double a, double b) { - return a <= b; - } - }, - Equals { - @Override - public boolean evaluate(double a, double b) { - return a == b; - } - }, - NotEquals { - @Override - public boolean evaluate(double a, double b) { - return a != b; - } - }; - - public abstract boolean evaluate(double a, double b); - } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java index 173f796826..b34be1bcf8 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java @@ -1,59 +1,33 @@ package com.dfsek.terra.addons.chunkgenerator.layer.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 java.util.List; - 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.Operator; +import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; public class SamplerListLayerPredicate implements LayerPredicate { - private final List tests; - private final Operator operator; + private final Vector3Int[] points; + private final BooleanOperator operator; private final LayerSampler sampler; + private final double threshold; - public SamplerListLayerPredicate(LayerSampler sampler, Operator operator, List tests) { + public SamplerListLayerPredicate(LayerSampler sampler, double threshold, BooleanOperator operator, PointSet points) { this.sampler = sampler; + this.threshold = threshold; this.operator = operator; - this.tests = tests; + this.points = points.toArray(); } @Override - public boolean test(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { - for (CoordinateTest test : tests) { - if (operator.evaluate(sampler.sample(x + test.x, y + test.y, z + test.z, world, biomeProvider), test.threshold)) return true; + public boolean test(int x, int y, int z, WorldProperties worldProperties, BiomeProvider biomeProvider) { + for (Vector3Int point : points) { + if (operator.evaluate(sampler.sample(x + point.getX(), y + point.getY(), z + point.getZ(), worldProperties, biomeProvider), threshold)) return true; } return false; } - - public record CoordinateTest(int x, int y, int z, double threshold) { - - public static class Template implements ObjectTemplate { - - @Value("x") - private int x; - - @Value("y") - private int y; - - @Value("z") - private int z; - - @Value("threshold") - @Default - private double threshold = 0; - - @Override - public CoordinateTest get() { - return new CoordinateTest(x, y, z, threshold); - } - } - } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java new file mode 100644 index 0000000000..7c013ac766 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/BooleanOperator.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.addons.chunkgenerator.math; + +public enum BooleanOperator { + GreaterThan { + @Override + public boolean evaluate(double a, double b) { + return a > b; + } + }, + GreaterThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a >= b; + } + }, + LessThan { + @Override + public boolean evaluate(double a, double b) { + return a < b; + } + }, + LessThanOrEqual { + @Override + public boolean evaluate(double a, double b) { + return a <= b; + } + }, + Equals { + @Override + public boolean evaluate(double a, double b) { + return a == b; + } + }, + NotEquals { + @Override + public boolean evaluate(double a, double b) { + return a != b; + } + }; + + public abstract boolean evaluate(double a, double b); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java new file mode 100644 index 0000000000..16466fd6ac --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset; + +import java.util.function.Supplier; +import java.util.stream.Stream; + +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public interface PointSet extends Supplier> { + + default Vector3Int[] toArray() { + return this.get().distinct().toArray(Vector3Int[]::new); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java new file mode 100644 index 0000000000..e6788a455a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative; + +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class AdjacentPointSet implements PointSet { + @Override + public Stream get() { + return Stream.of( + Vector3Int.of(0, 0, -1), + Vector3Int.of(0, 0, 1), + Vector3Int.of(0, -1, 0), + Vector3Int.of(0, 1, 0), + Vector3Int.of(-1, 0, 0), + Vector3Int.of(1, 0, 0) + ); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java new file mode 100644 index 0000000000..e1e50bdc08 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative; + +import java.util.Set; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class SimplePointSet implements PointSet { + + private final Stream points; + + public SimplePointSet(Set points) { + this.points = points.stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java new file mode 100644 index 0000000000..08e8d746f4 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric; + +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class CuboidPointSet implements PointSet { + + private final Stream points; + + public CuboidPointSet(int x1, int y1, int z1, int x2, int y2, int z2) { + Set points = new HashSet<>(); + for (int x = x1; x <= x2; x = x + 1) { + for (int y = y1; y <= y2; y = y + 1) { + for (int z = z1; z <= z2; z = z + 1) { + points.add(Vector3Int.of(x, y, z)); + } + } + } + this.points = points.stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java new file mode 100644 index 0000000000..5621fadef9 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric; + +import net.jafama.FastMath; + +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class SphericalPointSet implements PointSet { + + private final Stream points; + + public SphericalPointSet(double radius) { + Stream.Builder streamBuilder = Stream.builder(); + int roundedRadius = FastMath.ceilToInt(radius); + for(int x = -roundedRadius; x <= roundedRadius; x++) { + for(int y = -roundedRadius; y <= roundedRadius; y++) { + for(int z = -roundedRadius; z <= roundedRadius; z++) { + Vector3Int pos = Vector3Int.of(x, y, z); + double length = pos.toVector3().length(); + if (length == 0) continue; + if (length > radius) continue; + streamBuilder.add(pos); + } + } + } + this.points = streamBuilder.build(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java new file mode 100644 index 0000000000..ed958bf1a7 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +import com.google.common.collect.Sets; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class DifferencePointSet implements PointSet { + + private final Stream points; + + public DifferencePointSet(List sets) { + points = sets.stream() + .map(PointSet::get) + .map(s -> s.collect(Collectors.toSet())) + .reduce(Sets::difference).orElse(Collections.emptySet()) + .stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java new file mode 100644 index 0000000000..8906446e99 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +import com.dfsek.paralithic.Expression; +import com.dfsek.paralithic.eval.parser.Parser; +import com.dfsek.paralithic.eval.parser.Scope; +import com.dfsek.paralithic.eval.tokenizer.ParseException; + +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + + +public class ExpressionFilterPointSet implements PointSet { + + private final Stream points; + + public ExpressionFilterPointSet(PointSet set, String eq) throws ParseException { + Parser parser = new Parser(); + Scope scope = new Scope(); + scope.addInvocationVariable("x"); + scope.addInvocationVariable("y"); + scope.addInvocationVariable("z"); + Expression expression = parser.parse(eq, scope); + this.points = set.get().filter(v -> expression.evaluate(v.getX(), v.getY(), v.getZ()) == 1); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java new file mode 100644 index 0000000000..0dbe0c498c --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +import com.google.common.collect.Sets; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class IntersectionPointSet implements PointSet { + + private final Stream points; + + public IntersectionPointSet(List sets) { + points = sets.stream() + .map(PointSet::get) + .map(s -> s.collect(Collectors.toSet())) + .reduce(Sets::intersection).orElse(Collections.emptySet()) + .stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java new file mode 100644 index 0000000000..bd01c1c68f --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.addons.chunkgenerator.math.pointset.operative; + +import com.google.common.collect.Sets; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3Int; + +public class UnionPointSet implements PointSet { + + private final Stream points; + + public UnionPointSet(List sets) { + points = sets.stream() + .map(PointSet::get) + .map(s -> s.collect(Collectors.toSet())) + .reduce(Sets::union).orElse(Collections.emptySet()) + .stream(); + } + + @Override + public Stream get() { + return points; + } +} diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 7ed3f2e75c..b457594d8a 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -52,10 +52,10 @@ loom { launches { named("client") { - property("fabric.log.level", "debug") + property("fabric.log.level", "info") } named("server") { - property("fabric.log.level", "debug") + property("fabric.log.level", "info") } } } From 596c84ab101aa3579138324ec986350d11da8450 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 11:59:15 +1000 Subject: [PATCH 17/26] Forgot signature change in chunk generator --- .../chunkgenerator/generation/LayeredChunkGenerator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 index c89766682a..ae096ca6f7 100644 --- 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 @@ -61,7 +61,7 @@ public void generateChunkData(@NotNull ProtoChunk chunk, @NotNull WorldPropertie } previousLayerPalette = layerPalette; - chunk.setBlock(cx, y, cz, layerPalette.get(seed, biome, cx, y, cz) + chunk.setBlock(cx, y, cz, layerPalette.get(cx, y, cz, world, biomeProvider) .get(paletteLevel, cx, y, cz, seed)); } } @@ -76,7 +76,7 @@ public BlockState getBlock(WorldProperties world, int x, int y, int z, BiomeProv Biome biome = biomeProvider.getBiome(x, y, z, seed); int layer = 0; // Default to layer 0 for now return resolver.resolve(x, y, z, world, biomeProvider) - .get(seed, biome, x, y, z) + .get(x, y, z, world, biomeProvider) .get(layer, x, y, z, seed); } @@ -85,6 +85,6 @@ public Palette getPalette(int x, int y, int z, WorldProperties world, BiomeProvi long seed = world.getSeed(); Biome biome = biomeProvider.getBiome(x, y, z, seed); return resolver.resolve(x, y, z, world, biomeProvider) - .get(seed, biome, x, y, z); + .get(x, y, z, world, biomeProvider); } } From 9a171b0cdb197663e8ec84291cd96728db3c2860 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 12:00:54 +1000 Subject: [PATCH 18/26] Implement dot product layer palette --- .../LayeredChunkGeneratorAddon.java | 32 ++++++-------- .../DotProductLayerPaletteTemplate.java | 44 +++++++++++++++++++ .../layer/palette/DotProductLayerPalette.java | 43 ++++++++++++++++++ .../palette/DoubleNavigableHolder.java | 34 ++++++++++++++ 4 files changed, 135 insertions(+), 18 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.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 8445945779..b2bf49e76b 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 @@ -15,6 +15,7 @@ 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.BiomeDefinedLayerPaletteTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.palette.DotProductLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.PlatformAirLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.palette.SimpleLayerPaletteTemplate; import com.dfsek.terra.addons.chunkgenerator.config.pointset.generative.AdjacentPointSetTemplate; @@ -36,8 +37,6 @@ import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerLayerPredicate; -import com.dfsek.terra.addons.chunkgenerator.layer.predicate.SamplerListLayerPredicate.CoordinateTest; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; @@ -124,11 +123,24 @@ public void initialize() { samplerRegistry.register(addon.key(key), new InstanceWrapper<>(sampler)); }); }) + .then(event -> { + CheckedRegistry>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN); + predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); + predicateTypeRegistry.register(addon.key("SAMPLER_POINTS"), SamplerListLayerPredicateTemplate::new); + + CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); + event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { + predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); + }); + }) .then(event -> { CheckedRegistry>> paletteTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PALETTE_TYPE_TOKEN); paletteTypeRegistry.register(addon.key("PALETTE"), SimpleLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerPaletteTemplate::new); paletteTypeRegistry.register(addon.key("AIR"), () -> new PlatformAirLayerPaletteTemplate(platform)); + paletteTypeRegistry.register(addon.key("SURFACE_NORMAL"), DotProductLayerPaletteTemplate::new); event.getPack().applyLoader(LayerPalette.Group.class, new LayerPalette.Group.Loader(event.getPack())); @@ -137,22 +149,6 @@ public void initialize() { paletteRegistry.register(addon.key(key), new InstanceWrapper<>(palette)); }); }) - .then(event -> { - CheckedRegistry>> predicateTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TYPE_TOKEN); - predicateTypeRegistry.register(addon.key("BELOW"), BelowLayerPredicateTemplate::new); - predicateTypeRegistry.register(addon.key("RANGE"), RangeLayerPredicateTemplate::new); - predicateTypeRegistry.register(addon.key("SAMPLER"), SamplerLayerPredicateTemplate::new); - predicateTypeRegistry.register(addon.key("SAMPLER_LIST"), SamplerListLayerPredicateTemplate::new); - - event.getPack().applyLoader(CoordinateTest.class, CoordinateTest.Template::new) - .applyLoader(SamplerLayerPredicate.Operator.class, - (type, o, loader, depthTracker) -> SamplerLayerPredicate.Operator.valueOf((String) o)); - - CheckedRegistry> predicateRegistry = event.getPack().getOrCreateRegistry(LAYER_PREDICATE_TOKEN); - event.loadTemplate(new LayerPredicatePackConfigTemplate()).getPredicates().forEach((key, predicate) -> { - predicateRegistry.register(addon.key(key), new InstanceWrapper<>(predicate)); - }); - }) .then(event -> { CheckedRegistry>> resolverTypeRegistry = event.getPack().getOrCreateRegistry(LAYER_RESOLVER_TYPE_TOKEN); resolverTypeRegistry.register(addon.key("TEST"), PredicateLayerResolverTemplate::new); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java new file mode 100644 index 0000000000..6d8fed140d --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.addons.chunkgenerator.config.palette; + +import com.dfsek.tectonic.api.config.template.annotations.Default; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import java.util.HashMap; +import java.util.Map; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.palette.DotProductLayerPalette; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.AdjacentPointSet; +import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder; +import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; + + +public class DotProductLayerPaletteTemplate extends LayerPaletteTemplate { + + @Value("normal.approximation-points") + @Default + private PointSet normalApproximationPoints = new AdjacentPointSet(); + + @Value("normal.direction") + @Default + private Vector3 direction = Vector3.of(0, 1, 0); + + @Value("normal.sampler") + private InstanceWrapper sampler; + + @Value("palettes") + private Map palettes; + + @Override + public LayerPalette get() { + Map paletteMap = new HashMap<>(); + palettes.forEach((s, p) -> { + paletteMap.put(Double.parseDouble(s), p); + }); + return new DotProductLayerPalette(group, resetsGroup, normalApproximationPoints, new DoubleNavigableHolder<>(paletteMap), sampler.get(), direction); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java new file mode 100644 index 0000000000..8da5d5f7b5 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.palette; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerPalette; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; +import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder; +import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.chunk.generation.util.Palette; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class DotProductLayerPalette extends LayerPalette { + + private static final Logger logger = LoggerFactory.getLogger(DotProductLayerPalette.class); + private final DoubleNavigableHolder palettes; + private final Vector3Int[] samplePoints; + private final LayerSampler sampler; + private final Vector3 direction; + + public DotProductLayerPalette(Group group, boolean resetsGroup, + PointSet points, DoubleNavigableHolder palettes, LayerSampler sampler, Vector3 direction) { + super(group, resetsGroup); + this.palettes = palettes; + this.sampler = sampler; + this.direction = direction; + this.samplePoints = points.toArray(); + } + + @Override + public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + Vector3.Mutable surfaceNormalApproximation = Vector3.Mutable.of(0, 0, 0); + for(Vector3Int point : samplePoints) { + double scalar = -sampler.sample(x+point.getX(), y+point.getY(), z+point.getZ(), world, biomeProvider); + surfaceNormalApproximation.add(point.toVector3Mutable().multiply(scalar)); + } + return palettes.get(direction.dot(surfaceNormalApproximation.normalize())); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.java new file mode 100644 index 0000000000..2f0a9f91b0 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/palette/DoubleNavigableHolder.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.addons.chunkgenerator.palette; + +import java.util.Map; +import java.util.NavigableMap; +import java.util.TreeMap; + + +public class DoubleNavigableHolder { + + private final NavigableMap map; + + public DoubleNavigableHolder(Map inputMap) { + NavigableMap map = new TreeMap<>(inputMap); + map.put(Double.MAX_VALUE, map.lastEntry().getValue()); + this.map = map; + } + + public T get(double threshold) { + return map.ceilingEntry(threshold).getValue(); + } + + enum Method { + CEILING, + FLOOR, + CLOSEST + } + + public class Single extends DoubleNavigableHolder { + + public Single(Map inputMap) { + super(inputMap); + } + } +} From c2902cc549d0b5e2b0c7dfb39318498123e00f04 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 12:01:10 +1000 Subject: [PATCH 19/26] Add paralithic as layered gen dependency --- common/addons/chunk-generator-layered/build.gradle.kts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/addons/chunk-generator-layered/build.gradle.kts b/common/addons/chunk-generator-layered/build.gradle.kts index b26c61a77a..4065850b0c 100644 --- a/common/addons/chunk-generator-layered/build.gradle.kts +++ b/common/addons/chunk-generator-layered/build.gradle.kts @@ -2,6 +2,7 @@ version = version("0.1.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) + api("com.dfsek", "paralithic", Versions.Libraries.paralithic) implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) @@ -9,4 +10,5 @@ dependencies { tasks.named("shadowJar") { relocate("net.jafama", "com.dfsek.terra.addons.chunkgenerator.lib.jafama") + relocate("com.dfsek.paralithic", "com.dfsek.terra.addons.chunkgenerator.lib.paralithic") } From bd139a8edcdc5da0d030a8d51d0ae422c076c7f4 Mon Sep 17 00:00:00 2001 From: Astrash Date: Sat, 30 Jul 2022 12:08:21 +1000 Subject: [PATCH 20/26] BooleanOperator -> RelationalOperator --- .../LayeredChunkGeneratorAddon.java | 6 +++--- .../SamplerLayerPredicateTemplate.java | 4 ++-- .../SamplerListLayerPredicateTemplate.java | 4 ++-- .../predicate/SamplerLayerPredicate.java | 8 ++++---- .../predicate/SamplerListLayerPredicate.java | 8 ++++---- ...nOperator.java => RelationalOperator.java} | 19 +++++++++++-------- .../util/DoubleBiPredicate.java | 6 ++++++ 7 files changed, 32 insertions(+), 23 deletions(-) rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/{BooleanOperator.java => RelationalOperator.java} (52%) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.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 b2bf49e76b..4a22c40241 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 @@ -38,7 +38,7 @@ import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; -import com.dfsek.terra.addons.chunkgenerator.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.manifest.api.AddonInitializer; @@ -95,8 +95,8 @@ public void initialize() { .register(addon, ConfigPackPreLoadEvent.class) .priority(1000) .then(event -> { - event.getPack().applyLoader(BooleanOperator.class, - (type, o, loader, depthTracker) -> BooleanOperator.valueOf((String) o)); + event.getPack().applyLoader(RelationalOperator.class, + (type, o, loader, depthTracker) -> RelationalOperator.valueOf((String) o)); CheckedRegistry>> pointSetTypeRegistry = event.getPack().getOrCreateRegistry( POINT_SET_TYPE_TOKEN); 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 c9be753707..4477acaedc 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 @@ -7,7 +7,7 @@ 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.math.BooleanOperator; +import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.api.config.meta.Meta; @@ -23,7 +23,7 @@ public class SamplerLayerPredicateTemplate implements ObjectTemplate b; } }, GreaterThanOrEqual { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a >= b; } }, LessThan { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a < b; } }, LessThanOrEqual { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a <= b; } }, Equals { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a == b; } }, NotEquals { @Override - public boolean evaluate(double a, double b) { + public boolean test(double a, double b) { return a != b; } }; - public abstract boolean evaluate(double a, double b); + public abstract boolean test(double a, double b); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.java new file mode 100644 index 0000000000..948a0fc32f --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/util/DoubleBiPredicate.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.addons.chunkgenerator.util; + +@FunctionalInterface +public interface DoubleBiPredicate { + boolean test(double a, double b); +} From f04c9b3e7383f4d9139d18a0c027bb5fe0771e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Thu, 5 Jun 2025 22:40:11 -0600 Subject: [PATCH 21/26] Fix build --- .../chunk-generator-layered/build.gradle.kts | 3 --- .../DotProductLayerPaletteTemplate.java | 2 +- .../generative/SimplePointSetTemplate.java | 2 +- .../RangeLayerPredicateTemplate.java | 2 +- .../BiomeDefinedLayerSamplerTemplate.java | 4 ++-- .../sampler/SimpleLayerSamplerTemplate.java | 4 ++-- .../layer/palette/DotProductLayerPalette.java | 6 +++--- .../layer/predicate/RangeLayerPredicate.java | 2 +- .../predicate/SamplerListLayerPredicate.java | 2 +- .../sampler/BiomeDefinedLayerSampler.java | 20 +++++++++---------- .../layer/sampler/SimpleLayerSampler.java | 8 ++++---- .../math/pointset/PointSet.java | 2 +- .../pointset/generative/AdjacentPointSet.java | 2 +- .../pointset/generative/SimplePointSet.java | 2 +- .../generative/geometric/CuboidPointSet.java | 2 +- .../geometric/SphericalPointSet.java | 10 +++++----- .../operative/DifferencePointSet.java | 2 +- .../operative/ExpressionFilterPointSet.java | 2 +- .../operative/IntersectionPointSet.java | 2 +- .../pointset/operative/UnionPointSet.java | 2 +- .../config/loaders/Vector3IntLoader.java | 2 +- .../terra/config/loaders/Vector3Loader.java | 2 +- platforms/fabric/build.gradle.kts | 10 ---------- 23 files changed, 41 insertions(+), 54 deletions(-) diff --git a/common/addons/chunk-generator-layered/build.gradle.kts b/common/addons/chunk-generator-layered/build.gradle.kts index 4065850b0c..29e3850bca 100644 --- a/common/addons/chunk-generator-layered/build.gradle.kts +++ b/common/addons/chunk-generator-layered/build.gradle.kts @@ -3,9 +3,6 @@ version = version("0.1.0") dependencies { compileOnlyApi(project(":common:addons:manifest-addon-loader")) api("com.dfsek", "paralithic", Versions.Libraries.paralithic) - - implementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) - testImplementation("net.jafama", "jafama", Versions.Libraries.Internal.jafama) } tasks.named("shadowJar") { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java index 6d8fed140d..400cc5dc95 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/palette/DotProductLayerPaletteTemplate.java @@ -13,7 +13,7 @@ import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder; import com.dfsek.terra.addons.chunkgenerator.util.InstanceWrapper; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3; import com.dfsek.terra.api.world.chunk.generation.util.Palette; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java index b8104cf07b..825c4724e0 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/pointset/generative/SimplePointSetTemplate.java @@ -7,7 +7,7 @@ import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; import com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.SimplePointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class SimplePointSetTemplate implements ObjectTemplate { 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 index fec9f8a77a..37904c5411 100644 --- 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 @@ -5,7 +5,7 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; import com.dfsek.terra.addons.chunkgenerator.layer.predicate.RangeLayerPredicate; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; public class RangeLayerPredicateTemplate implements ObjectTemplate { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java index 4fb7965c30..510aaeef2a 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java @@ -7,14 +7,14 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; import com.dfsek.terra.api.config.meta.Meta; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; public class BiomeDefinedLayerSamplerTemplate implements ObjectTemplate { @Value("default") @Default - private @Meta NoiseSampler defaultSampler = null; + private @Meta Sampler defaultSampler = null; @Override public LayerSampler get() { 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 index 46bd115d63..3efa80e590 100644 --- 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 @@ -6,13 +6,13 @@ 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; +import com.dfsek.seismic.type.sampler.Sampler; public class SimpleLayerSamplerTemplate implements ObjectTemplate { @Value("sampler") - private @Meta NoiseSampler sampler; + private @Meta Sampler sampler; @Override public LayerSampler get() { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java index 8da5d5f7b5..1a8b0c2e64 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/palette/DotProductLayerPalette.java @@ -7,8 +7,8 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; import com.dfsek.terra.addons.chunkgenerator.palette.DoubleNavigableHolder; -import com.dfsek.terra.api.util.vector.Vector3; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.util.Palette; import com.dfsek.terra.api.world.info.WorldProperties; @@ -36,7 +36,7 @@ public Palette get(int x, int y, int z, WorldProperties world, BiomeProvider bio Vector3.Mutable surfaceNormalApproximation = Vector3.Mutable.of(0, 0, 0); for(Vector3Int point : samplePoints) { double scalar = -sampler.sample(x+point.getX(), y+point.getY(), z+point.getZ(), world, biomeProvider); - surfaceNormalApproximation.add(point.toVector3Mutable().multiply(scalar)); + surfaceNormalApproximation.add(point.toFloat().mutable().mulScalar(scalar)); } return palettes.get(direction.dot(surfaceNormalApproximation.normalize())); } 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 index c7d108a118..c08eaf6eee 100644 --- 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 @@ -1,7 +1,7 @@ package com.dfsek.terra.addons.chunkgenerator.layer.predicate; import com.dfsek.terra.addons.chunkgenerator.api.LayerPredicate; -import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.util.range.Range; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java index a0796be8c7..7ec83ca35e 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/predicate/SamplerListLayerPredicate.java @@ -4,7 +4,7 @@ import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.addons.chunkgenerator.math.RelationalOperator; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java index 804acdf0df..3c5390aaa4 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java @@ -3,7 +3,7 @@ import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate; import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; -import javax.annotation.Nullable; +import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; @@ -14,7 +14,7 @@ import com.dfsek.terra.addons.chunkgenerator.LayeredChunkGeneratorAddon; import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent; -import com.dfsek.terra.api.noise.NoiseSampler; +import com.dfsek.seismic.type.sampler.Sampler; import com.dfsek.terra.api.properties.Properties; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; @@ -23,9 +23,9 @@ public class BiomeDefinedLayerSampler implements LayerSampler { - private final NoiseSampler defaultSampler; + private final Sampler defaultSampler; - public BiomeDefinedLayerSampler(@Nullable NoiseSampler defaultSampler) { + public BiomeDefinedLayerSampler(@Nullable Sampler defaultSampler) { this.defaultSampler = defaultSampler; } @@ -36,10 +36,10 @@ public double sample(int x, int y, int z, WorldProperties world, BiomeProvider b .get(BiomeLayerSamplers.class) .samplers() .get(this) - .noise(world.getSeed(), x, y, z); + .getSample(world.getSeed(), x, y, z); } - private Optional getDefaultSampler() { + private Optional getDefaultSampler() { return Optional.ofNullable(defaultSampler); } @@ -56,7 +56,7 @@ private Optional getDefaultSampler() { String id = registryKey.getID(); String fieldName = id + "LayerSampler"; samplerFields.put(biomeLayerSampler, fieldName); - DynamicValue.Builder value = DynamicValue.builder("generation.samplers." + id, NoiseSampler.class); + DynamicValue.Builder value = DynamicValue.builder("generation.samplers." + id, Sampler.class); biomeLayerSampler.getDefaultSampler().ifPresent(value::setDefault); templateBuilder.value(fieldName, value.build()); } @@ -64,12 +64,12 @@ private Optional getDefaultSampler() { DynamicTemplate layerSamplerBiomeTemplate = event.load(templateBuilder.build()); - Map samplerMap = samplerFields.entrySet().stream().collect( - Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), NoiseSampler.class))); + Map samplerMap = samplerFields.entrySet().stream().collect( + Collectors.toMap(Entry::getKey, entry -> layerSamplerBiomeTemplate.get(entry.getValue(), Sampler.class))); event.getLoadedObject(Biome.class).getContext().put(new BiomeLayerSamplers(samplerMap)); } }; - public record BiomeLayerSamplers(Map samplers) implements Properties { + public record BiomeLayerSamplers(Map samplers) implements Properties { } } 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 index 40177b0b22..3dd1de70f4 100644 --- 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 @@ -1,21 +1,21 @@ 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.seismic.type.sampler.Sampler; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; public class SimpleLayerSampler implements LayerSampler { - private NoiseSampler sampler; + private Sampler sampler; - public SimpleLayerSampler(NoiseSampler sampler) { + public SimpleLayerSampler(Sampler sampler) { this.sampler = sampler; } @Override public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { - return sampler.noise(world.getSeed(), x, y, z); + return sampler.getSample(world.getSeed(), x, y, z); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java index 16466fd6ac..bd00a19593 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/PointSet.java @@ -3,7 +3,7 @@ import java.util.function.Supplier; import java.util.stream.Stream; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public interface PointSet extends Supplier> { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java index e6788a455a..cf1d739715 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/AdjacentPointSet.java @@ -3,7 +3,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class AdjacentPointSet implements PointSet { @Override diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java index e1e50bdc08..c962e09a44 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/SimplePointSet.java @@ -4,7 +4,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class SimplePointSet implements PointSet { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java index 08e8d746f4..25ac2430bd 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/CuboidPointSet.java @@ -5,7 +5,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class CuboidPointSet implements PointSet { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java index 5621fadef9..859112d6ec 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/generative/geometric/SphericalPointSet.java @@ -1,11 +1,11 @@ package com.dfsek.terra.addons.chunkgenerator.math.pointset.generative.geometric; -import net.jafama.FastMath; - import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.type.DistanceFunction; public class SphericalPointSet implements PointSet { @@ -14,12 +14,12 @@ public class SphericalPointSet implements PointSet { public SphericalPointSet(double radius) { Stream.Builder streamBuilder = Stream.builder(); - int roundedRadius = FastMath.ceilToInt(radius); + int roundedRadius = FloatingPointFunctions.ceil(radius); for(int x = -roundedRadius; x <= roundedRadius; x++) { for(int y = -roundedRadius; y <= roundedRadius; y++) { for(int z = -roundedRadius; z <= roundedRadius; z++) { Vector3Int pos = Vector3Int.of(x, y, z); - double length = pos.toVector3().length(); + double length = pos.toFloat().length(DistanceFunction.Euclidean); if (length == 0) continue; if (length > radius) continue; streamBuilder.add(pos); diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java index ed958bf1a7..4649f0a3c6 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/DifferencePointSet.java @@ -8,7 +8,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class DifferencePointSet implements PointSet { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java index 8906446e99..f91d5180ac 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/ExpressionFilterPointSet.java @@ -8,7 +8,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class ExpressionFilterPointSet implements PointSet { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java index 0dbe0c498c..a7ea9c5c67 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/IntersectionPointSet.java @@ -8,7 +8,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class IntersectionPointSet implements PointSet { diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java index bd01c1c68f..c808ba2e37 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/math/pointset/operative/UnionPointSet.java @@ -8,7 +8,7 @@ import java.util.stream.Stream; import com.dfsek.terra.addons.chunkgenerator.math.pointset.PointSet; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class UnionPointSet implements PointSet { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java index 06d470594e..74b720b825 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3IntLoader.java @@ -10,7 +10,7 @@ import java.util.List; import java.util.Map; -import com.dfsek.terra.api.util.vector.Vector3Int; +import com.dfsek.seismic.type.vector.Vector3Int; public class Vector3IntLoader implements TypeLoader { diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java index cdfffe15ad..38b1a7a7e1 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/Vector3Loader.java @@ -10,7 +10,7 @@ import java.util.List; import java.util.Map; -import com.dfsek.terra.api.util.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3; public class Vector3Loader implements TypeLoader { diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index b8a52b02e8..1738c17c60 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -38,16 +38,6 @@ loom { mixin { defaultRefmapName.set("terra.fabric.refmap.json") } - - launches { - named("client") { - property("fabric.log.level", "info") - } - named("server") { - property("fabric.log.level", "info") - } - } - } From bc1213b2200a4accd9395745aa283fa8dfbe7f4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Thu, 5 Jun 2025 22:44:07 -0600 Subject: [PATCH 22/26] Use Seismic function for perf --- .../addons/biome/pipeline/PipelineBiomeProvider.java | 4 ++-- .../addons/biome/pipeline/pipeline/BiomeChunkImpl.java | 4 +++- .../math/interpolation/LazilyEvaluatedInterpolator.java | 5 +++-- .../java/com/dfsek/terra/addons/ore/ores/VanillaOre.java | 3 ++- .../terra/addons/image/operator/DistanceTransform.java | 4 +++- .../terrascript/script/functions/GetMarkFunction.java | 6 ++++-- .../terrascript/script/functions/SetMarkFunction.java | 8 +++++--- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java index c045c905a0..f6704e9cde 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/PipelineBiomeProvider.java @@ -83,8 +83,8 @@ public Biome getBiome(int x, int y, int z, long seed) { public Biome getBiome(int x, int z, long seed) { - x += mutator.getSample(seed + 1, x, z) * noiseAmp; - z += mutator.getSample(seed + 2, x, z) * noiseAmp; + x += (int) (mutator.getSample(seed + 1, x, z) * noiseAmp); + z += (int) (mutator.getSample(seed + 2, x, z) * noiseAmp); x /= resolution; z /= resolution; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java index 6781908969..8fa8ab651e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/pipeline/BiomeChunkImpl.java @@ -2,6 +2,8 @@ import java.util.List; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.biome.pipeline.api.BiomeChunk; import com.dfsek.terra.addons.biome.pipeline.api.Expander; import com.dfsek.terra.addons.biome.pipeline.api.Stage; @@ -98,7 +100,7 @@ protected static int calculateChunkOriginArrayIndex(int totalExpanderCount, List // chunk samples points on the same overall grid. // Without this, shared chunk borders (required because of adjacent cell reads) will not be identical // because points would be sampled on grids at different offsets, resulting in artifacts at borders. - return (int) Math.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval; + return FloatingPointFunctions.ceil((double) finalGridOrigin / initialGridInterval) * initialGridInterval; } private static int calculateFinalGridOrigin(int totalExpanderCount, List stages) { diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java index dcab4df141..9473872982 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/LazilyEvaluatedInterpolator.java @@ -1,5 +1,6 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties; @@ -28,8 +29,8 @@ public LazilyEvaluatedInterpolator(BiomeProvider biomeProvider, int cx, int cz, PropertyKey noisePropertiesKey, int min, int horizontalRes, int verticalRes, long seed) { this.noisePropertiesKey = noisePropertiesKey; - int hSamples = (int) Math.ceil(16.0 / horizontalRes); - int vSamples = (int) Math.ceil((double) (max - min) / verticalRes); + int hSamples = FloatingPointFunctions.ceil(16.0 / horizontalRes); + int vSamples = FloatingPointFunctions.ceil((double) (max - min) / verticalRes); this.zMul = (hSamples + 1); this.yMul = zMul * zMul; samples = new Double[yMul * (vSamples + 1)]; diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java index 84ff59543f..15eb6b3c36 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/ores/VanillaOre.java @@ -11,6 +11,7 @@ import java.util.Map; import java.util.random.RandomGenerator; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; import com.dfsek.seismic.math.trigonometry.TrigonometryFunctions; import com.dfsek.seismic.type.Rotation; @@ -104,7 +105,7 @@ public boolean generate(Vector3Int location, WritableWorld world, RandomGenerato } } - int outset = (int) Math.ceil((size / 16.0F * 2.0F + 1.0F) / 2.0F); + int outset = FloatingPointFunctions.ceil((size / 16.0F * 2.0F + 1.0F) / 2.0F); int x = (int) (location.getX() - Math.ceil(eighthSize) - outset); int y = location.getY() - 2 - outset; int z = (int) (location.getZ() - Math.ceil(eighthSize) - outset); diff --git a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java index f9818c80f4..93f4b2bc34 100644 --- a/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java +++ b/common/addons/library-image/src/main/java/com/dfsek/terra/addons/image/operator/DistanceTransform.java @@ -1,5 +1,7 @@ package com.dfsek.terra.addons.image.operator; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.image.image.Image; import com.dfsek.terra.addons.image.util.ColorUtil; import com.dfsek.terra.addons.image.util.ColorUtil.Channel; @@ -232,7 +234,7 @@ public Noise(DistanceTransform transform, Normalization normalization) { @Override public double getSample(long seed, double x, double y) { if(x < 0 || y < 0 || x >= transform.width || y >= transform.height) return transform.minDistance; - return transform.distances[(int) Math.floor(x)][(int) Math.floor(y)]; + return transform.distances[FloatingPointFunctions.floor(x)][FloatingPointFunctions.floor(y)]; } @Override diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java index b98dda159e..917a133e8c 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/GetMarkFunction.java @@ -7,6 +7,8 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; @@ -34,9 +36,9 @@ public String apply(ImplementationArguments implementationArguments, Scope scope Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - String mark = arguments.getMark(Vector3.of((int) Math.floor(xz.getX()), (int) Math.floor( + String mark = arguments.getMark(Vector3.of(FloatingPointFunctions.floor(xz.getX()), FloatingPointFunctions.floor( y.apply(implementationArguments, scope).doubleValue()), - (int) Math.floor(xz.getZ())) + FloatingPointFunctions.floor(xz.getZ())) .mutable() .add(arguments.getOrigin().toFloat()) .immutable()); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java index 905ff23aef..a485094b37 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/SetMarkFunction.java @@ -7,6 +7,8 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; @@ -37,10 +39,10 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - arguments.setMark(Vector3.of((int) Math.floor(xz.getX()), - (int) Math.floor( + arguments.setMark(Vector3.of(FloatingPointFunctions.floor(xz.getX()), + FloatingPointFunctions.floor( y.apply(implementationArguments, scope).doubleValue()), - (int) Math.floor(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(), + FloatingPointFunctions.floor(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(), mark.apply(implementationArguments, scope)); return null; } From 0e211065bc1aab930032c2b3bb3684b6df31b94a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Thu, 5 Jun 2025 22:44:19 -0600 Subject: [PATCH 23/26] Fix build again --- .../main/java/com/dfsek/terra/config/GenericLoaders.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java index bd8c6deadd..b7ec12691f 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -20,6 +20,8 @@ import ca.solostudios.strata.version.Version; import ca.solostudios.strata.version.VersionRange; import com.dfsek.paralithic.eval.parser.Parser.ParseOptions; +import com.dfsek.seismic.type.vector.Vector3; +import com.dfsek.seismic.type.vector.Vector3Int; import com.dfsek.tectonic.api.TypeRegistry; import java.util.LinkedHashMap; @@ -58,10 +60,9 @@ public void register(TypeRegistry registry) { .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(VersionRange.class, new VersionRangeLoader()) .registerLoader(LinkedHashMap.class, new LinkedHashMapLoader()) - .registerLoader(ParseOptions.class, ExpressionParserOptionsTemplate::new); - - .registerLoader(Vector3.class, new Vector3Loader()) - .registerLoader(Vector3Int.class, new Vector3IntLoader()); + .registerLoader(ParseOptions.class, ExpressionParserOptionsTemplate::new) + .registerLoader(Vector3.class, new Vector3Loader()) + .registerLoader(Vector3Int.class, new Vector3IntLoader()); if(platform != null) { registry.registerLoader(BaseAddon.class, platform.getAddons()) .registerLoader(BlockType.class, (type, object, configLoader, depthTracker) -> platform From 619c2156cd82d4f69c2d636aeafc3a755081ad3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Thu, 5 Jun 2025 22:47:16 -0600 Subject: [PATCH 24/26] Use seismic func for perf 2 --- .../generation/math/samplers/Sampler3D.java | 4 +++- .../terrascript/script/functions/BiomeFunction.java | 5 +++-- .../terrascript/script/functions/BlockFunction.java | 5 +++-- .../terrascript/script/functions/CheckBlockFunction.java | 6 ++++-- .../terrascript/script/functions/LootFunction.java | 5 +++-- .../terrascript/script/functions/PullFunction.java | 6 ++++-- .../terrascript/script/functions/StateFunction.java | 5 +++-- .../terrascript/script/functions/StructureFunction.java | 9 +++++---- .../terra/addon/terrascript/check/CheckFunction.java | 6 ++++-- 9 files changed, 32 insertions(+), 19 deletions(-) diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java index 90d69461a6..cdab4e40a9 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/samplers/Sampler3D.java @@ -7,6 +7,8 @@ package com.dfsek.terra.addons.chunkgenerator.generation.math.samplers; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.chunkgenerator.config.noise.BiomeNoiseProperties; import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ChunkInterpolator; import com.dfsek.terra.addons.chunkgenerator.generation.math.interpolation.ElevationInterpolator; @@ -26,7 +28,7 @@ public Sampler3D(int x, int z, long seed, int minHeight, int maxHeight, BiomePro } public double sample(double x, double y, double z) { - return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation((int) Math.round(x), (int) Math.round(z)); + return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FloatingPointFunctions.round(x), FloatingPointFunctions.round(z)); } public double sample(int x, int y, int z) { diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java index 14cb8b3816..3ab8b7c5f1 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BiomeFunction.java @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import com.dfsek.seismic.type.vector.Vector2; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; @@ -45,9 +46,9 @@ public String apply(ImplementationArguments implementationArguments, Scope scope return grid.getBiome(arguments.getOrigin().toFloat() .mutable() - .add(Vector3.of((int) Math.round(xz.getX()), + .add(Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID(); + FloatingPointFunctions.round(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID(); } @Override diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java index fb8ffa22ef..66f40696c0 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/BlockFunction.java @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,9 +72,9 @@ void setBlock(ImplementationArguments implementationArguments, Scope scope, Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); try { - Vector3.Mutable set = Vector3.of((int) Math.round(xz.getX()), + Vector3.Mutable set = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); BlockState current = arguments.getWorld().getBlockState(set); if(overwrite.apply(implementationArguments, scope) || current.isAir()) { arguments.getWorld().setBlockState(set, rot, physics.apply(implementationArguments, scope)); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java index fd3465c451..b0bd358907 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/CheckBlockFunction.java @@ -7,6 +7,8 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Scope; @@ -40,9 +42,9 @@ public String apply(ImplementationArguments implementationArguments, Scope scope String data = arguments.getWorld() .getBlockState(arguments.getOrigin().toFloat() .mutable() - .add(Vector3.of((int) Math.round(xz.getX()), + .add(Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) - .doubleValue(), (int) Math.round(xz.getZ())))) + .doubleValue(), FloatingPointFunctions.round(xz.getZ())))) .getAsString(); if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties else return data; diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java index 5fcc8e46b9..bfb0c6d8ce 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/LootFunction.java @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -64,10 +65,10 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) registry.get(RegistryKey.parse(id)) .ifPresentOrElse(table -> { - Vector3 apply = Vector3.of((int) Math.round(xz.getX()), + Vector3 apply = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope) .intValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(); + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(); try { BlockEntity data = arguments.getWorld().getBlockEntity(apply); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java index b6cbd2bdee..28890580ab 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/PullFunction.java @@ -7,6 +7,8 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; @@ -43,8 +45,8 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) Vector2 xz = Vector2.Mutable.of(x.apply(implementationArguments, scope).doubleValue(), z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - Vector3.Mutable mutable = Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); + Vector3.Mutable mutable = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()); while(mutable.getY() > arguments.getWorld().getMinHeight()) { if(!arguments.getWorld().getBlockState(mutable).isAir()) { arguments.getWorld().setBlockState(mutable, data); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java index fbc9dfceda..95bdcfe133 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StateFunction.java @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,8 +44,8 @@ public Void apply(ImplementationArguments implementationArguments, Scope scope) z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); - Vector3 origin = Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(); + Vector3 origin = Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), + FloatingPointFunctions.round(xz.getZ())).mutable().add(arguments.getOrigin().toFloat()).immutable(); try { BlockEntity state = arguments.getWorld().getBlockEntity(origin); state.applyState(data.apply(implementationArguments, scope)); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java index c62efde0a5..5eb481354e 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/functions/StructureFunction.java @@ -7,6 +7,7 @@ package com.dfsek.terra.addons.terrascript.script.functions; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; import com.dfsek.seismic.type.Rotation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -77,17 +78,17 @@ public Boolean apply(ImplementationArguments implementationArguments, Scope scop if(script instanceof StructureScript structureScript) { return structureScript.generate(arguments.getOrigin(), arguments.getWorld() - .buffer((int) Math.round(xz.getX()), + .buffer(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())), + FloatingPointFunctions.round(xz.getZ())), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); } return script.generate(arguments.getOrigin(), arguments.getWorld() - .buffer((int) Math.round(xz.getX()), + .buffer(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).intValue(), - (int) Math.round(xz.getZ())), + FloatingPointFunctions.round(xz.getZ())), arguments.getRandom(), arguments.getRotation().rotate(rotation1)); }).orElseGet(() -> { diff --git a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java index 0e9972fc04..5021935bff 100644 --- a/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java +++ b/common/addons/terrascript-function-check-noise-3d/src/main/java/com/dfsek/terra/addon/terrascript/check/CheckFunction.java @@ -7,6 +7,8 @@ package com.dfsek.terra.addon.terrascript.check; +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; + import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; @@ -44,8 +46,8 @@ public String apply(ImplementationArguments implementationArguments, Scope scope z.apply(implementationArguments, scope).doubleValue()).rotate(arguments.getRotation()); Vector3 location = arguments.getOrigin().toFloat().mutable().add( - Vector3.of((int) Math.round(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), - (int) Math.round(xz.getZ()))).immutable(); + Vector3.of(FloatingPointFunctions.round(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), + FloatingPointFunctions.round(xz.getZ()))).immutable(); return apply(location, arguments.getWorld()); } From 3269f9ec8ba66cec23d412d6434b26e792d4c4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sat, 7 Jun 2025 01:15:39 -0600 Subject: [PATCH 25/26] Initial work on supporting chunk based bending and interpolation in Layered Generator --- .../LayeredChunkGeneratorAddon.java | 11 +- .../chunkgenerator/api/LayerSampler.java | 3 + .../api/chunk/ChunkLayerSampler.java | 9 ++ .../BiomeDefinedLayerSamplerTemplate.java | 4 +- ....java => DensityLayerSamplerTemplate.java} | 7 +- .../ElevationLayerSamplerTemplate.java | 21 ++++ .../config/sampler/LayerSamplerTemplate.java | 15 +++ .../sampler/blend/BlendPropertiesConfig.java | 33 ++++++ .../sampler/BiomeDefinedLayerSampler.java | 19 +++- .../layer/sampler/DensityLayerSampler.java | 41 +++++++ .../layer/sampler/ElevationLayerSampler.java | 39 +++++++ .../layer/sampler/SimpleLayerSampler.java | 21 ---- .../layer/sampler/blend/BlendProperties.java | 7 ++ .../chunk/DensityChunkLayerSampler.java | 100 ++++++++++++++++++ .../chunk/ElevationChunkLayerSampler.java | 37 +++++++ 15 files changed, 335 insertions(+), 32 deletions(-) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/chunk/ChunkLayerSampler.java rename common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/{SimpleLayerSamplerTemplate.java => DensityLayerSamplerTemplate.java} (59%) create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/ElevationLayerSamplerTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/LayerSamplerTemplate.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/blend/BlendPropertiesConfig.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/DensityLayerSampler.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/ElevationLayerSampler.java delete mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/blend/BlendProperties.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java create mode 100644 common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/ElevationChunkLayerSampler.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 4a22c40241..48a53185ab 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 @@ -1,6 +1,10 @@ package com.dfsek.terra.addons.chunkgenerator; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.chunkgenerator.config.sampler.ElevationLayerSamplerTemplate; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,7 +38,7 @@ 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.BiomeDefinedLayerSamplerTemplate; -import com.dfsek.terra.addons.chunkgenerator.config.sampler.SimpleLayerSamplerTemplate; +import com.dfsek.terra.addons.chunkgenerator.config.sampler.DensityLayerSamplerTemplate; import com.dfsek.terra.addons.chunkgenerator.generation.LayeredChunkGenerator; import com.dfsek.terra.addons.chunkgenerator.layer.palette.BiomeDefinedLayerPalette; import com.dfsek.terra.addons.chunkgenerator.layer.sampler.BiomeDefinedLayerSampler; @@ -55,7 +59,7 @@ public class LayeredChunkGeneratorAddon implements AddonInitializer { - private static final Logger logger = LoggerFactory.getLogger(LayeredChunkGenerator.class); + private static final Logger logger = LoggerFactory.getLogger( LayeredChunkGeneratorAddon.class); public static final TypeKey>> POINT_SET_TYPE_TOKEN = new TypeKey<>() { }; @@ -116,7 +120,8 @@ public void initialize() { .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); + samplerTypeRegistry.register(addon.key("DENSITY"), DensityLayerSamplerTemplate::new); + samplerTypeRegistry.register(addon.key("ELEVATION"), ElevationLayerSamplerTemplate::new); samplerTypeRegistry.register(addon.key("BIOME_DEFINED"), BiomeDefinedLayerSamplerTemplate::new); event.loadTemplate(new LayerSamplerPackConfigTemplate()).getSamplers().forEach((key, sampler) -> { 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 index 5a782494e6..eb9af9334d 100644 --- 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 @@ -1,9 +1,12 @@ package com.dfsek.terra.addons.chunkgenerator.api; +import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler; import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.info.WorldProperties; public interface LayerSampler { double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider); + ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider); + double getBlendWeight(); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/chunk/ChunkLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/chunk/ChunkLayerSampler.java new file mode 100644 index 0000000000..fdfcac0834 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/api/chunk/ChunkLayerSampler.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.addons.chunkgenerator.api.chunk; + +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public interface ChunkLayerSampler { + double sample(int fmX, int y, int fmZ); +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java index 510aaeef2a..cdfe673d49 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/BiomeDefinedLayerSamplerTemplate.java @@ -10,7 +10,7 @@ import com.dfsek.seismic.type.sampler.Sampler; -public class BiomeDefinedLayerSamplerTemplate implements ObjectTemplate { +public class BiomeDefinedLayerSamplerTemplate extends LayerSamplerTemplate { @Value("default") @Default @@ -18,6 +18,6 @@ public class BiomeDefinedLayerSamplerTemplate implements ObjectTemplate { +public class DensityLayerSamplerTemplate extends LayerSamplerTemplate { @Value("sampler") private @Meta Sampler sampler; @Override public LayerSampler get() { - return new SimpleLayerSampler(sampler); + return new DensityLayerSampler(sampler, blend); } } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/ElevationLayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/ElevationLayerSamplerTemplate.java new file mode 100644 index 0000000000..e65df49a02 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/ElevationLayerSamplerTemplate.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.addons.chunkgenerator.config.sampler; + +import com.dfsek.seismic.type.sampler.Sampler; +import com.dfsek.tectonic.api.config.template.annotations.Value; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler; +import com.dfsek.terra.api.config.meta.Meta; + + +public class ElevationLayerSamplerTemplate extends LayerSamplerTemplate { + + @Value("sampler") + private @Meta Sampler sampler; + + @Override + public LayerSampler get() { + return new ElevationLayerSampler(sampler, blend); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/LayerSamplerTemplate.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/LayerSamplerTemplate.java new file mode 100644 index 0000000000..681d73b672 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/LayerSamplerTemplate.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.chunkgenerator.config.sampler; + +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.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties; +import com.dfsek.terra.api.config.meta.Meta; + + +public abstract class LayerSamplerTemplate implements ObjectTemplate { + @Value("blend") + protected @Meta BlendProperties blend; +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/blend/BlendPropertiesConfig.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/blend/BlendPropertiesConfig.java new file mode 100644 index 0000000000..e960a6bb1a --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/config/sampler/blend/BlendPropertiesConfig.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.addons.chunkgenerator.config.sampler.blend; + +import com.dfsek.seismic.type.sampler.DerivativeSampler; +import com.dfsek.tectonic.api.config.template.ValidatedConfigTemplate; +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.tectonic.api.exception.ValidationException; + +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties; +import com.dfsek.terra.api.config.meta.Meta; + + +public class BlendPropertiesConfig implements ValidatedConfigTemplate, ObjectTemplate { + @Value("density") + @Default + private @Meta int density = 3; + + @Value("weight") + @Default + private @Meta double weight = 1; + + @Override + public boolean validate() throws ValidationException { + return density > 1 && weight > 1 && density % 18 == 0; + } + + @Override + public BlendProperties get() { + return BlendProperties.of(density, weight); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java index 3c5390aaa4..3a80216597 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/BiomeDefinedLayerSampler.java @@ -3,6 +3,9 @@ import com.dfsek.tectonic.api.config.template.dynamic.DynamicTemplate; import com.dfsek.tectonic.api.config.template.dynamic.DynamicValue; +import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties; + import org.jetbrains.annotations.Nullable; import java.util.HashMap; import java.util.Map; @@ -24,9 +27,11 @@ public class BiomeDefinedLayerSampler implements LayerSampler { private final Sampler defaultSampler; + private final BlendProperties blendProperties; - public BiomeDefinedLayerSampler(@Nullable Sampler defaultSampler) { + public BiomeDefinedLayerSampler(@Nullable Sampler defaultSampler, BlendProperties blendProperties) { this.defaultSampler = defaultSampler; + this.blendProperties = blendProperties; } @Override @@ -38,7 +43,17 @@ public double sample(int x, int y, int z, WorldProperties world, BiomeProvider b .get(this) .getSample(world.getSeed(), x, y, z); } - + + @Override + public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) { + return null; + } + + @Override + public double getBlendWeight() { + return blendProperties.weight(); + } + private Optional getDefaultSampler() { return Optional.ofNullable(defaultSampler); } diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/DensityLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/DensityLayerSampler.java new file mode 100644 index 0000000000..f9ad2d2554 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/DensityLayerSampler.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler; + +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.seismic.type.sampler.Sampler; + +import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class DensityLayerSampler implements LayerSampler { + + private final Sampler sampler; + private final BlendProperties blendProperties; + + public DensityLayerSampler(Sampler sampler, BlendProperties blendProperties) { + this.sampler = sampler; + this.blendProperties = blendProperties; + } + + @Override + public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + //TODO if needed make this match chunk impl + return sampler.getSample(world.getSeed(), x, y, z); + } + + @Override + public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) { + return new DensityChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties); + } + + @Override + public double getBlendWeight() { + return blendProperties.weight(); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/ElevationLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/ElevationLayerSampler.java new file mode 100644 index 0000000000..313bb61dc6 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/ElevationLayerSampler.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler; + +import com.dfsek.seismic.type.sampler.Sampler; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.DensityChunkLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk.ElevationChunkLayerSampler; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class ElevationLayerSampler implements LayerSampler { + + private final Sampler sampler; + private final BlendProperties blendProperties; + + public ElevationLayerSampler(Sampler sampler, BlendProperties blendProperties) { + this.sampler = sampler; + this.blendProperties = blendProperties; + } + + @Override + public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { + //TODO if needed make this match chunk impl + return sampler.getSample(world.getSeed(), x, z); + } + + @Override + public ChunkLayerSampler getChunk(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider) { + return new ElevationChunkLayerSampler(chunkX, chunkZ, world, biomeProvider, this, blendProperties); + } + + @Override + public double getBlendWeight() { + return blendProperties.weight(); + } +} 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 deleted file mode 100644 index 3dd1de70f4..0000000000 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/SimpleLayerSampler.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dfsek.terra.addons.chunkgenerator.layer.sampler; - -import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; -import com.dfsek.seismic.type.sampler.Sampler; -import com.dfsek.terra.api.world.biome.generation.BiomeProvider; -import com.dfsek.terra.api.world.info.WorldProperties; - - -public class SimpleLayerSampler implements LayerSampler { - - private Sampler sampler; - - public SimpleLayerSampler(Sampler sampler) { - this.sampler = sampler; - } - - @Override - public double sample(int x, int y, int z, WorldProperties world, BiomeProvider biomeProvider) { - return sampler.getSample(world.getSeed(), x, y, z); - } -} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/blend/BlendProperties.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/blend/BlendProperties.java new file mode 100644 index 0000000000..bea76029f6 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/blend/BlendProperties.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend; + +public record BlendProperties(int density, double weight, int extent) { + public static BlendProperties of(int density, double weight) { + return new BlendProperties(density, weight, Math.max((18 / density) + 1, 1)); + } +} diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java new file mode 100644 index 0000000000..49924ab583 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java @@ -0,0 +1,100 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk; + +import com.dfsek.seismic.math.floatingpoint.FloatingPointFunctions; +import com.dfsek.seismic.math.numericanalysis.interpolation.InterpolationFunctions; +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.DensityLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + +public class DensityChunkLayerSampler implements ChunkLayerSampler { + double[] samples; + + private final int blendExtent; + + private final int min; + private final int blendExtentYExtent; + + private final int blendExtentMinus2; + private final int blendYExtendMinus2; + private final int blendDensity; + + public DensityChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, DensityLayerSampler layerSampler, BlendProperties blendProperties) { + this.min = world.getMinHeight() - 1; + int worldMax = world.getMaxHeight() + 1; + + blendDensity = blendProperties.density(); + + int blendYRange = worldMax - min + 1; + + int max; + int blendYExtend; + if (blendYRange % blendDensity == 0) { + blendYExtend = blendYRange / blendDensity; + max = worldMax; + } else { + blendYExtend = (blendYRange / blendDensity) + 1; + max = worldMax + 1; + } + + blendExtent = blendProperties.extent(); + blendExtentYExtent = blendYExtend * blendExtent; + blendExtentMinus2 = blendExtent - 2; + blendYExtendMinus2 = blendYExtend - 2; + + samples = new double[blendExtentYExtent * blendExtent]; + + int xOrigin = chunkX << 4; + int zOrigin = chunkZ << 4; + + for (int x = 0; x < 18; x += blendDensity) { + for (int z = 0; z < 18; z += blendDensity) { + int cx = xOrigin + x; + int cz = zOrigin + z; + for (int y = this.min; y <= max; y++) { + int yi = y - this.min; + int index = x * blendExtentYExtent + yi * blendExtent + z; + samples[index] = layerSampler.sample(cx, y, cz, world, biomeProvider); + } + } + } + } + + private double getSample(int x, int y, int z) { + int index = x * blendExtentYExtent + y * blendExtent + z; + return samples[index]; + } + + @Override + public double sample(int fmX, int y, int fmZ) { + double gx = (double)(fmX + 1) / blendDensity; + double gz = (double)(fmZ + 1) / blendDensity; + double gy = (double)(y - min) / blendDensity; + + int x0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gx))); + int z0 = Math.max(0, Math.min(blendExtentMinus2, FloatingPointFunctions.floor(gz))); + int y0 = Math.max(0, Math.min(blendYExtendMinus2, FloatingPointFunctions.floor(gy))); + + int x1 = x0 + 1; + int z1 = z0 + 1; + int y1 = y0 + 1; + + double tx = gx - x0; + double tz = gz - z0; + double ty = gy - y0; + + // Fetch 8 corners + double c000 = getSample(x0, y0, z0); + double c100 = getSample(x1, y0, z0); + double c010 = getSample(x0, y1, z0); + double c110 = getSample(x1, y1, z0); + double c001 = getSample(x0, y0, z1); + double c101 = getSample(x1, y0, z1); + double c011 = getSample(x0, y1, z1); + double c111 = getSample(x1, y1, z1); + + return InterpolationFunctions.triLerp(c000, c100, c010, c110, c001, c101, c011, c111, tx, ty, tz); + } +} \ No newline at end of file diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/ElevationChunkLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/ElevationChunkLayerSampler.java new file mode 100644 index 0000000000..9f3cf57dd2 --- /dev/null +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/ElevationChunkLayerSampler.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.addons.chunkgenerator.layer.sampler.chunk; + +import com.dfsek.terra.addons.chunkgenerator.api.LayerSampler; +import com.dfsek.terra.addons.chunkgenerator.api.chunk.ChunkLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.ElevationLayerSampler; +import com.dfsek.terra.addons.chunkgenerator.layer.sampler.blend.BlendProperties; +import com.dfsek.terra.api.world.biome.generation.BiomeProvider; +import com.dfsek.terra.api.world.info.WorldProperties; + + +public class ElevationChunkLayerSampler implements ChunkLayerSampler { + double[] samples; + + public ElevationChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, BiomeProvider biomeProvider, ElevationLayerSampler layerSampler, + BlendProperties blendProperties) { + //I see no reason to implement sparse blending here, elevation is inexpensive. If that changes, it can be easily implemented here. + samples = new double[16 * 16]; + + int xOrigin = chunkX << 4; + int zOrigin = chunkZ << 4; + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + int cx = xOrigin + x; + int cz = zOrigin + z; + int index = x * 16 + z; + samples[index] = layerSampler.sample(cx, 0, cz, world, biomeProvider); + } + } + } + + @Override + public double sample(int fmX, int y, int fmZ) { + int index = fmX * 16 + fmZ; + return samples[index]; + } +} From c9d7af5274a2e72fe4c43086dfa8d4b391574bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sat, 7 Jun 2025 01:23:44 -0600 Subject: [PATCH 26/26] fix padding --- .../layer/sampler/chunk/DensityChunkLayerSampler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java index 49924ab583..d3fc0f9044 100644 --- a/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java +++ b/common/addons/chunk-generator-layered/src/main/java/com/dfsek/terra/addons/chunkgenerator/layer/sampler/chunk/DensityChunkLayerSampler.java @@ -46,8 +46,8 @@ public DensityChunkLayerSampler(int chunkX, int chunkZ, WorldProperties world, B samples = new double[blendExtentYExtent * blendExtent]; - int xOrigin = chunkX << 4; - int zOrigin = chunkZ << 4; + int xOrigin = (chunkX << 4) - 1; + int zOrigin = (chunkZ << 4) - 1; for (int x = 0; x < 18; x += blendDensity) { for (int z = 0; z < 18; z += blendDensity) {