From 3bf8fe7901b7a75d0ade98b3b19855d738c8933e Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 19 Jul 2021 19:24:54 -0700 Subject: [PATCH] pass seed to noise functions --- .../biome/image/ImageBiomeProvider.java | 2 +- .../biome/pipeline/BiomeHolderImpl.java | 16 +++---- .../biome/pipeline/BiomePipelineImpl.java | 6 +-- .../biome/pipeline/StandardBiomeProvider.java | 47 +++++++++++++++---- .../biome/pipeline/api/BiomeExpander.java | 2 +- .../biome/pipeline/api/BiomeHolder.java | 6 +-- .../biome/pipeline/api/BiomeMutator.java | 2 +- .../addons/biome/pipeline/api/Stage.java | 2 +- .../pipeline/expand/FractalExpander.java | 4 +- .../pipeline/mutator/BorderListMutator.java | 6 +-- .../biome/pipeline/mutator/BorderMutator.java | 4 +- .../pipeline/mutator/ReplaceListMutator.java | 6 +-- .../pipeline/mutator/ReplaceMutator.java | 4 +- .../biome/pipeline/mutator/SmoothMutator.java | 4 +- .../biome/pipeline/source/RandomSource.java | 4 +- .../biome/pipeline/stages/ExpanderStage.java | 4 +- .../biome/pipeline/stages/MutatorStage.java | 4 +- .../biome/single/SingleBiomeProvider.java | 2 +- .../generators/NoiseChunkGenerator3D.java | 19 ++++---- .../interpolation/ChunkInterpolator2D.java | 6 ++- .../interpolation/ChunkInterpolator3D.java | 6 ++- .../interpolation/ElevationInterpolator.java | 6 ++- .../generation/math/samplers/Sampler3D.java | 2 +- .../biome/command/biome/AsyncBiomeFinder.java | 2 +- .../biome/command/biome/BiomeCommand.java | 2 +- .../terra/addons/carver/CarverCache.java | 2 +- .../distributors/NoiseDistributor.java | 4 +- .../addons/flora/flora/gen/TerraFlora.java | 2 +- .../dfsek/terra/addons/noise/NoiseAddon.java | 21 ++++----- .../config/templates/DomainWarpTemplate.java | 2 +- .../noise/CellularNoiseTemplate.java | 4 +- .../templates/noise/GaborNoiseTemplate.java | 2 +- .../addons/noise/normalizer/Normalizer.java | 14 +----- .../defined/UserDefinedFunction.java | 6 +++ .../noise/paralithic/noise/NoiseFunction.java | 7 --- .../paralithic/noise/NoiseFunction2.java | 39 ++++----------- .../paralithic/noise/NoiseFunction3.java | 13 +++-- .../noise/paralithic/noise/SeedContext.java | 15 ++++++ .../noise/samplers/DomainWarpedSampler.java | 32 ++++--------- .../noise/samplers/ExpressionSampler.java | 19 ++------ .../addons/noise/samplers/ImageSampler.java | 16 ++----- .../addons/noise/samplers/KernelSampler.java | 18 ++----- .../noise/samplers/noise/CellularSampler.java | 15 +++--- .../noise/samplers/noise/ConstantSampler.java | 5 +- .../samplers/noise/ExpressionFunction.java | 10 ++-- .../samplers/noise/GaborNoiseSampler.java | 13 +++-- .../noise/samplers/noise/NoiseFunction.java | 28 ++--------- .../noise/fractal/BrownianMotionSampler.java | 6 +-- .../noise/fractal/FractalNoiseFunction.java | 3 +- .../noise/fractal/PingPongSampler.java | 6 +-- .../noise/fractal/RidgedFractalSampler.java | 6 +-- .../noise/random/GaussianNoiseSampler.java | 9 ++-- .../noise/random/WhiteNoiseSampler.java | 15 +++--- .../noise/simplex/OpenSimplex2SSampler.java | 10 ++-- .../noise/simplex/OpenSimplex2Sampler.java | 10 ++-- .../samplers/noise/simplex/PerlinSampler.java | 10 ++-- .../noise/simplex/SimplexSampler.java | 10 ++-- .../noise/simplex/SimplexStyleSampler.java | 4 -- .../noise/value/ValueCubicSampler.java | 10 ++-- .../samplers/noise/value/ValueSampler.java | 8 ++-- .../samplers/noise/value/ValueStyleNoise.java | 3 -- .../dfsek/terra/addons/ore/OrePopulator.java | 2 +- .../addons/palette/palette/NoisePalette.java | 4 +- .../addons/palette/palette/PaletteImpl.java | 10 ++-- .../addons/structure/StructurePopulator.java | 2 +- .../feature/FeatureGenerationStage.java | 5 +- .../flora/FloraGenerationStage.java | 3 +- .../addons/generation/flora/FloraLayer.java | 2 +- .../addons/generation/tree/TreeLayer.java | 2 +- .../addons/generation/tree/TreePopulator.java | 3 +- .../script/functions/BiomeFunction.java | 2 +- common/api/build.gradle.kts | 2 +- .../dfsek/terra/api/noise/NoiseSampler.java | 40 ++++------------ .../api/structure/feature/Distributor.java | 6 +-- .../collection/ProbabilityCollection.java | 12 ++--- .../world/biome/generation/BiomeProvider.java | 15 ++---- .../generation/pipeline/BiomeSource.java | 2 +- .../terra/api/world/generator/Palette.java | 2 +- .../fabric/generation/TerraBiomeSource.java | 2 +- 79 files changed, 299 insertions(+), 382 deletions(-) delete mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction.java create mode 100644 common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java diff --git a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java index ea715500d..1e2345580 100644 --- a/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java +++ b/common/addons/biome-provider-image/src/main/java/com/dfsek/terra/addons/biome/image/ImageBiomeProvider.java @@ -29,7 +29,7 @@ public class ImageBiomeProvider implements BiomeProvider, SeededBuilder holderCache; + private final LoadingCache holderCache; private final BiomePipelineImpl pipeline; private final int resolution; private final NoiseSampler mutator; private final double noiseAmp; - private final int seed; public StandardBiomeProvider(BiomePipelineImpl pipeline, TerraPlugin main, int resolution, NoiseSampler mutator, double noiseAmp, int seed) { this.resolution = resolution; this.mutator = mutator; this.noiseAmp = noiseAmp; - this.seed = seed; holderCache = CacheBuilder.newBuilder() .maximumSize(main == null ? 32 : main.getTerraConfig().getProviderCache()) .build( - new CacheLoader() { + new CacheLoader() { @Override - public BiomeHolder load(@NotNull Vector2 key) { - return pipeline.getBiomes(key.getBlockX(), key.getBlockZ()); + public BiomeHolder load(@NotNull SeededVector key) { + return pipeline.getBiomes(key.x, key.z, key.seed); } } ); @@ -39,9 +37,9 @@ public class StandardBiomeProvider implements BiomeProvider { } @Override - public TerraBiome getBiome(int x, int z) { - x += mutator.getNoiseSeeded(seed, x, z) * noiseAmp; - z += mutator.getNoiseSeeded(1 + seed, x, z) * noiseAmp; + public TerraBiome getBiome(int x, int z, long seed) { + x += mutator.getNoiseSeeded(seed + 1, x, z) * noiseAmp; + z += mutator.getNoiseSeeded(seed + 2, x, z) * noiseAmp; x = FastMath.floorToInt(FastMath.floorDiv(x, resolution)); @@ -50,6 +48,35 @@ public class StandardBiomeProvider implements BiomeProvider { int fdX = FastMath.floorDiv(x, pipeline.getSize()); int fdZ = FastMath.floorDiv(z, pipeline.getSize()); - return holderCache.getUnchecked(new Vector2(fdX, fdZ)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize()); + return holderCache.getUnchecked(new SeededVector(fdX, fdZ, seed)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize()); + } + + private static final class SeededVector { + private final int x; + private final int z; + private final long seed; + + private SeededVector(int x, int z, long seed) { + this.x = x; + this.z = z; + this.seed = seed; + } + + @Override + public int hashCode() { + int result = 0; + result = 31 * result + ((int) (seed ^ (seed >>> 32))); + result = 31 * result + x; + result = 31 * result + z; + return result; + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof SeededVector)) return false; + SeededVector that = (SeededVector) obj; + + return this.seed == that.seed && this.x == that.x && this.z == that.z; + } } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java index 3a00706ab..39bc22f73 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeExpander.java @@ -3,5 +3,5 @@ package com.dfsek.terra.addons.biome.pipeline.api; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeExpander { - TerraBiome getBetween(double x, double z, TerraBiome... others); + TerraBiome getBetween(double x, double z, long seed, TerraBiome... others); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java index 8c9d9711a..1757176a1 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeHolder.java @@ -4,11 +4,11 @@ import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; public interface BiomeHolder { - BiomeHolder expand(BiomeExpander expander); + BiomeHolder expand(BiomeExpander expander, long seed); - void mutate(BiomeMutator mutator); + void mutate(BiomeMutator mutator, long seed); - void fill(BiomeSource source); + void fill(BiomeSource source, long seed); TerraBiome getBiome(int x, int z); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java index abb8d2258..547409b5a 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/BiomeMutator.java @@ -3,7 +3,7 @@ package com.dfsek.terra.addons.biome.pipeline.api; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeMutator { - TerraBiome mutate(ViewPoint viewPoint, double x, double z); + TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed); class ViewPoint { private final BiomeHolder biomes; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java index 64d069c11..dbf9f2722 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/api/Stage.java @@ -3,6 +3,6 @@ package com.dfsek.terra.addons.biome.pipeline.api; public interface Stage { boolean isExpansion(); - BiomeHolder apply(BiomeHolder in); + BiomeHolder apply(BiomeHolder in, long seed); } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java index fa9532737..894d2a86a 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/expand/FractalExpander.java @@ -13,7 +13,7 @@ public class FractalExpander implements BiomeExpander { } @Override - public TerraBiome getBetween(double x, double z, TerraBiome... others) { - return others[MathUtil.normalizeIndex(sampler.getNoise(x, z), others.length)]; + public TerraBiome getBetween(double x, double z, long seed, TerraBiome... others) { + return others[MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), others.length)]; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java index b99c2e841..53273973e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderListMutator.java @@ -23,7 +23,7 @@ public class BorderListMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome origin = viewPoint.getBiome(0, 0); if(origin.getTags().contains(defaultReplace)) { for(int xi = -1; xi <= 1; xi++) { @@ -33,10 +33,10 @@ public class BorderListMutator implements BiomeMutator { if(current == null) continue; if(current.getTags().contains(border)) { if(replace.containsKey(origin)) { - TerraBiome biome = replace.get(origin).get(noiseSampler, x, z); + TerraBiome biome = replace.get(origin).get(noiseSampler, x, z, seed); return biome == null ? origin : biome; } - TerraBiome biome = replaceDefault.get(noiseSampler, x, z); + TerraBiome biome = replaceDefault.get(noiseSampler, x, z, seed); return biome == null ? origin : biome; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java index e09b0e17b..dfd54aa9c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/BorderMutator.java @@ -19,7 +19,7 @@ public class BorderMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome origin = viewPoint.getBiome(0, 0); if(origin.getTags().contains(replaceTag)) { for(int xi = -1; xi <= 1; xi++) { @@ -28,7 +28,7 @@ public class BorderMutator implements BiomeMutator { TerraBiome current = viewPoint.getBiome(xi, zi); if(current == null) continue; if(current.getTags().contains(border)) { - TerraBiome biome = replace.get(noiseSampler, x, z); + TerraBiome biome = replace.get(noiseSampler, x, z, seed); return biome == null ? origin : biome; } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java index 029a9b668..8bdb314b8 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceListMutator.java @@ -21,14 +21,14 @@ public class ReplaceListMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome center = viewPoint.getBiome(0, 0); if(replace.containsKey(center)) { - TerraBiome biome = replace.get(center).get(sampler, x, z); + TerraBiome biome = replace.get(center).get(sampler, x, z, seed); return biome == null ? viewPoint.getBiome(0, 0) : biome; } if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) { - TerraBiome biome = replaceDefault.get(sampler, x, z); + TerraBiome biome = replaceDefault.get(sampler, x, z, seed); return biome == null ? viewPoint.getBiome(0, 0) : biome; } return center; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java index 59899c322..ec1c7437c 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/ReplaceMutator.java @@ -17,9 +17,9 @@ public class ReplaceMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) { - TerraBiome biome = replace.get(sampler, x, z); + TerraBiome biome = replace.get(sampler, x, z, seed); return biome == null ? viewPoint.getBiome(0, 0) : biome; } return viewPoint.getBiome(0, 0); diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java index a62966a67..ac1c7c8a0 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/mutator/SmoothMutator.java @@ -16,7 +16,7 @@ public class SmoothMutator implements BiomeMutator { } @Override - public TerraBiome mutate(ViewPoint viewPoint, double x, double z) { + public TerraBiome mutate(ViewPoint viewPoint, double x, double z, long seed) { TerraBiome top = viewPoint.getBiome(1, 0); TerraBiome bottom = viewPoint.getBiome(-1, 0); TerraBiome left = viewPoint.getBiome(0, 1); @@ -27,7 +27,7 @@ public class SmoothMutator implements BiomeMutator { boolean horiz = Objects.equals(left, right) && left != null; if(vert && horiz) { - return MathUtil.normalizeIndex(sampler.getNoise(x, z), 2) == 0 ? left : top; + return MathUtil.normalizeIndex(sampler.getNoiseSeeded(seed, x, z), 2) == 0 ? left : top; } if(vert) return top; diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/RandomSource.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/RandomSource.java index 1c414ec11..41896d03f 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/RandomSource.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/source/RandomSource.java @@ -15,7 +15,7 @@ public class RandomSource implements BiomeSource { } @Override - public TerraBiome getBiome(double x, double z) { - return biomes.get(sampler, x, z); + public TerraBiome getBiome(double x, double z, long seed) { + return biomes.get(sampler, x, z, seed); } } diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java index d73726634..839febab5 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/ExpanderStage.java @@ -17,8 +17,8 @@ public class ExpanderStage implements Stage { } @Override - public BiomeHolder apply(BiomeHolder in) { - return in.expand(expander); + public BiomeHolder apply(BiomeHolder in, long seed) { + return in.expand(expander, seed); } public enum Type { diff --git a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java index fc6a18003..4f5f6bf6e 100644 --- a/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java +++ b/common/addons/biome-provider-pipeline/src/main/java/com/dfsek/terra/addons/biome/pipeline/stages/MutatorStage.java @@ -17,8 +17,8 @@ public class MutatorStage implements Stage { } @Override - public BiomeHolder apply(BiomeHolder in) { - in.mutate(mutator); + public BiomeHolder apply(BiomeHolder in, long seed) { + in.mutate(mutator, seed); return in; } diff --git a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java index 47ba7c052..0b0a42d84 100644 --- a/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java +++ b/common/addons/biome-provider-single/src/main/java/com/dfsek/terra/addons/biome/single/SingleBiomeProvider.java @@ -12,7 +12,7 @@ public class SingleBiomeProvider implements BiomeProvider, SeededBuilder 0) { justSet = true; - data = PaletteUtil.getPalette(x, y, z, generator, sampler, paletteInfo).get(paletteLevel, cx, y, cz); + data = PaletteUtil.getPalette(x, y, z, generator, sampler, paletteInfo).get(paletteLevel, cx, y, cz, seed); chunk.setBlock(x, y, z, data); paletteLevel++; } else if(y <= sea) { - chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig)); + chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, y, z + zOrig, seed)); justSet = false; paletteLevel = 0; @@ -167,7 +170,7 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { public BlockState getBlock(World world, int x, int y, int z) { TerraWorld terraWorld = main.getWorld(world); BiomeProvider provider = terraWorld.getBiomeProvider(); - TerraBiome biome = provider.getBiome(x, z); + TerraBiome biome = provider.getBiome(x, z, world.getSeed()); Sampler sampler = terraWorld.getConfig().getSamplerCache().get(x, z); PaletteInfo paletteInfo = biome.getContext().get(PaletteInfo.class); @@ -181,9 +184,9 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator { if(sampler.sample(fdX, yi, fdZ) > 0) level++; else level = 0; } - return palette.get(level, x, y, z); + return palette.get(level, x, y, z, world.getSeed()); } else if(y <= paletteInfo.getSeaLevel()) { - return paletteInfo.getOcean().get(paletteInfo.getSeaLevel() - y, x, y, z); + return paletteInfo.getOcean().get(paletteInfo.getSeaLevel() - y, x, y, z, world.getSeed()); } else return air; } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java index 96ea6be8d..72c83a804 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator2D.java @@ -32,11 +32,13 @@ public class ChunkInterpolator2D implements ChunkInterpolator { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; + long seed = w.getSeed(); + double[][] noiseStorage = new double[5][5]; for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { - Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2)).getGenerator(w); + Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w); Map genMap = new HashMap<>(); int step = generator.getBlendStep(); @@ -44,7 +46,7 @@ public class ChunkInterpolator2D implements ChunkInterpolator { for(int xi = -blend; xi <= blend; xi++) { for(int zi = -blend; zi <= blend; zi++) { - genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step)).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 + genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java index 0af1ab52e..4841398c8 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ChunkInterpolator3D.java @@ -45,9 +45,11 @@ public class ChunkInterpolator3D implements ChunkInterpolator { double[][][] noiseStorage = new double[5][5][size + 1]; + long seed = w.getSeed(); + for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { - Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2)).getGenerator(w); + Generator generator = provider.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), seed).getGenerator(w); Map genMap = new HashMap<>(); int step = generator.getBlendStep(); @@ -55,7 +57,7 @@ public class ChunkInterpolator3D implements ChunkInterpolator { for(int xi = -blend; xi <= blend; xi++) { for(int zi = -blend; zi <= blend; zi++) { - genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step)).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 + genMap.computeIfAbsent(provider.getBiome(xOrigin + (x << 2) + (xi * step), zOrigin + (z << 2) + (zi * step), seed).getGenerator(w), g -> new MutableInteger(0)).increment(); // Increment by 1 } } diff --git a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java index bebd34b96..53a10f345 100644 --- a/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java +++ b/common/addons/chunk-generator-noise-3d/src/main/java/com/dfsek/terra/addons/chunkgenerator/generation/math/interpolation/ElevationInterpolator.java @@ -11,12 +11,14 @@ public class ElevationInterpolator { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; + long seed = world.getSeed(); + Generator[][] gens = new Generator[18 + 2 * smooth][18 + 2 * smooth]; // Precompute generators. for(int x = -1 - smooth; x <= 16 + smooth; x++) { for(int z = -1 - smooth; z <= 16 + smooth; z++) { - gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, zOrigin + z).getGenerator(world); + gens[x + 1 + smooth][z + 1 + smooth] = provider.getBiome(xOrigin + x, zOrigin + z, seed).getGenerator(world); } } @@ -27,7 +29,7 @@ public class ElevationInterpolator { for(int xi = -smooth; xi <= smooth; xi++) { for(int zi = -smooth; zi <= smooth; zi++) { Generator gen = gens[x + 1 + smooth + xi][z + 1 + smooth + zi]; - noise += gen.getElevationSampler().getNoise(xOrigin + x, zOrigin + z) * gen.getElevationWeight(); + noise += gen.getElevationSampler().getNoiseSeeded(seed, xOrigin + x, zOrigin + z) * gen.getElevationWeight(); div += gen.getElevationWeight(); } } 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 ec4215f63..d0092503c 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 @@ -12,7 +12,7 @@ public class Sampler3D implements Sampler { private final ElevationInterpolator elevationInterpolator; public Sampler3D(int x, int z, BiomeProvider provider, World world, int elevationSmooth) { - this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler().getNoise(coord)); + this.interpolator = new ChunkInterpolator3D(world, x, z, provider, (generator, coord) -> generator.getBaseSampler().getNoiseSeeded(coord, world.getSeed())); this.elevationInterpolator = new ElevationInterpolator(world, x, z, provider, elevationSmooth); } diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java index c6278a50a..c639d772d 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/AsyncBiomeFinder.java @@ -46,7 +46,7 @@ public class AsyncBiomeFinder implements Runnable { */ public boolean isValid(int x, int z, TerraBiome target) { int res = main.getTerraConfig().getBiomeSearchResolution(); - return getProvider().getBiome(x * res, z * res).equals(target); + return getProvider().getBiome(x * res, z * res, world.getSeed()).equals(target); } public Vector3 finalizeVector(Vector3 orig) { diff --git a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java index e4bbd74b5..42f5b9db3 100644 --- a/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java +++ b/common/addons/config-biome/src/main/java/com/dfsek/terra/addons/biome/command/biome/BiomeCommand.java @@ -38,7 +38,7 @@ public class BiomeCommand implements CommandTemplate { Player player = (Player) sender; BiomeProvider provider = main.getWorld(player.world()).getBiomeProvider(); - UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(player.position()); + UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(player.position(), player.world().getSeed()); sender.sendMessage("You are standing in " + biome.getID()); } } diff --git a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java index 498d88f6f..496a2861d 100644 --- a/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java +++ b/common/addons/config-carver/src/main/java/com/dfsek/terra/addons/carver/CarverCache.java @@ -39,7 +39,7 @@ public class CarverCache { List points = new ArrayList<>(); for(int i = 0; i < carving.getLength(); i++) { carving.step(); - TerraBiome biome = provider.getBiome(carving.getRunning()); + TerraBiome biome = provider.getBiome(carving.getRunning(), w.getSeed()); /* if(!((UserDefinedBiome) biome).getConfig().getCarvers().containsKey(CarverCache.this.carver)) { // Stop if we enter a biome this carver is not present in return Collections.emptyList(); diff --git a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java index 00b4ad8fb..b97657e4d 100644 --- a/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java +++ b/common/addons/config-distributors/src/main/java/com/dfsek/terra/addons/feature/distributor/distributors/NoiseDistributor.java @@ -11,7 +11,7 @@ public class NoiseDistributor implements Distributor { } @Override - public boolean matches(int x, int z) { - return sampler.getNoise(x, z) > 0; + public boolean matches(int x, int z, long seed) { + return sampler.getNoiseSeeded(seed, x, z) > 0; } } diff --git a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java index b7eef8658..6563f09ef 100644 --- a/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java +++ b/common/addons/config-flora/src/main/java/com/dfsek/terra/addons/flora/flora/gen/TerraFlora.java @@ -116,7 +116,7 @@ public class TerraFlora implements Flora { for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor int lvl = (FastMath.abs(i)); - BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(), location.getZ()).clone(); + BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(), location.getZ(), world.getSeed()).clone(); if(doRotation) { Direction oneFace = new ArrayList<>(faces).get(new Random(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face. diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java index 0f66e6c37..d09305f99 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/NoiseAddon.java @@ -16,8 +16,6 @@ import com.dfsek.terra.addons.noise.config.templates.noise.fractal.RidgedFractal import com.dfsek.terra.addons.noise.config.templates.normalizer.ClampNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.LinearNormalizerTemplate; import com.dfsek.terra.addons.noise.config.templates.normalizer.NormalNormalizerTemplate; -import com.dfsek.terra.addons.noise.samplers.ImageSampler; -import com.dfsek.terra.addons.noise.samplers.noise.CellularSampler; import com.dfsek.terra.addons.noise.samplers.noise.random.GaussianNoiseSampler; import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2SSampler; @@ -64,10 +62,7 @@ public class NoiseAddon extends TerraAddon implements EventListener { .applyLoader(DomainWarpTemplate.class, DomainWarpTemplate::new) .applyLoader(LinearNormalizerTemplate.class, LinearNormalizerTemplate::new) .applyLoader(NormalNormalizerTemplate.class, NormalNormalizerTemplate::new) - .applyLoader(ImageSampler.Channel.class, (t, object, cf) -> ImageSampler.Channel.valueOf((String) object)) - .applyLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new) - .applyLoader(CellularSampler.ReturnType.class, (t, object, cf) -> CellularSampler.ReturnType.valueOf((String) object)) - .applyLoader(CellularSampler.DistanceFunction.class, (t, object, cf) -> CellularSampler.DistanceFunction.valueOf((String) object)); + .applyLoader(ClampNormalizerTemplate.class, ClampNormalizerTemplate::new); noiseRegistry.register("LINEAR", LinearNormalizerTemplate::new); noiseRegistry.register("NORMAL", NormalNormalizerTemplate::new); @@ -81,20 +76,20 @@ public class NoiseAddon extends TerraAddon implements EventListener { noiseRegistry.register("PINGPONG", PingPongTemplate::new); noiseRegistry.register("RIDGED", RidgedFractalTemplate::new); - noiseRegistry.register("OPENSIMPLEX2", () -> new SimpleNoiseTemplate(OpenSimplex2Sampler::new)); - noiseRegistry.register("OPENSIMPLEX2S", () -> new SimpleNoiseTemplate(OpenSimplex2SSampler::new)); - noiseRegistry.register("PERLIN", () -> new SimpleNoiseTemplate(PerlinSampler::new)); - noiseRegistry.register("SIMPLEX", () -> new SimpleNoiseTemplate(SimplexSampler::new)); + noiseRegistry.register("OPENSIMPLEX2", () -> new SimpleNoiseTemplate(seed3 -> new OpenSimplex2Sampler())); + noiseRegistry.register("OPENSIMPLEX2S", () -> new SimpleNoiseTemplate(seed3 -> new OpenSimplex2SSampler())); + noiseRegistry.register("PERLIN", () -> new SimpleNoiseTemplate(seed2 -> new PerlinSampler())); + noiseRegistry.register("SIMPLEX", () -> new SimpleNoiseTemplate(seed2 -> new SimplexSampler())); noiseRegistry.register("GABOR", GaborNoiseTemplate::new); noiseRegistry.register("VALUE", () -> new SimpleNoiseTemplate(ValueSampler::new)); - noiseRegistry.register("VALUECUBIC", () -> new SimpleNoiseTemplate(ValueCubicSampler::new)); + noiseRegistry.register("VALUECUBIC", () -> new SimpleNoiseTemplate(seed1 -> new ValueCubicSampler())); noiseRegistry.register("CELLULAR", CellularNoiseTemplate::new); - noiseRegistry.register("WHITENOISE", () -> new SimpleNoiseTemplate(WhiteNoiseSampler::new)); - noiseRegistry.register("GAUSSIAN", () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new)); + noiseRegistry.register("WHITENOISE", () -> new SimpleNoiseTemplate(seed -> new WhiteNoiseSampler())); + noiseRegistry.register("GAUSSIAN", () -> new SimpleNoiseTemplate(seed -> new GaussianNoiseSampler())); noiseRegistry.register("CONSTANT", ConstantNoiseTemplate::new); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java index 36a6bce86..e484256b3 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/DomainWarpTemplate.java @@ -24,6 +24,6 @@ public class DomainWarpTemplate extends SamplerTemplate { @Override public NoiseSampler build(long seed) { - return new DomainWarpedSampler(function.build(seed), warp.build(seed), (int) (seed + salt), amplitude); + return new DomainWarpedSampler(function.build(seed), warp.build(seed), amplitude); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java index b8c10589a..bcbb3071c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/CellularNoiseTemplate.java @@ -27,7 +27,7 @@ public class CellularNoiseTemplate extends NoiseTemplate { private SeededNoiseSampler lookup = new SeededNoiseSampler() { @Override public NoiseSampler build(long seed) { - return new OpenSimplex2Sampler((int) seed); + return new OpenSimplex2Sampler(); } @Override @@ -38,7 +38,7 @@ public class CellularNoiseTemplate extends NoiseTemplate { @Override public NoiseSampler build(long seed) { - CellularSampler sampler = new CellularSampler((int) seed + salt); + CellularSampler sampler = new CellularSampler(); sampler.setNoiseLookup(lookup.build(seed)); sampler.setFrequency(frequency); sampler.setJitterModifier(cellularJitter); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java index fc7de1f74..96225821a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/config/templates/noise/GaborNoiseTemplate.java @@ -28,7 +28,7 @@ public class GaborNoiseTemplate extends NoiseTemplate { @Override public NoiseSampler build(long seed) { - GaborNoiseSampler gaborNoiseSampler = new GaborNoiseSampler((int) seed + salt); + GaborNoiseSampler gaborNoiseSampler = new GaborNoiseSampler(); gaborNoiseSampler.setFrequency(frequency); gaborNoiseSampler.setRotation(rotation); gaborNoiseSampler.setIsotropic(isotropic); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java index a4dce32c0..08cc87eda 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java @@ -12,22 +12,12 @@ public abstract class Normalizer implements NoiseSampler { public abstract double normalize(double in); @Override - public double getNoise(double x, double y) { - return normalize(sampler.getNoise(x, y)); - } - - @Override - public double getNoise(double x, double y, double z) { - return normalize(sampler.getNoise(x, y, z)); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return normalize(sampler.getNoiseSeeded(seed, x, y)); } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { return normalize(sampler.getNoiseSeeded(seed, x, y, z)); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java index 33d93112b..d7d99aeb5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/defined/UserDefinedFunction.java @@ -4,6 +4,7 @@ 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 com.dfsek.paralithic.functions.dynamic.Context; import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; @@ -31,6 +32,11 @@ public class UserDefinedFunction implements DynamicFunction { return expression.evaluate(args); } + @Override + public double eval(Context context, double... args) { + return expression.evaluate(context, args); + } + @Override public boolean isStateless() { return true; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction.java deleted file mode 100644 index 20c2aa909..000000000 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.addons.noise.paralithic.noise; - - -import com.dfsek.paralithic.functions.dynamic.DynamicFunction; - -public interface NoiseFunction extends DynamicFunction { -} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java index 4fe62fb7e..f12c1576e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction2.java @@ -1,12 +1,13 @@ package com.dfsek.terra.addons.noise.paralithic.noise; +import com.dfsek.paralithic.functions.dynamic.Context; +import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.terra.addons.noise.util.HashMapDoubleDouble; import com.dfsek.terra.api.noise.NoiseSampler; -public class NoiseFunction2 implements NoiseFunction { +public class NoiseFunction2 implements DynamicFunction { private final NoiseSampler gen; - private final Cache cache = new Cache(); public NoiseFunction2(NoiseSampler gen) { this.gen = gen; @@ -19,36 +20,16 @@ public class NoiseFunction2 implements NoiseFunction { @Override public double eval(double... args) { - return cache.get(gen, args[0], args[1]); + throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); + } + + @Override + public double eval(Context context, double... args) { + return gen.getNoiseSeeded(((SeedContext) context).getSeed(), args[0], args[1]); } @Override public boolean isStateless() { - return true; - } - - private static class Cache extends HashMapDoubleDouble { - private static final long serialVersionUID = 8915092734723467010L; - private static final int cacheSize = 384; - - public Cache() { - super(cacheSize); - } - - public double get(NoiseSampler noise, double x, double z) { - double xx = x >= 0 ? x * 2 : x * -2 - 1; - double zz = z >= 0 ? z * 2 : z * -2 - 1; - double key = (xx >= zz) ? (xx * xx + xx + zz) : (zz * zz + xx); - double value = this.get(key); - if(this.size() > cacheSize) { - this.clear(); - } - return (value == 4.9E-324D ? addAndReturn(noise.getNoise(x, z), key) : value); - } - - private synchronized double addAndReturn(double value, double key) { - this.put(key, value); - return value; - } + return false; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java index 67e7400dd..827eb6596 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/NoiseFunction3.java @@ -1,8 +1,10 @@ package com.dfsek.terra.addons.noise.paralithic.noise; +import com.dfsek.paralithic.functions.dynamic.Context; +import com.dfsek.paralithic.functions.dynamic.DynamicFunction; import com.dfsek.terra.api.noise.NoiseSampler; -public class NoiseFunction3 implements NoiseFunction { +public class NoiseFunction3 implements DynamicFunction { private final NoiseSampler gen; public NoiseFunction3(NoiseSampler gen) { @@ -16,11 +18,16 @@ public class NoiseFunction3 implements NoiseFunction { @Override public double eval(double... args) { - return gen.getNoise(args[0], args[1], args[2]); + throw new UnsupportedOperationException("Cannot evaluate seeded function without seed context."); + } + + @Override + public double eval(Context context, double... args) { + return gen.getNoiseSeeded(((SeedContext) context).getSeed(), args[0], args[1], args[2]); } @Override public boolean isStateless() { - return true; + return false; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java new file mode 100644 index 000000000..bc490d1c4 --- /dev/null +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/paralithic/noise/SeedContext.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.addons.noise.paralithic.noise; + +import com.dfsek.paralithic.functions.dynamic.Context; + +public class SeedContext implements Context { + private final long seed; + + public SeedContext(long seed) { + this.seed = seed; + } + + public long getSeed() { + return seed; + } +} diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java index bb81468a6..eca97002c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java @@ -5,40 +5,28 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class DomainWarpedSampler implements NoiseSampler { private final NoiseSampler function; private final NoiseSampler warp; - private final int seed; private final double amplitude; - public DomainWarpedSampler(NoiseSampler function, NoiseSampler warp, int seed, double amplitude) { + public DomainWarpedSampler(NoiseSampler function, NoiseSampler warp, double amplitude) { this.function = function; this.warp = warp; - this.seed = seed; this.amplitude = amplitude; } @Override - public double getNoise(double x, double y) { - return getNoiseSeeded(seed, x, y); - } - - @Override - public double getNoise(double x, double y, double z) { - return getNoiseSeeded(seed, x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return function.getNoise( - x + warp.getNoiseSeeded(seed, x, y) * amplitude, - y + warp.getNoiseSeeded(seed + 1, x, y) * amplitude + public double getNoiseSeeded(long seed, double x, double y) { + return function.getNoiseSeeded(seed++, + x + warp.getNoiseSeeded(seed++, x, y) * amplitude, + y + warp.getNoiseSeeded(seed, x, y) * amplitude ); } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { - return function.getNoise( - x + warp.getNoiseSeeded(seed, x, y, z) * amplitude, - y + warp.getNoiseSeeded(seed + 1, x, y, z) * amplitude, - z + warp.getNoiseSeeded(seed + 2, x, y, z) * amplitude + public double getNoiseSeeded(long seed, double x, double y, double z) { + return function.getNoiseSeeded(seed++, + x + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, + y + warp.getNoiseSeeded(seed++, x, y, z) * amplitude, + z + warp.getNoiseSeeded(seed, x, y, z) * amplitude ); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ExpressionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ExpressionSampler.java index bed9d4c7b..58817c0ab 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ExpressionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ExpressionSampler.java @@ -8,6 +8,7 @@ import com.dfsek.terra.addons.noise.config.templates.FunctionTemplate; import com.dfsek.terra.addons.noise.paralithic.defined.UserDefinedFunction; import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction2; import com.dfsek.terra.addons.noise.paralithic.noise.NoiseFunction3; +import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.seeded.SeededNoiseSampler; @@ -46,22 +47,12 @@ public class ExpressionSampler implements NoiseSampler { } @Override - public double getNoise(double x, double y) { - return getNoise(x, 0, y); + public double getNoiseSeeded(long seed, double x, double y) { + return getNoiseSeeded(seed, x, y); } @Override - public double getNoise(double x, double y, double z) { - return expression.evaluate(x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return getNoise(x, y); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { - return getNoise(x, y, z); + public double getNoiseSeeded(long seed, double x, double y, double z) { + return expression.evaluate(new SeedContext(seed), x, y, z); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java index 65ca10e92..d48dc2c26 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java @@ -18,23 +18,13 @@ public class ImageSampler implements NoiseSampler { } @Override - public double getNoise(double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return ((channel.getChannel(image.getRGB(FastMath.floorMod(FastMath.floorToInt(x * frequency), image.getWidth()), FastMath.floorMod(FastMath.floorToInt(y * frequency), image.getHeight()))) / 255D) - 0.5) * 2; } @Override - public double getNoise(double x, double y, double z) { - return getNoise(x, y); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return getNoise(x, y); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { - return getNoise(x, y, z); + public double getNoiseSeeded(long seed, double x, double y, double z) { + return getNoiseSeeded(seed, x, y); } public enum Channel { diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java index 897d193b1..b30e16510 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java @@ -13,24 +13,14 @@ public class KernelSampler implements NoiseSampler { } @Override - public double getNoise(double x, double y) { - return getNoiseSeeded(0, x, y); - } - - @Override - public double getNoise(double x, double y, double z) { - return getNoiseSeeded(0, x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { x *= frequency; y *= frequency; double accumulator = 0; for(int kx = 0; kx < kernel.length; kx++) { for(int ky = 0; ky < kernel[kx].length; ky++) { - accumulator += in.getNoise(x + kx, y + ky) * kernel[kx][ky]; + accumulator += in.getNoiseSeeded(seed, x + kx, y + ky) * kernel[kx][ky]; } } @@ -38,7 +28,7 @@ public class KernelSampler implements NoiseSampler { } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { x *= frequency; y *= frequency; z *= frequency; @@ -46,7 +36,7 @@ public class KernelSampler implements NoiseSampler { for(int kx = 0; kx < kernel.length; kx++) { for(int ky = 0; ky < kernel[kx].length; ky++) { - accumulator += in.getNoise(x + kx, y, z + ky) * kernel[kx][ky]; + accumulator += in.getNoiseSeeded(seed, x + kx, y, z + ky) * kernel[kx][ky]; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java index 509440db3..83f972d7b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java @@ -192,9 +192,8 @@ public class CellularSampler extends NoiseFunction { private NoiseSampler noiseLookup; - public CellularSampler(int seed) { - super(seed); - noiseLookup = new OpenSimplex2Sampler(seed); + public CellularSampler() { + noiseLookup = new OpenSimplex2Sampler(); } public void setDistanceFunction(DistanceFunction distanceFunction) { @@ -214,7 +213,8 @@ public class CellularSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int xr = fastRound(x); int yr = fastRound(y); @@ -349,7 +349,7 @@ public class CellularSampler extends NoiseFunction { case Distance2Div: return distance0 / distance1 - 1; case NoiseLookup: - return noiseLookup.getNoise(center.getX(), center.getZ()); + return noiseLookup.getNoiseSeeded(sl, center.getX(), center.getZ()); case Distance3: return distance2 - 1; case Distance3Add: @@ -366,7 +366,8 @@ public class CellularSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int xr = fastRound(x); int yr = fastRound(y); int zr = fastRound(z); @@ -523,7 +524,7 @@ public class CellularSampler extends NoiseFunction { case Distance2Div: return distance0 / distance1 - 1; case NoiseLookup: - return noiseLookup.getNoise(center.getX(), center.getY(), center.getZ()); + return noiseLookup.getNoiseSeeded(sl, center.getX(), center.getY(), center.getZ()); case Distance3: return distance2 - 1; case Distance3Add: diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java index 74110466f..10833d194 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java @@ -7,17 +7,16 @@ public class ConstantSampler extends NoiseFunction { private final double constant; public ConstantSampler(double constant) { - super(0); this.constant = constant; } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { return constant; } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { return constant; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java index e736a8e91..469deec60 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java @@ -5,6 +5,7 @@ import com.dfsek.paralithic.eval.parser.Parser; import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.Function; +import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext; import java.util.Map; @@ -15,7 +16,6 @@ public class ExpressionFunction extends NoiseFunction { private final Expression expression; public ExpressionFunction(Map functions, String eq, Map vars) throws ParseException { - super(0); Parser p = new Parser(); Scope scope = new Scope(); @@ -32,12 +32,12 @@ public class ExpressionFunction extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { - return expression.evaluate(x, 0, y); + public double getNoiseRaw(long seed, double x, double y) { + return expression.evaluate(new SeedContext(seed), x, 0, y); } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { - return expression.evaluate(x, y, z); + public double getNoiseRaw(long seed, double x, double y, double z) { + return expression.evaluate(new SeedContext(seed), x, y, z); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java index 4b779f768..00f1bde3d 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java @@ -18,9 +18,8 @@ public class GaborNoiseSampler extends NoiseFunction { private double g = FastMath.exp(-impulsesPerCell); - public GaborNoiseSampler(int seed) { - super(seed); - rand = new WhiteNoiseSampler(seed); + public GaborNoiseSampler() { + rand = new WhiteNoiseSampler(); } public void setIsotropic(boolean isotropic) { @@ -57,16 +56,16 @@ public class GaborNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double z) { + public double getNoiseRaw(long seed, double x, double z) { return gaborNoise(seed, x, z); } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { return gaborNoise(seed, x, z); } - private double gaborNoise(int seed, double x, double y) { + private double gaborNoise(long seed, double x, double y) { x /= kernelRadius; y /= kernelRadius; int xi = fastFloor(x); @@ -82,7 +81,7 @@ public class GaborNoiseSampler extends NoiseFunction { return noise; } - private double calculateCell(int seed, int xi, int yi, double x, double y) { + private double calculateCell(long seed, int xi, int yi, double x, double y) { long mashedSeed = murmur64(31L * xi + yi) + seed; double gaussianSource = (rand.getNoiseRaw(mashedSeed++) + 1) / 2; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java index cd7acb646..dec509e4a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java @@ -20,11 +20,6 @@ public abstract class NoiseFunction implements NoiseSampler { } protected double frequency = 0.02d; - protected int seed; - - public NoiseFunction(int seed) { - this.seed = seed; - } protected static int fastFloor(double f) { return f >= 0 ? (int) f : (int) f - 1; @@ -114,11 +109,6 @@ public abstract class NoiseFunction implements NoiseSampler { return sinLookup((int) ((a + Math.PI / 2) * precision + 0.5f)); } - - public void setSeed(int seed) { - this.seed = seed; - } - public double getFrequency() { return frequency; } @@ -128,26 +118,16 @@ public abstract class NoiseFunction implements NoiseSampler { } @Override - public double getNoise(double x, double y) { - return getNoiseSeeded(seed, x, y); - } - - @Override - public double getNoise(double x, double y, double z) { - return getNoiseSeeded(seed, x, y, z); - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return getNoiseRaw(seed, x * frequency, y * frequency); } @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { return getNoiseRaw(seed, x * frequency, y * frequency, z * frequency); } - public abstract double getNoiseRaw(int seed, double x, double y); + public abstract double getNoiseRaw(long seed, double x, double y); - public abstract double getNoiseRaw(int seed, double x, double y, double z); + public abstract double getNoiseRaw(long seed, double x, double y, double z); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java index e95f89074..9d61b550a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java @@ -4,11 +4,11 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class BrownianMotionSampler extends FractalNoiseFunction { public BrownianMotionSampler(int seed, NoiseSampler input) { - super(seed, input); + super(input); } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; @@ -26,7 +26,7 @@ public class BrownianMotionSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java index b558ef8be..32b110610 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/FractalNoiseFunction.java @@ -11,8 +11,7 @@ public abstract class FractalNoiseFunction extends NoiseFunction { protected double lacunarity = 2.0d; protected double weightedStrength = 0.0d; - public FractalNoiseFunction(int seed, NoiseSampler input) { - super(seed); + public FractalNoiseFunction(NoiseSampler input) { this.input = input; frequency = 1; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java index 1a1ef243a..73bd77460 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java @@ -6,7 +6,7 @@ public class PingPongSampler extends FractalNoiseFunction { private double pingPongStrength = 2.0; public PingPongSampler(int seed, NoiseSampler input) { - super(seed, input); + super(input); } @@ -20,7 +20,7 @@ public class PingPongSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; @@ -38,7 +38,7 @@ public class PingPongSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java index d11af4d06..ac88e41bf 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java @@ -5,11 +5,11 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class RidgedFractalSampler extends FractalNoiseFunction { public RidgedFractalSampler(int seed, NoiseSampler input) { - super(seed, input); + super(input); } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double sum = 0; double amp = fractalBounding; @@ -27,7 +27,7 @@ public class RidgedFractalSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java index 1dc5e95d5..154015af2 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java @@ -8,13 +8,12 @@ import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; public class GaussianNoiseSampler extends NoiseFunction { private final WhiteNoiseSampler whiteNoiseSampler; // Back with a white noise sampler. - public GaussianNoiseSampler(int seed) { - super(seed); - whiteNoiseSampler = new WhiteNoiseSampler(seed); + public GaussianNoiseSampler() { + whiteNoiseSampler = new WhiteNoiseSampler(); } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { double v1, v2, s; do { v1 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y); @@ -26,7 +25,7 @@ public class GaussianNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { double v1, v2, s; do { v1 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y, z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java index 335287137..8486ec12f 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java @@ -8,8 +8,7 @@ import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; public class WhiteNoiseSampler extends NoiseFunction { private static final long POSITIVE_POW1 = 0b01111111111L << 52; // Bits that when applied to the exponent/sign section of a double, produce a positive number with a power of 1. - public WhiteNoiseSampler(int seed) { - super(seed); + public WhiteNoiseSampler() { } public double getNoiseRaw(long seed) { @@ -17,33 +16,33 @@ public class WhiteNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y) { return (getNoiseUnmapped(seed, x, y) - 1.5) * 2; } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z) { return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2; } - public double getNoiseUnmapped(int seed, double x, double y, double z) { + public double getNoiseUnmapped(long seed, double x, double y, double z) { long base = ((randomBits(seed, x, y, z)) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent return Double.longBitsToDouble(base); } - public double getNoiseUnmapped(int seed, double x, double y) { + public double getNoiseUnmapped(long seed, double x, double y) { long base = (randomBits(seed, x, y) & 0x000fffffffffffffL) | POSITIVE_POW1; // Sign and exponent return Double.longBitsToDouble(base); } - public long randomBits(int seed, double x, double y, double z) { + public long randomBits(long seed, double x, double y, double z) { long hashX = Double.doubleToRawLongBits(x) ^ seed; long hashZ = Double.doubleToRawLongBits(y) ^ seed; long hash = (((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed) + Double.doubleToRawLongBits(z); return murmur64(hash); } - public long randomBits(int seed, double x, double y) { + public long randomBits(long seed, double x, double y) { long hashX = Double.doubleToRawLongBits(x) ^ seed; long hashZ = Double.doubleToRawLongBits(y) ^ seed; long hash = ((hashX ^ (hashX >>> 32)) + ((hashZ ^ (hashZ >>> 32)) << 32)) ^ seed; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java index cb8c91d69..eb9a152f4 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java @@ -4,13 +4,10 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; * NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise. */ public class OpenSimplex2SSampler extends SimplexStyleSampler { - public OpenSimplex2SSampler(int seed) { - super(seed); - } - @Override @SuppressWarnings("NumericOverflow") - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; // 2D OpenSimplex2S case is a modified 2D simplex noise. final double SQRT3 = 1.7320508075688772935274463415059; @@ -117,7 +114,8 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { @Override @SuppressWarnings("NumericOverflow") - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; // 3D OpenSimplex2S case uses two offset rotated cube grids. final double R3 = (2.0 / 3.0); double r = (x + y + z) * R3; // Rotation, not skew diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index 6a8e46089..c4379b212 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -6,12 +6,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; public class OpenSimplex2Sampler extends SimplexStyleSampler { private static final double SQRT3 = 1.7320508075688772935274463415059; - public OpenSimplex2Sampler(int seed) { - super(seed); - } - @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. final double G2 = (3 - SQRT3) / 6; @@ -71,7 +68,8 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; // 3D OpenSimplex2Sampler case uses two offset rotated cube grids. final double R3 = (2.0 / 3.0); double r = (x + y + z) * R3; // Rotation, not skew diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java index a20dd5c79..044029a39 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java @@ -4,12 +4,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; * NoiseSampler implementation to provide Perlin Noise. */ public class PerlinSampler extends SimplexStyleSampler { - public PerlinSampler(int seed) { - super(seed); - } - @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); @@ -33,7 +30,8 @@ public class PerlinSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); int z0 = fastFloor(z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java index 9190c981a..045441534 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java @@ -23,10 +23,6 @@ public class SimplexSampler extends SimplexStyleSampler { private static final int Z_PRIME = 6971; - public SimplexSampler(int seed) { - super(seed); - } - private static double gradCoord3D(int seed, int x, int y, int z, double xd, double yd, double zd) { int hash = seed; hash ^= X_PRIME * x; @@ -55,7 +51,8 @@ public class SimplexSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; double t = (x + y) * F2; int i = fastFloor(x + t); int j = fastFloor(y + t); @@ -111,7 +108,8 @@ public class SimplexSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; double t = (x + y + z) * F3; int i = fastFloor(x + t); int j = fastFloor(y + t); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java index 39c0b6c7c..f6183e1ec 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexStyleSampler.java @@ -71,10 +71,6 @@ public abstract class SimplexStyleSampler extends NoiseFunction { 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 }; - public SimplexStyleSampler(int seed) { - super(seed); - } - protected static double gradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { int hash = hash(seed, xPrimed, yPrimed); hash ^= hash >> 15; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java index bb61eb93b..3f19dc41e 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java @@ -1,12 +1,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; public class ValueCubicSampler extends ValueStyleNoise { - public ValueCubicSampler(int seed) { - super(seed); - } - @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int x1 = fastFloor(x); int y1 = fastFloor(y); @@ -35,7 +32,8 @@ public class ValueCubicSampler extends ValueStyleNoise { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int x1 = fastFloor(x); int y1 = fastFloor(y); int z1 = fastFloor(z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java index 1546177f6..c3edfcdd8 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java @@ -2,11 +2,12 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; public class ValueSampler extends ValueStyleNoise { public ValueSampler(int seed) { - super(seed); + super(); } @Override - public double getNoiseRaw(int seed, double x, double y) { + public double getNoiseRaw(long sl, double x, double y) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); @@ -25,7 +26,8 @@ public class ValueSampler extends ValueStyleNoise { } @Override - public double getNoiseRaw(int seed, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z) { + int seed = (int) sl; int x0 = fastFloor(x); int y0 = fastFloor(y); int z0 = fastFloor(z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java index 32483df29..8ed8f263c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueStyleNoise.java @@ -3,9 +3,6 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; public abstract class ValueStyleNoise extends NoiseFunction { - public ValueStyleNoise(int seed) { - super(seed); - } protected static double valCoord(int seed, int xPrimed, int yPrimed) { int hash = hash(seed, xPrimed, yPrimed); diff --git a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java index d614e656c..73489249e 100644 --- a/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java +++ b/common/addons/config-ore/src/main/java/com/dfsek/terra/addons/ore/OrePopulator.java @@ -31,7 +31,7 @@ public class OrePopulator implements TerraGenerationStage { Random random = new Random(PopulationUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed())); int originX = ((chunk.getX() + cx) << 4); int originZ = ((chunk.getZ() + cz) << 4); - TerraBiome b = tw.getBiomeProvider().getBiome(originX + 8, originZ + 8); + TerraBiome b = tw.getBiomeProvider().getBiome(originX + 8, originZ + 8, world.getSeed()); /* BiomeTemplate config = ((UserDefinedBiome) b).getConfig(); int finalCx = cx; diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java index 94922fd6b..f572422d8 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/NoisePalette.java @@ -15,7 +15,7 @@ public class NoisePalette extends PaletteImpl { } @Override - public BlockState get(int layer, double x, double y, double z) { + public BlockState get(int layer, double x, double y, double z, long seed) { PaletteLayer paletteLayer; if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); else { @@ -24,6 +24,6 @@ public class NoisePalette extends PaletteImpl { else paletteLayer = pl.get(layer); } NoiseSampler paletteSampler = paletteLayer.getSampler(); - return paletteLayer.get(paletteSampler == null ? sampler : paletteSampler, x, y, z, is2D); + return paletteLayer.get(paletteSampler == null ? sampler : paletteSampler, x, y, z, is2D, seed); } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java index b034c49f4..4fc059397 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java @@ -13,7 +13,7 @@ import java.util.Random; * A class representation of a "slice" of the world. * Used to get a section of blocks, based on the depth at which they are found. */ -public abstract class PaletteImpl implements com.dfsek.terra.api.world.generator.Palette { +public abstract class PaletteImpl implements Palette { private final List pallet = new ArrayList<>(); /** @@ -96,9 +96,9 @@ public abstract class PaletteImpl implements com.dfsek.terra.api.world.generator return m; } - public BlockState get(NoiseSampler random, double x, double y, double z, boolean is2D) { - if(col && is2D) return this.collection.get(random, x, z); - else if(col) return this.collection.get(random, x, y, z); + public BlockState get(NoiseSampler random, double x, double y, double z, boolean is2D, long seed) { + if(col && is2D) return this.collection.get(random, x, z, seed); + else if(col) return this.collection.get(random, x, y, z, seed); return m; } @@ -115,7 +115,7 @@ public abstract class PaletteImpl implements com.dfsek.terra.api.world.generator } @Override - public BlockState get(int layer, double x, double y, double z) { + public BlockState get(int layer, double x, double y, double z, long seed) { return item; } } diff --git a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java index 8f3875e19..c2a126d2d 100644 --- a/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java +++ b/common/addons/config-structure/src/main/java/com/dfsek/terra/addons/structure/StructurePopulator.java @@ -39,7 +39,7 @@ public class StructurePopulator implements TerraGenerationStage, Chunkified { for(ConfiguredStructure conf : config.getRegistry(TerraStructure.class).entries()) { Vector3 spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()); - if(!provider.getBiome(spawn).getContext().get(BiomeStructures.class).getStructures().contains(conf)) { + if(!provider.getBiome(spawn, world.getSeed()).getContext().get(BiomeStructures.class).getStructures().contains(conf)) { continue; } Random random = new Random(PopulationUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); diff --git a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java index a496854f8..9810afbce 100644 --- a/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java +++ b/common/addons/generation-stage-feature/src/main/java/com/dfsek/terra/addons/generation/feature/FeatureGenerationStage.java @@ -25,13 +25,14 @@ public class FeatureGenerationStage implements TerraGenerationStage { try(ProfileFrame ignore = main.getProfiler().profile("feature")) { int cx = chunk.getX() << 4; int cz = chunk.getZ() << 4; + long seed = world.getSeed(); for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { int tx = cx + x; int tz = cz + z; ColumnImpl column = new ColumnImpl(tx, tz, world); - terraWorld.getBiomeProvider().getBiome(tx, tz).getContext().get(BiomeFeatures.class).getFeatures().forEach(feature -> { - if(feature.getDistributor().matches(tx, tz)) { + terraWorld.getBiomeProvider().getBiome(tx, tz, seed).getContext().get(BiomeFeatures.class).getFeatures().forEach(feature -> { + if(feature.getDistributor().matches(tx, tz, seed)) { feature.getLocator() .getSuitableCoordinates(column) .forEach(y -> diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java index 00a3354b8..7cf03a0b1 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraGenerationStage.java @@ -33,12 +33,13 @@ public class FloraGenerationStage implements TerraGenerationStage { try(ProfileFrame ignore = main.getProfiler().profile("flora")) { if(tw.getConfig().disableFlora()) return; + long seed = world.getSeed(); BiomeProvider provider = tw.getBiomeProvider(); Map> layers = new HashMap<>(); for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { Vector2 l = new Vector2(x, z); - layers.put(l, provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z).getContext().get(BiomeFlora.class).getLayers()); + layers.put(l, provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, seed).getContext().get(BiomeFlora.class).getLayers()); } } diff --git a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java index d5609e4c9..7f8c23b30 100644 --- a/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java +++ b/common/addons/generation-stage-flora/src/main/java/com/dfsek/terra/addons/generation/flora/FloraLayer.java @@ -39,7 +39,7 @@ public class FloraLayer { public void place(Chunk chunk, Vector2 coords) { int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); - Flora item = layer.get(noise, cx + coords.getX(), cz + coords.getZ()); + Flora item = layer.get(noise, cx + coords.getX(), cz + coords.getZ(), chunk.getWorld().getSeed()); item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.add(cx, 0, cz), chunk.getWorld())); } } diff --git a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java index 3f2110f51..5b454d319 100644 --- a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java +++ b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreeLayer.java @@ -40,7 +40,7 @@ public class TreeLayer { } public void place(Chunk chunk, Vector2 coords) { - Tree item = layer.get(noise, coords.getX(), coords.getZ()); + Tree item = layer.get(noise, coords.getX(), coords.getZ(), chunk.getWorld().getSeed()); BlockState current; int cx = (chunk.getX()) << 4; int cz = (chunk.getZ()) << 4; diff --git a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java index a014b4d16..6328b3497 100644 --- a/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java +++ b/common/addons/generation-stage-tree/src/main/java/com/dfsek/terra/addons/generation/tree/TreePopulator.java @@ -35,9 +35,10 @@ public class TreePopulator implements TerraGenerationStage { BiomeProvider provider = tw.getBiomeProvider(); Random random = PopulationUtil.getRandom(chunk); + long seed = world.getSeed(); for(int x = 0; x < 16; x += 2) { for(int z = 0; z < 16; z += 2) { - for(TreeLayer layer : provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z).getContext().get(BiomeTrees.class).getTrees()) { + for(TreeLayer layer : provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, seed).getContext().get(BiomeTrees.class).getTrees()) { if(layer.getDensity() >= random.nextDouble() * 100) { layer.place(chunk, new Vector2(offset(random, x), offset(random, 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 f1bfa3094..201df7fd0 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 @@ -40,7 +40,7 @@ public class BiomeFunction implements Function { BiomeProvider grid = main.getWorld(arguments.getWorld()).getBiomeProvider(); - return grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ())))).getID(); + return grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, variableMap).intValue(), FastMath.roundToInt(xz.getZ()))), arguments.getWorld().getSeed()).getID(); } diff --git a/common/api/build.gradle.kts b/common/api/build.gradle.kts index 9197579d8..ef64d7c34 100644 --- a/common/api/build.gradle.kts +++ b/common/api/build.gradle.kts @@ -13,7 +13,7 @@ configureDependencies() group = "com.dfsek.terra.common" dependencies { - "shadedApi"("com.dfsek:Paralithic:0.3.2") + "shadedApi"("com.dfsek:Paralithic:0.4.0") "shadedApi"("com.dfsek.tectonic:common:2.1.1") "shadedApi"("com.dfsek.tectonic:yaml:2.1.1") diff --git a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java index ad1de8b74..e3fc8a9bc 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java @@ -8,50 +8,26 @@ public interface NoiseSampler { static NoiseSampler zero() { return new NoiseSampler() { @Override - public double getNoise(double x, double y) { + public double getNoiseSeeded(long seed, double x, double y) { return 0; } @Override - public double getNoise(double x, double y, double z) { - return 0; - } - - @Override - public double getNoiseSeeded(int seed, double x, double y) { - return 0; - } - - @Override - public double getNoiseSeeded(int seed, double x, double y, double z) { + public double getNoiseSeeded(long seed, double x, double y, double z) { return 0; } }; } - /** - * 2D noise at given position using current settings - *

- * Noise output bounded between -1...1 - */ - double getNoise(double x, double y); - - /** - * 3D noise at given position using current settings - *

- * Noise output bounded between -1...1 - */ - double getNoise(double x, double y, double z); - - default double getNoise(Vector3 vector3) { - return getNoise(vector3.getX(), vector3.getY(), vector3.getZ()); + default double getNoiseSeeded(Vector3 vector3, long seed) { + return getNoiseSeeded(seed, vector3.getX(), vector3.getY(), vector3.getZ()); } - default double getNoise(Vector2 vector2) { - return getNoise(vector2.getX(), vector2.getZ()); + default double getNoiseSeeded(Vector2 vector2, long seed) { + return getNoiseSeeded(seed, vector2.getX(), vector2.getZ()); } - double getNoiseSeeded(int seed, double x, double y); + double getNoiseSeeded(long seed, double x, double y); - double getNoiseSeeded(int seed, double x, double y, double z); + double getNoiseSeeded(long seed, double x, double y, double z); } diff --git a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java index be8b9cf11..2d9d33ca1 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java +++ b/common/api/src/main/java/com/dfsek/terra/api/structure/feature/Distributor.java @@ -1,13 +1,13 @@ package com.dfsek.terra.api.structure.feature; public interface Distributor { - boolean matches(int x, int z); + boolean matches(int x, int z, long seed); default Distributor and(Distributor other) { - return (x, z) -> this.matches(x, z) && other.matches(x, z); + return (x, z, seed) -> this.matches(x, z, seed) && other.matches(x, z, seed); } default Distributor or(Distributor other) { - return (x, z) -> this.matches(x, z) || other.matches(x, z); + return (x, z, seed) -> this.matches(x, z, seed) || other.matches(x, z, seed); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java b/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java index b82017112..f2b7b1926 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java +++ b/common/api/src/main/java/com/dfsek/terra/api/util/collection/ProbabilityCollection.java @@ -38,15 +38,15 @@ public class ProbabilityCollection implements Collection { } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, double x, double y, double z) { + public E get(NoiseSampler n, double x, double y, double z, long seed) { if(array.length == 0) return null; - return (E) array[MathUtil.normalizeIndex(n.getNoise(x, y, z), array.length)]; + return (E) array[MathUtil.normalizeIndex(n.getNoiseSeeded(seed, x, y, z), array.length)]; } @SuppressWarnings("unchecked") - public E get(NoiseSampler n, double x, double z) { + public E get(NoiseSampler n, double x, double z, long seed) { if(array.length == 0) return null; - return (E) array[MathUtil.normalizeIndex(n.getNoise(x, z), array.length)]; + return (E) array[MathUtil.normalizeIndex(n.getNoiseSeeded(seed, x, z), array.length)]; } @SuppressWarnings("unchecked") @@ -183,12 +183,12 @@ public class ProbabilityCollection implements Collection { } @Override - public T get(NoiseSampler n, double x, double y, double z) { + public T get(NoiseSampler n, double x, double y, double z, long seed) { return single; } @Override - public T get(NoiseSampler n, double x, double z) { + public T get(NoiseSampler n, double x, double z, long seed) { return single; } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java index c42557317..807fd7888 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/BiomeProvider.java @@ -5,18 +5,13 @@ import com.dfsek.terra.api.vector.Vector3; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeProvider { - TerraBiome getBiome(int x, int z); + TerraBiome getBiome(int x, int z, long seed); - default TerraBiome getBiome(Vector2 vector2) { - return getBiome(vector2.getBlockX(), vector2.getBlockZ()); + default TerraBiome getBiome(Vector2 vector2, long seed) { + return getBiome(vector2.getBlockX(), vector2.getBlockZ(), seed); } - default TerraBiome getBiome(Vector3 vector3) { - return getBiome(vector3.getBlockX(), vector3.getBlockZ()); - } - - @Deprecated - enum Type { - IMAGE, PIPELINE, SINGLE + default TerraBiome getBiome(Vector3 vector3, long seed) { + return getBiome(vector3.getBlockX(), vector3.getBlockZ(), seed); } } diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java index ad8c208d0..6c6cc3629 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/biome/generation/pipeline/BiomeSource.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.world.biome.generation.pipeline; import com.dfsek.terra.api.world.biome.TerraBiome; public interface BiomeSource { - TerraBiome getBiome(double x, double z); + TerraBiome getBiome(double x, double z, long seed); enum Type { NOISE diff --git a/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java b/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java index ca4f846d7..9d3de225e 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java +++ b/common/api/src/main/java/com/dfsek/terra/api/world/generator/Palette.java @@ -15,7 +15,7 @@ public interface Palette { * @param layer - The layer at which to fetch the material. * @return BlockData - The material fetched. */ - BlockState get(int layer, double x, double y, double z); + BlockState get(int layer, double x, double y, double z, long seed); int getSize(); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java index 3b43d6c96..56c8caf8b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraBiomeSource.java @@ -53,7 +53,7 @@ public class TerraBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { - TerraBiome biome = grid.getBiome(biomeX << 2, biomeZ << 2); + TerraBiome biome = grid.getBiome(biomeX << 2, biomeZ << 2, seed); return biomeRegistry.get(new Identifier("terra", FabricUtil.createBiomeID(pack, biome.getID()))); } }