From 4387aa814b59501698d4f5dcc937e89b9b890b0f Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Thu, 5 Jun 2025 15:25:57 +0200 Subject: [PATCH] add offset to all noise types to prevent common value between seeds --- .../iris/util/noise/NoiseGenerator.java | 4 ++ .../com/volmit/iris/util/noise/NoiseType.java | 22 ++++++++- .../iris/util/noise/OffsetNoiseGenerator.java | 46 +++++++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 core/src/main/java/com/volmit/iris/util/noise/OffsetNoiseGenerator.java diff --git a/core/src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java b/core/src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java index 6ad166239..4574e9eb1 100644 --- a/core/src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java +++ b/core/src/main/java/com/volmit/iris/util/noise/NoiseGenerator.java @@ -39,4 +39,8 @@ public interface NoiseGenerator { default ProceduralStream stream() { return ProceduralStream.of(this::noise, this::noise, Interpolated.DOUBLE); } + + default OffsetNoiseGenerator offset(long seed) { + return new OffsetNoiseGenerator(this, seed); + } } diff --git a/core/src/main/java/com/volmit/iris/util/noise/NoiseType.java b/core/src/main/java/com/volmit/iris/util/noise/NoiseType.java index b2d26b2c8..636d847f1 100644 --- a/core/src/main/java/com/volmit/iris/util/noise/NoiseType.java +++ b/core/src/main/java/com/volmit/iris/util/noise/NoiseType.java @@ -18,7 +18,9 @@ package com.volmit.iris.util.noise; +import com.volmit.iris.util.collection.KSet; import com.volmit.iris.util.interpolation.InterpolationMethod; +import com.volmit.iris.util.math.RNG; public enum NoiseType { WHITE(WhiteNoise::new), @@ -77,6 +79,24 @@ public enum NoiseType { } public NoiseGenerator create(long seed) { - return f.create(seed); + return f.create(seed).offset(seed); + } + + public static void main(String[] args) { + long[] seeds = new long[10000]; + for (int i = 0; i < seeds.length; i++) { + seeds[i] = RNG.r.lmax(); + } + + for (NoiseType t : NoiseType.values()) { + KSet set = new KSet<>(); + for (long seed : seeds) { + set.add(t.create(seed).noise(0, 0)); + } + + if (set.size() == 1) { + System.out.println(t + " " + set); + } + } } } diff --git a/core/src/main/java/com/volmit/iris/util/noise/OffsetNoiseGenerator.java b/core/src/main/java/com/volmit/iris/util/noise/OffsetNoiseGenerator.java new file mode 100644 index 000000000..4febe468b --- /dev/null +++ b/core/src/main/java/com/volmit/iris/util/noise/OffsetNoiseGenerator.java @@ -0,0 +1,46 @@ +package com.volmit.iris.util.noise; + +import com.volmit.iris.util.math.RNG; +import org.jetbrains.annotations.NotNull; + +public class OffsetNoiseGenerator implements NoiseGenerator { + private final NoiseGenerator base; + private final double ox, oz; + + public OffsetNoiseGenerator(NoiseGenerator base, long seed) { + this.base = base; + RNG rng = new RNG(seed); + ox = rng.nextDouble(Integer.MIN_VALUE, Integer.MAX_VALUE); + oz = rng.nextDouble(Integer.MIN_VALUE, Integer.MAX_VALUE); + } + + @Override + public double noise(double x) { + return base.noise(x + ox); + } + + @Override + public double noise(double x, double z) { + return base.noise(x + ox, z + oz); + } + + @Override + public double noise(double x, double y, double z) { + return base.noise(x + ox, y, z + oz); + } + + @Override + public boolean isNoScale() { + return base.isNoScale(); + } + + @Override + public boolean isStatic() { + return base.isStatic(); + } + + @NotNull + public NoiseGenerator getBase() { + return base; + } +}