diff --git a/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java b/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java index 7b65c495a..90e8d403f 100644 --- a/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/DimensionChunkGenerator.java @@ -120,14 +120,14 @@ public abstract class DimensionChunkGenerator extends ContextualChunkGenerator { return (getDimension().cosRotate() * rx) + (-getDimension().sinRotate() * rz) + - getDimension().getCoordFracture(masterRandom, 39392).fitDoubleD(-getDimension().getCoordFractureDistance() / 2, getDimension().getCoordFractureDistance() / 2, rx, rz); + getDimension().getCoordFracture(masterRandom, 39392).fitDouble(-getDimension().getCoordFractureDistance() / 2, getDimension().getCoordFractureDistance() / 2, rx, rz); } public double getModifiedZ(int rx, int rz) { return (getDimension().sinRotate() * rx) + (getDimension().cosRotate() * rz) + - getDimension().getCoordFracture(masterRandom, 39392).fitDoubleD(-getDimension().getCoordFractureDistance() / 2, getDimension().getCoordFractureDistance() / 2, rx, rz); + getDimension().getCoordFracture(masterRandom, 39392).fitDouble(-getDimension().getCoordFractureDistance() / 2, getDimension().getCoordFractureDistance() / 2, rx, rz); } public double getZoomed(double modified) diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java index bc720d900..ed9d3a424 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java @@ -60,7 +60,7 @@ public class GenLayerCave extends GenLayer double distanceTake = 0.0022 * baseWidth; double drop = (-i * 17) + 44 + iris.getDimension().getCaveShift(); double caveHeightNoise = incline * gincline.noise((wx + (10000 * i)), (wz - (10000 * i))); - caveHeightNoise += shuffle.fitDoubleD(-1, 1, wxx - caveHeightNoise, wzz + caveHeightNoise) * 3; + caveHeightNoise += shuffle.fitDouble(-1, 1, wxx - caveHeightNoise, wzz + caveHeightNoise) * 3; int ceiling = -256; int floor = 512; diff --git a/src/main/java/com/volmit/iris/noise/CNG.java b/src/main/java/com/volmit/iris/noise/CNG.java index 24873998d..4b46a7d10 100644 --- a/src/main/java/com/volmit/iris/noise/CNG.java +++ b/src/main/java/com/volmit/iris/noise/CNG.java @@ -2,6 +2,7 @@ package com.volmit.iris.noise; import java.util.List; +import com.volmit.iris.util.IRare; import com.volmit.iris.util.IrisInterpolation; import com.volmit.iris.util.KList; import com.volmit.iris.util.NoiseInjector; @@ -21,6 +22,7 @@ public class CNG { public static final NoiseInjector DST_MOD = (s, v) -> new double[] { v % s, 0 }; public static final NoiseInjector DST_POW = (s, v) -> new double[] { Math.pow(v, s), 0 }; private double scale; + private double bakedScale; private double fscale; private KList children; private CNG fracture; @@ -65,7 +67,8 @@ public class CNG { new CNG(rng.nextParallelRNG(18), 1, 1).scale(0.9) .fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1).scale(0.21) .fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1).scale(0.9), 620), 145), - 44); + 44) + .bake(); // @done } @@ -76,16 +79,20 @@ public class CNG { new CNG(rng.nextParallelRNG(18), 1, 1).scale(0.5) .fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1).scale(0.11) .fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1).scale(0.4), 620), 145), - 44); + 44) + .bake(); // @done } public static CNG signatureHalf(RNG rng, NoiseType t) { // @builder - return new CNG(rng.nextParallelRNG(127), t, 1D, 1).fractureWith( - new CNG(rng.nextParallelRNG(18), 1, 1).scale(0.9).fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1) - .scale(0.21).fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1).scale(0.9), 420), 99), - 22); + return new CNG(rng.nextParallelRNG(127), t, 1D, 1) + .fractureWith( + new CNG(rng.nextParallelRNG(18), 1, 1).scale(0.9) + .fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1).scale(0.21) + .fractureWith(new CNG(rng.nextParallelRNG(20), 1, 1).scale(0.9), 420), 99), + 22) + .bake(); // @done } @@ -108,6 +115,7 @@ public class CNG { power = 1; scale = 1; patch = 1; + bakedScale = 1; fscale = 1; down = 0; up = 0; @@ -121,6 +129,12 @@ public class CNG { } } + public CNG bake() { + bakedScale *= scale; + scale = 1; + return this; + } + public CNG child(CNG c) { if (children == null) { children = new KList<>(); @@ -170,6 +184,47 @@ public class CNG { return this; } + public T fitRarity(List l, double... dim) { + if (l.isEmpty()) { + return null; + } + + if (l.size() == 1) { + return l.get(0); + } + + int total = 0; + boolean allOne = true; + + for (T i : l) { + int r = i.getRarity(); + + if (r > 1) { + allOne = false; + } + + total += r; + } + + int m = fit(0, total - 1, dim); + + if (m == 0) { + return l.get(0); + } + + if (allOne) { + return l.get(m); + } + + T c = l.get(0); + + while (m > 0) { + m -= c.getRarity(); + } + + return c; + } + public T fit(T[] v, double... dim) { if (v.length == 0) { return null; @@ -204,7 +259,7 @@ public class CNG { return (int) Math.round(IrisInterpolation.lerp(min, max, noise)); } - public int fitDouble(double min, double max, double... dim) { + public int fit(double min, double max, double... dim) { if (min == max) { return (int) Math.round(min); } @@ -214,7 +269,7 @@ public class CNG { return (int) Math.round(IrisInterpolation.lerp(min, max, noise)); } - public double fitDoubleD(double min, double max, double... dim) { + public double fitDouble(double min, double max, double... dim) { if (min == max) { return min; } @@ -224,17 +279,8 @@ public class CNG { return IrisInterpolation.lerp(min, max, noise); } - public int fitDoubleExponent(double min, double max, double exponent, double... dim) { - if (min == max) { - return (int) Math.round(min); - } - - double noise = noise(dim); - - return (int) Math.round(IrisInterpolation.lerp(min, max, exponent == 1 ? noise : Math.pow(noise, exponent))); - } - public double noise(double... dim) { + double scale = this.bakedScale * this.scale; double f = fracture != null ? (fracture.noise(dim) - 0.5) * fscale : 0D; double x = dim.length > 0 ? dim[0] + f : 0D; double y = dim.length > 1 ? dim[1] - f : 0D; diff --git a/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java b/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java index caa05e0e7..3082c439e 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java +++ b/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java @@ -147,7 +147,7 @@ public class IrisBiomeDecorator { xx /= getZoom(); zz /= getZoom(); - if (getGenerator(rng).fitDoubleD(0D, 1D, xx, zz) <= chance) { + if (getGenerator(rng).fitDouble(0D, 1D, xx, zz) <= chance) { if (getBlockData().size() == 1) { return getBlockData().get(0); } diff --git a/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java b/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java index c2b90e922..0a5bfb79e 100644 --- a/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java +++ b/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java @@ -126,7 +126,7 @@ public class IrisNoiseGenerator g += 819; } - double n = getGenerator(superSeed).fitDoubleD(0, opacity, (x / zoom) + offsetX, (z / zoom) + offsetZ); + double n = getGenerator(superSeed).fitDouble(0, opacity, (x / zoom) + offsetX, (z / zoom) + offsetZ); n = negative ? (-n + opacity) : n; n = (exponent != 1 ? n < 0 ? -Math.pow(-n, exponent) : Math.pow(n, exponent) : n) + offsetY; n = parametric ? IrisInterpolation.parametric(n, 1) : n; diff --git a/src/main/java/com/volmit/iris/object/IrisRegion.java b/src/main/java/com/volmit/iris/object/IrisRegion.java index b70ff1528..72f532c31 100644 --- a/src/main/java/com/volmit/iris/object/IrisRegion.java +++ b/src/main/java/com/volmit/iris/object/IrisRegion.java @@ -219,7 +219,7 @@ public class IrisRegion extends IrisRegistrant implements IRare public double getShoreHeight(double x, double z) { - return getShoreHeightGenerator().fitDoubleD(shoreHeightMin, shoreHeightMax, x / shoreHeightZoom, z / shoreHeightZoom); + return getShoreHeightGenerator().fitDouble(shoreHeightMin, shoreHeightMax, x / shoreHeightZoom, z / shoreHeightZoom); } public KList getAllBiomes(ContextualChunkGenerator g) diff --git a/src/main/java/com/volmit/iris/object/IrisStructure.java b/src/main/java/com/volmit/iris/object/IrisStructure.java index d028a76f3..7a22cd6e5 100644 --- a/src/main/java/com/volmit/iris/object/IrisStructure.java +++ b/src/main/java/com/volmit/iris/object/IrisStructure.java @@ -130,7 +130,7 @@ public class IrisStructure extends IrisRegistrant } BlockPosition p = asTileHorizon(new BlockPosition((int) x, (int) y, (int) z), face); - return (getWallGenerator(rng).fitDoubleD(0, 1, p.getX(), p.getY(), p.getZ()) < getWallChance()); + return (getWallGenerator(rng).fitDouble(0, 1, p.getX(), p.getY(), p.getZ()) < getWallChance()); } public int getTileHorizon(double v) diff --git a/src/main/java/com/volmit/iris/object/NoiseStyle.java b/src/main/java/com/volmit/iris/object/NoiseStyle.java index ab7465a01..d7b4286ee 100644 --- a/src/main/java/com/volmit/iris/object/NoiseStyle.java +++ b/src/main/java/com/volmit/iris/object/NoiseStyle.java @@ -330,6 +330,6 @@ public enum NoiseStyle { } public CNG create(RNG seed) { - return f.create(seed); + return f.create(seed).bake(); } }