diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/random/GaussianNoiseSampler.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/random/GaussianNoiseSampler.java new file mode 100644 index 000000000..e094ed7e6 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/random/GaussianNoiseSampler.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.api.math.noise.samplers.noise.random; + +import com.dfsek.terra.api.math.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); + } + + @Override + public double getNoiseRaw(int seed, double x, double y) { + double v1, v2, s; + do { + v1 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y); + v2 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y); + s = v1 * v1 + v2 * v2; + } while(s >= 1 || s == 0); + double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) / s); + return v1 * multiplier; + } + + @Override + public double getNoiseRaw(int seed, double x, double y, double z) { + double v1, v2, s; + do { + v1 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y, z); + v2 = whiteNoiseSampler.getNoiseSeeded(seed++, x, y, z); + s = v1 * v1 + v2 * v2; + } while(s >= 1 || s == 0); + double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s) / s); + return v1 * multiplier; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/WhiteNoiseSampler.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/random/WhiteNoiseSampler.java similarity index 91% rename from common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/WhiteNoiseSampler.java rename to common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/random/WhiteNoiseSampler.java index 5f6fde2c0..4dcfeb3b9 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/WhiteNoiseSampler.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/noise/random/WhiteNoiseSampler.java @@ -1,4 +1,6 @@ -package com.dfsek.terra.api.math.noise.samplers.noise; +package com.dfsek.terra.api.math.noise.samplers.noise.random; + +import com.dfsek.terra.api.math.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. diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index 4d4cae0b1..ba51ca3dd 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.core.TerraPlugin; -import com.dfsek.terra.api.math.noise.samplers.noise.WhiteNoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.NoisePalette; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java index 112c953c8..411dd0b5e 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java @@ -6,7 +6,7 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.samplers.noise.WhiteNoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java index feba742bc..fa2b98181 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.samplers.noise.WhiteNoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java index 3bec92cbc..e18ae2618 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.math.noise.NoiseSampler; -import com.dfsek.terra.api.math.noise.samplers.noise.WhiteNoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; diff --git a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java index 4531dd5df..e6625b3e9 100644 --- a/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/config/NoiseRegistry.java @@ -1,7 +1,8 @@ package com.dfsek.terra.registry.config; import com.dfsek.tectonic.loading.object.ObjectTemplate; -import com.dfsek.terra.api.math.noise.samplers.noise.WhiteNoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.noise.random.GaussianNoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.OpenSimplex2SSampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.OpenSimplex2Sampler; import com.dfsek.terra.api.math.noise.samplers.noise.simplex.PerlinSampler; @@ -51,6 +52,7 @@ public class NoiseRegistry extends TerraRegistry new SimpleNoiseTemplate(WhiteNoiseSampler::new)); + add("GAUSSIAN", () -> new SimpleNoiseTemplate(GaussianNoiseSampler::new)); add("CONSTANT", ConstantNoiseTemplate::new);