From 54b7d2e75538975ecad4e650293edc701e011592 Mon Sep 17 00:00:00 2001 From: Julian Krings Date: Mon, 23 Jun 2025 12:38:54 +0200 Subject: [PATCH] add toggle for legacy rarity calculation --- .../com/volmit/iris/engine/object/IRare.java | 6 +++--- .../iris/engine/object/IrisExpression.java | 6 +++++- .../iris/engine/object/IrisImageMap.java | 3 +++ .../iris/engine/object/IrisStyledRange.java | 3 ++- .../java/com/volmit/iris/util/noise/CNG.java | 4 ++++ .../iris/util/noise/ExpressionNoise.java | 5 +++++ .../volmit/iris/util/noise/ImageNoise.java | 5 +++++ .../iris/util/noise/NoiseGenerator.java | 7 ++++++- .../volmit/iris/util/stream/BasicStream.java | 5 +++++ .../iris/util/stream/ProceduralStream.java | 20 +++++++++++-------- .../arithmetic/RoundingDoubleStream.java | 4 ++++ .../convert/AwareConversionStream2D.java | 5 +++++ .../convert/AwareConversionStream3D.java | 5 +++++ .../convert/CachedConversionStream.java | 5 +++++ .../util/stream/convert/ConversionStream.java | 5 +++++ .../stream/convert/ForceDoubleStream.java | 4 ++++ .../util/stream/convert/RoundingStream.java | 5 +++++ .../util/stream/convert/SelectionStream.java | 5 +++++ .../stream/convert/SignificanceStream.java | 5 +++++ .../iris/util/stream/sources/CNGStream.java | 4 ++++ .../util/stream/sources/FunctionStream.java | 11 ++++++++++ .../util/stream/utility/CachedStream2D.java | 5 +++++ .../util/stream/utility/CachedStream3D.java | 5 +++++ .../util/stream/utility/NullSafeStream.java | 5 +++++ 24 files changed, 123 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/com/volmit/iris/engine/object/IRare.java b/core/src/main/java/com/volmit/iris/engine/object/IRare.java index 42639ff62..daaeac420 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IRare.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IRare.java @@ -26,8 +26,8 @@ import java.util.List; public interface IRare { static ProceduralStream stream(ProceduralStream noise, List possibilities) { - return ProceduralStream.of((x, z) -> pick(possibilities, noise.get(x, z)), - (x, y, z) -> pick(possibilities, noise.get(x, y, z)), + return ProceduralStream.of(noise.isLegacyRarity() ? (x, z) -> pickLegacy(possibilities, noise.get(x, z)) : (x, z) -> pick(possibilities, noise.get(x, z)), + noise.isLegacyRarity() ? (x, y, z) -> pickLegacy(possibilities, noise.get(x, y, z)) : (x, y, z) -> pick(possibilities, noise.get(x, y, z)), new Interpolated() { @Override public double toDouble(T t) { @@ -38,7 +38,7 @@ public interface IRare { public T fromDouble(double d) { return null; } - }); + }).setLegacyRarity(noise.isLegacyRarity()); } diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisExpression.java b/core/src/main/java/com/volmit/iris/engine/object/IrisExpression.java index 0fbd1c48a..54b3c8a72 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisExpression.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisExpression.java @@ -59,6 +59,9 @@ public class IrisExpression extends IrisRegistrant { @Desc("The expression. Inherited variables are x, y and z. Avoid using those variable names.") private String expression; + @Desc("Use legacy rarity calculation") + private boolean legacyRarity = true; + private transient AtomicCache expressionCache = new AtomicCache<>(); private transient AtomicCache> streamCache = new AtomicCache<>(); @@ -99,7 +102,8 @@ public class IrisExpression extends IrisRegistrant { public ProceduralStream stream(RNG rng) { return streamCache.aquire(() -> ProceduralStream.of((x, z) -> evaluate(rng, x, z), - (x, y, z) -> evaluate(rng, x, y, z), Interpolated.DOUBLE)); + (x, y, z) -> evaluate(rng, x, y, z), Interpolated.DOUBLE) + .setLegacyRarity(legacyRarity)); } public double evaluate(RNG rng, double x, double z) { diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisImageMap.java b/core/src/main/java/com/volmit/iris/engine/object/IrisImageMap.java index ba48d1899..9cbec4f4b 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisImageMap.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisImageMap.java @@ -62,6 +62,9 @@ public class IrisImageMap { @Desc("Center 0,0 to the center of the image instead of the top left.") private boolean centered = true; + @Desc("Use legacy rarity calculation") + private boolean legacyRarity = true; + private transient AtomicCache imageCache = new AtomicCache(); public double getNoise(IrisData data, int x, int z) { diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java b/core/src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java index 4d2d30dac..83e01cfe0 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisStyledRange.java @@ -59,7 +59,8 @@ public class IrisStyledRange { } public ProceduralStream stream(RNG rng, IrisData data) { - return ProceduralStream.of((x, z) -> get(rng, x, z, data), Interpolated.DOUBLE); + return ProceduralStream.of((x, z) -> get(rng, x, z, data), Interpolated.DOUBLE) + .setLegacyRarity(style.create(rng, data).isLegacyRarity()); } public boolean isFlat() { diff --git a/core/src/main/java/com/volmit/iris/util/noise/CNG.java b/core/src/main/java/com/volmit/iris/util/noise/CNG.java index a17fee3f0..876f9d98c 100644 --- a/core/src/main/java/com/volmit/iris/util/noise/CNG.java +++ b/core/src/main/java/com/volmit/iris/util/noise/CNG.java @@ -524,4 +524,8 @@ public class CNG { public boolean isStatic() { return generator != null && generator.isStatic(); } + + public boolean isLegacyRarity() { + return generator != null && generator.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java b/core/src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java index 7052d9dd2..e0796be42 100644 --- a/core/src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java +++ b/core/src/main/java/com/volmit/iris/util/noise/ExpressionNoise.java @@ -44,4 +44,9 @@ public class ExpressionNoise implements NoiseGenerator { public double noise(double x, double y, double z) { return expression.evaluate(rng, x, y, z); } + + @Override + public boolean isLegacyRarity() { + return expression.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/noise/ImageNoise.java b/core/src/main/java/com/volmit/iris/util/noise/ImageNoise.java index 2bd790fd5..f84402491 100644 --- a/core/src/main/java/com/volmit/iris/util/noise/ImageNoise.java +++ b/core/src/main/java/com/volmit/iris/util/noise/ImageNoise.java @@ -44,4 +44,9 @@ public class ImageNoise implements NoiseGenerator { public double noise(double x, double y, double z) { return noise(x, z + y); } + + @Override + public boolean isLegacyRarity() { + return expression.isLegacyRarity(); + } } 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..e21f8bb79 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 @@ -36,7 +36,12 @@ public interface NoiseGenerator { return false; } + default boolean isLegacyRarity() { + return false; + } + default ProceduralStream stream() { - return ProceduralStream.of(this::noise, this::noise, Interpolated.DOUBLE); + return ProceduralStream.of(this::noise, this::noise, Interpolated.DOUBLE) + .setLegacyRarity(isLegacyRarity()); } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/BasicStream.java b/core/src/main/java/com/volmit/iris/util/stream/BasicStream.java index b23ba9801..794c28e71 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/BasicStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/BasicStream.java @@ -52,4 +52,9 @@ public abstract class BasicStream extends BasicLayer implements ProceduralStr @Override public abstract T fromDouble(double d); + + @Override + public boolean isLegacyRarity() { + return source != null && source.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java b/core/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java index e860f299a..44b135952 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/ProceduralStream.java @@ -45,7 +45,7 @@ import java.util.function.Function; @SuppressWarnings("ALL") public interface ProceduralStream extends ProceduralLayer, Interpolated { - static ProceduralStream ofDouble(Function2 f) { + static FunctionStream ofDouble(Function2 f) { try { return of(f, Interpolated.DOUBLE); } catch (IncompatibleClassChangeError e) { @@ -56,27 +56,27 @@ public interface ProceduralStream extends ProceduralLayer, Interpolated { } } - static ProceduralStream ofDouble(Function3 f) { + static FunctionStream ofDouble(Function3 f) { return of(f, Interpolated.DOUBLE); } - static ProceduralStream of(Function2 f, Interpolated helper) { + static FunctionStream of(Function2 f, Interpolated helper) { return of(f, (x, y, z) -> f.apply(x, z), helper); } - static ProceduralStream of(Function3 f, Interpolated helper) { + static FunctionStream of(Function3 f, Interpolated helper) { return of((x, z) -> f.apply(x, 0D, z), f, helper); } - static ProceduralStream of(Function2 f, Function3 f2, Interpolated helper) { + static FunctionStream of(Function2 f, Function3 f2, Interpolated helper) { return new FunctionStream<>(f, f2, helper); } - default ProceduralStream chance(double chance) { + default FunctionStream chance(double chance) { return of((x, z) -> getDouble(x, z) < chance, Interpolated.BOOLEAN); } - default ProceduralStream seededChance(RNG brng, long rootSeed, double chance) { + default FunctionStream seededChance(RNG brng, long rootSeed, double chance) { RNG rng = brng.nextParallelRNG(rootSeed - 3995L); return of((x, z) -> { double ch = getDouble(x, z); @@ -388,7 +388,7 @@ public interface ProceduralStream extends ProceduralLayer, Interpolated { return ProceduralStream.of((x, z) -> { double d = getDouble(x, z); return range.get(rng, d, -d, data); - }, Interpolated.DOUBLE); + }, Interpolated.DOUBLE).setLegacyRarity(range.getStyle().create(rng, data).isLegacyRarity()); } default Hunk fastFill2DParallel(int x, int z) { @@ -577,4 +577,8 @@ public interface ProceduralStream extends ProceduralLayer, Interpolated { T get(double x, double z); T get(double x, double y, double z); + + default boolean isLegacyRarity() { + return false; + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java index 7b24faf0e..cd163109a 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/arithmetic/RoundingDoubleStream.java @@ -53,4 +53,8 @@ public class RoundingDoubleStream extends BasicStream { return round(stream.getDouble(x, y, z)); } + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java b/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java index 2ddecb93b..c2f697a27 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream2D.java @@ -60,4 +60,9 @@ public class AwareConversionStream2D extends BasicStream { public V get(double x, double y, double z) { return converter.apply(stream.get(x, y, z), x, z); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java b/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java index fefbc2a6c..1e3c62ee6 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/AwareConversionStream3D.java @@ -62,4 +62,9 @@ public class AwareConversionStream3D extends BasicStream { public V get(double x, double y, double z) { return converter.apply(stream.get(x, y, z), x, y, z); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java index b056a9cce..d762591bd 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/CachedConversionStream.java @@ -65,4 +65,9 @@ public class CachedConversionStream extends BasicLayer implements Procedur public V get(double x, double y, double z) { return cache.computeIfAbsent(stream.get(x, y, z), converter); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java index 9aae8e741..1b6767150 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/ConversionStream.java @@ -66,4 +66,9 @@ public class ConversionStream extends BasicLayer implements ProceduralStre public V get(double x, double y, double z) { return converter.apply(stream.get(x, y, z)); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java index f9c28cb10..85c741d39 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/ForceDoubleStream.java @@ -49,4 +49,8 @@ public class ForceDoubleStream extends BasicStream { return stream.getDouble(x, y, z); } + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java index 272a3d691..976f4270e 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/RoundingStream.java @@ -52,4 +52,9 @@ public class RoundingStream extends BasicStream { public Integer get(double x, double y, double z) { return round(stream.getDouble(x, y, z)); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java index d4ee0038a..0a5254b05 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/SelectionStream.java @@ -66,4 +66,9 @@ public class SelectionStream extends BasicStream { return options[stream.get(x, y, z)]; } + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } + } diff --git a/core/src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java b/core/src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java index 2353cb641..6862054a0 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/convert/SignificanceStream.java @@ -82,4 +82,9 @@ public class SignificanceStream, T> extends BasicStrea public K get(double x, double y, double z) { return get(x, z); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java b/core/src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java index 4878a5e58..1939f5f53 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/sources/CNGStream.java @@ -69,4 +69,8 @@ public class CNGStream extends BasicLayer implements ProceduralStream { return cng.noise((x + getOffsetX()) / getZoom(), (y + getOffsetY()) / getZoom(), (z + getOffsetZ()) * getZoom()); } + @Override + public boolean isLegacyRarity() { + return cng.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java b/core/src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java index 66a1ce506..fadfd75b6 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/sources/FunctionStream.java @@ -27,6 +27,7 @@ public class FunctionStream extends BasicStream { private final Function2 f2; private final Function3 f3; private final Interpolated helper; + private volatile boolean legacyRarity = false; public FunctionStream(Function2 f2, Function3 f3, Interpolated helper) { super(); @@ -54,4 +55,14 @@ public class FunctionStream extends BasicStream { public T get(double x, double y, double z) { return f3.apply(x, y, z); } + + @Override + public boolean isLegacyRarity() { + return legacyRarity; + } + + public FunctionStream setLegacyRarity(boolean legacyRarity) { + this.legacyRarity = legacyRarity; + return this; + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java b/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java index 10d687459..cebc1654d 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java +++ b/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream2D.java @@ -81,4 +81,9 @@ public class CachedStream2D extends BasicStream implements ProceduralStrea public boolean isClosed() { return engine.isClosed(); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java b/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java index 7c1b66407..0d9a9b821 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java +++ b/core/src/main/java/com/volmit/iris/util/stream/utility/CachedStream3D.java @@ -79,4 +79,9 @@ public class CachedStream3D extends BasicStream implements ProceduralStrea public boolean isClosed() { return engine.isClosed(); } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } } diff --git a/core/src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java b/core/src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java index b17dd0076..ff4906c25 100644 --- a/core/src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java +++ b/core/src/main/java/com/volmit/iris/util/stream/utility/NullSafeStream.java @@ -62,4 +62,9 @@ public class NullSafeStream extends BasicStream implements ProceduralStrea return t; } + + @Override + public boolean isLegacyRarity() { + return stream.isLegacyRarity(); + } }