diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index 6787fc906..e2f2e0216 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -22,12 +22,12 @@ import com.volmit.iris.gen.post.PostPotholeFiller; import com.volmit.iris.gen.post.PostSlabber; import com.volmit.iris.gen.post.PostWallPatcher; import com.volmit.iris.gen.post.PostWaterlogger; +import com.volmit.iris.noise.CNG; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.BoardManager; import com.volmit.iris.util.BoardProvider; import com.volmit.iris.util.BoardSettings; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.Form; import com.volmit.iris.util.GroupedExecutor; diff --git a/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java b/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java index c9052a95d..5ac43a217 100644 --- a/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/BiomeChunkGenerator.java @@ -4,6 +4,7 @@ import org.bukkit.World; import com.volmit.iris.Iris; import com.volmit.iris.gen.layer.GenLayerBiome; +import com.volmit.iris.noise.CNG; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiomeGeneratorLink; @@ -11,7 +12,6 @@ import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisGenerator; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.BiomeResult; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.IrisInterpolation; diff --git a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java index 6898592f6..bd42ddb36 100644 --- a/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/ContextualChunkGenerator.java @@ -24,6 +24,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.IrisContext; import com.volmit.iris.IrisDataManager; import com.volmit.iris.IrisMetrics; +import com.volmit.iris.noise.CNG; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisGenerator; @@ -31,7 +32,6 @@ import com.volmit.iris.object.IrisObject; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisStructure; import com.volmit.iris.util.B; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.ChronoLatch; import com.volmit.iris.util.J; import com.volmit.iris.util.PrecisionStopwatch; diff --git a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java index f073d71df..6d65d51d0 100644 --- a/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java +++ b/src/main/java/com/volmit/iris/gen/IrisChunkGenerator.java @@ -11,11 +11,11 @@ import org.bukkit.entity.Player; import com.volmit.iris.Iris; import com.volmit.iris.IrisContext; import com.volmit.iris.gen.atomics.AtomicRegionData; +import com.volmit.iris.noise.CNG; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisEffect; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.BiomeResult; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.IrisLock; import com.volmit.iris.util.KMap; import com.volmit.iris.util.RNG; diff --git a/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java b/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java index dba13f93d..559c4bf68 100644 --- a/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java +++ b/src/main/java/com/volmit/iris/gen/layer/BiomeDataProvider.java @@ -1,12 +1,12 @@ package com.volmit.iris.gen.layer; import com.volmit.iris.gen.ContextualChunkGenerator; +import com.volmit.iris.noise.RarityCellGenerator; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.util.BiomeResult; import com.volmit.iris.util.RNG; -import com.volmit.iris.util.RarityCellGenerator; import lombok.Data; diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java index 24b88aa5e..da04886f0 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerBiome.java @@ -2,14 +2,14 @@ package com.volmit.iris.gen.layer; import com.volmit.iris.Iris; import com.volmit.iris.gen.DimensionChunkGenerator; +import com.volmit.iris.noise.CellGenerator; +import com.volmit.iris.noise.RarityCellGenerator; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisRegion; import com.volmit.iris.object.IrisRegionRidge; import com.volmit.iris.object.IrisRegionSpot; -import com.volmit.iris.util.RarityCellGenerator; import com.volmit.iris.util.BiomeResult; -import com.volmit.iris.util.CellGenerator; import com.volmit.iris.util.GenLayer; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; diff --git a/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java b/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java index b3d44b048..03a56daf2 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCarve.java @@ -1,7 +1,7 @@ package com.volmit.iris.gen.layer; import com.volmit.iris.gen.DimensionChunkGenerator; -import com.volmit.iris.util.CellGenerator; +import com.volmit.iris.noise.CellGenerator; import com.volmit.iris.util.GenLayer; import com.volmit.iris.util.IrisInterpolation; import com.volmit.iris.util.M; 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 8321825fa..bc720d900 100644 --- a/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java +++ b/src/main/java/com/volmit/iris/gen/layer/GenLayerCave.java @@ -5,16 +5,16 @@ import org.bukkit.block.data.BlockData; import com.volmit.iris.gen.DimensionChunkGenerator; import com.volmit.iris.gen.atomics.AtomicSliver; +import com.volmit.iris.noise.CNG; +import com.volmit.iris.noise.FastNoise; +import com.volmit.iris.noise.FastNoise.CellularDistanceFunction; +import com.volmit.iris.noise.FastNoise.CellularReturnType; +import com.volmit.iris.noise.FastNoise.NoiseType; import com.volmit.iris.util.B; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.CaveResult; -import com.volmit.iris.util.FastNoise; import com.volmit.iris.util.GenLayer; import com.volmit.iris.util.KList; import com.volmit.iris.util.RNG; -import com.volmit.iris.util.FastNoise.CellularDistanceFunction; -import com.volmit.iris.util.FastNoise.CellularReturnType; -import com.volmit.iris.util.FastNoise.NoiseType; public class GenLayerCave extends GenLayer { diff --git a/src/main/java/com/volmit/iris/noise/BaseNoiseGenerator.java b/src/main/java/com/volmit/iris/noise/BaseNoiseGenerator.java index 624593d28..eee069880 100644 --- a/src/main/java/com/volmit/iris/noise/BaseNoiseGenerator.java +++ b/src/main/java/com/volmit/iris/noise/BaseNoiseGenerator.java @@ -1,9 +1,9 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; /** * Base class for all noise generators */ -public abstract class NoiseGenerator +public abstract class BaseNoiseGenerator { protected final int perm[] = new int[512]; protected double offsetX; diff --git a/src/main/java/com/volmit/iris/noise/BasePerlinNoiseGenerator.java b/src/main/java/com/volmit/iris/noise/BasePerlinNoiseGenerator.java index 7b9421941..d33ff0523 100644 --- a/src/main/java/com/volmit/iris/noise/BasePerlinNoiseGenerator.java +++ b/src/main/java/com/volmit/iris/noise/BasePerlinNoiseGenerator.java @@ -1,4 +1,4 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; import java.util.Random; @@ -8,7 +8,7 @@ import java.util.Random; * @see SimplexNoiseC "Improved" and faster version with slighly * different results */ -public class BasePerlinNoiseGenerator extends NoiseGenerator +public class BasePerlinNoiseGenerator extends BaseNoiseGenerator { protected static final int grad3[][] = {{1, 1, 0}, {-1, 1, 0}, {1, -1, 0}, {-1, -1, 0}, {1, 0, 1}, {-1, 0, 1}, {1, 0, -1}, {-1, 0, -1}, {0, 1, 1}, {0, -1, 1}, {0, 1, -1}, {0, -1, -1}}; private static final BasePerlinNoiseGenerator instance = new BasePerlinNoiseGenerator(); diff --git a/src/main/java/com/volmit/iris/noise/CNG.java b/src/main/java/com/volmit/iris/noise/CNG.java index 34bb1e1a5..c6e264e63 100644 --- a/src/main/java/com/volmit/iris/noise/CNG.java +++ b/src/main/java/com/volmit/iris/noise/CNG.java @@ -1,4 +1,9 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; + +import com.volmit.iris.util.IrisInterpolation; +import com.volmit.iris.util.KList; +import com.volmit.iris.util.NoiseInjector; +import com.volmit.iris.util.RNG; public class CNG { diff --git a/src/main/java/com/volmit/iris/noise/CellGenerator.java b/src/main/java/com/volmit/iris/noise/CellGenerator.java index be2af1fb6..7c3131171 100644 --- a/src/main/java/com/volmit/iris/noise/CellGenerator.java +++ b/src/main/java/com/volmit/iris/noise/CellGenerator.java @@ -1,8 +1,6 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; -import com.volmit.iris.util.FastNoise.CellularDistanceFunction; -import com.volmit.iris.util.FastNoise.CellularReturnType; -import com.volmit.iris.util.FastNoise.NoiseType; +import com.volmit.iris.util.RNG; import lombok.Getter; import lombok.Setter; @@ -29,13 +27,13 @@ public class CellGenerator RNG rx = rng.nextParallelRNG(8735652); int s = rx.nextInt(); fn = new FastNoise(s); - fn.SetNoiseType(NoiseType.Cellular); - fn.SetCellularReturnType(CellularReturnType.CellValue); - fn.SetCellularDistanceFunction(CellularDistanceFunction.Natural); + fn.SetNoiseType(FastNoise.NoiseType.Cellular); + fn.SetCellularReturnType(FastNoise.CellularReturnType.CellValue); + fn.SetCellularDistanceFunction(FastNoise.CellularDistanceFunction.Natural); fd = new FastNoise(s); - fd.SetNoiseType(NoiseType.Cellular); - fd.SetCellularReturnType(CellularReturnType.Distance2Sub); - fd.SetCellularDistanceFunction(CellularDistanceFunction.Natural); + fd.SetNoiseType(FastNoise.NoiseType.Cellular); + fd.SetCellularReturnType(FastNoise.CellularReturnType.Distance2Sub); + fd.SetCellularDistanceFunction(FastNoise.CellularDistanceFunction.Natural); } public float getDistance(double x, double z) diff --git a/src/main/java/com/volmit/iris/noise/CellHeightNoise.java b/src/main/java/com/volmit/iris/noise/CellHeightNoise.java new file mode 100644 index 000000000..bfa430e2e --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/CellHeightNoise.java @@ -0,0 +1,31 @@ +package com.volmit.iris.noise; + +public class CellHeightNoise implements NoiseGenerator { + private final FastNoise n; + + public CellHeightNoise(long seed) { + this.n = new FastNoise((int) seed); + n.SetNoiseType(FastNoise.NoiseType.Cellular); + n.SetCellularReturnType(FastNoise.CellularReturnType.Distance2Sub); + n.SetCellularDistanceFunction(FastNoise.CellularDistanceFunction.Natural); + } + + private double filter(double noise) { + return (noise / 2D) + 0.5D; + } + + @Override + public double noise(double x) { + return filter(n.GetCellular((float) x, 0)); + } + + @Override + public double noise(double x, double z) { + return filter(n.GetCellular((float) x, (float) z)); + } + + @Override + public double noise(double x, double y, double z) { + return filter(n.GetCellular((float) x, (float) y, (float) z)); + } +} diff --git a/src/main/java/com/volmit/iris/noise/CellularNoise.java b/src/main/java/com/volmit/iris/noise/CellularNoise.java new file mode 100644 index 000000000..acc895179 --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/CellularNoise.java @@ -0,0 +1,27 @@ +package com.volmit.iris.noise; + +public class CellularNoise implements NoiseGenerator { + private final FastNoise n; + + public CellularNoise(long seed) { + this.n = new FastNoise((int) seed); + n.SetNoiseType(FastNoise.NoiseType.Cellular); + n.SetCellularReturnType(FastNoise.CellularReturnType.CellValue); + n.SetCellularDistanceFunction(FastNoise.CellularDistanceFunction.Natural); + } + + @Override + public double noise(double x) { + return (n.GetCellular((float) x, 0) / 2D) + 0.5D; + } + + @Override + public double noise(double x, double z) { + return (n.GetCellular((float) x, (float) z) / 2D) + 0.5D; + } + + @Override + public double noise(double x, double y, double z) { + return (n.GetCellular((float) x, (float) y, (float) z) / 2D) + 0.5D; + } +} diff --git a/src/main/java/com/volmit/iris/noise/FastNoise.java b/src/main/java/com/volmit/iris/noise/FastNoise.java index dd827397a..a23592bd8 100644 --- a/src/main/java/com/volmit/iris/noise/FastNoise.java +++ b/src/main/java/com/volmit/iris/noise/FastNoise.java @@ -25,7 +25,7 @@ // The developer's email is jorzixdan.me2@gzixmail.com (for great email, take // off every 'zix'.) // -package com.volmit.iris.util; +package com.volmit.iris.noise; import javax.vecmath.Vector2f; import javax.vecmath.Vector3f; diff --git a/src/main/java/com/volmit/iris/noise/NoiseFactory.java b/src/main/java/com/volmit/iris/noise/NoiseFactory.java new file mode 100644 index 000000000..0d7cb57b2 --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/NoiseFactory.java @@ -0,0 +1,7 @@ +package com.volmit.iris.noise; + +@FunctionalInterface +public interface NoiseFactory +{ + NoiseGenerator create(long seed); +} diff --git a/src/main/java/com/volmit/iris/noise/NoiseGenerator.java b/src/main/java/com/volmit/iris/noise/NoiseGenerator.java new file mode 100644 index 000000000..33870fd49 --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/NoiseGenerator.java @@ -0,0 +1,10 @@ +package com.volmit.iris.noise; + +public interface NoiseGenerator +{ + public double noise(double x); + + public double noise(double x, double z); + + public double noise(double x, double y, double z); +} diff --git a/src/main/java/com/volmit/iris/noise/NoiseType.java b/src/main/java/com/volmit/iris/noise/NoiseType.java new file mode 100644 index 000000000..18d20b72a --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/NoiseType.java @@ -0,0 +1,20 @@ +package com.volmit.iris.noise; + +public enum NoiseType { + WHITE(seed -> new WhiteNoise(seed)), + SIMPLEX(seed -> new SimplexNoise(seed)), + CELLULAR(seed -> new CellularNoise(seed)), + CELLULAR_HEIGHT(seed -> new CellHeightNoise(seed)), + VASCULAR(seed -> new VascularNoise(seed)); + + private NoiseFactory f; + + private NoiseType(NoiseFactory f) { + this.f = f; + } + + public NoiseGenerator create(long seed) + { + return f.create(seed); + } +} diff --git a/src/main/java/com/volmit/iris/noise/OpenSimplex.java b/src/main/java/com/volmit/iris/noise/OpenSimplex.java new file mode 100644 index 000000000..e3ed64f6b --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/OpenSimplex.java @@ -0,0 +1,1014 @@ +package com.volmit.iris.noise; +/** + * K.jpg's OpenSimplex 2, smooth variant ("SuperSimplex") + * + * - 2D is standard simplex, modified to support larger kernels. + * Implemented using a lookup table. + * - 3D is "Re-oriented 8-point BCC noise" which constructs a + * congruent BCC lattice in a much different way than usual. + * - 4D uses a naïve pregenerated lookup table, and averages out + * to the expected performance. + * + * Multiple versions of each function are provided. See the + * documentation above each, for more info. + */ +public class OpenSimplex { + + private static final int PSIZE = 2048; + private static final int PMASK = 2047; + + private short[] perm; + private Grad2[] permGrad2; + private Grad3[] permGrad3; + private Grad4[] permGrad4; + + public OpenSimplex(long seed) { + perm = new short[PSIZE]; + permGrad2 = new Grad2[PSIZE]; + permGrad3 = new Grad3[PSIZE]; + permGrad4 = new Grad4[PSIZE]; + short[] source = new short[PSIZE]; + for (short i = 0; i < PSIZE; i++) + source[i] = i; + for (int i = PSIZE - 1; i >= 0; i--) { + seed = seed * 6364136223846793005L + 1442695040888963407L; + int r = (int)((seed + 31) % (i + 1)); + if (r < 0) + r += (i + 1); + perm[i] = source[r]; + permGrad2[i] = GRADIENTS_2D[perm[i]]; + permGrad3[i] = GRADIENTS_3D[perm[i]]; + permGrad4[i] = GRADIENTS_4D[perm[i]]; + source[r] = source[i]; + } + } + + /* + * Noise Evaluators + */ + + /** + * 2D SuperSimplex noise, standard lattice orientation. + */ + public double noise2(double x, double y) { + + // Get points for A2* lattice + double s = 0.366025403784439 * (x + y); + double xs = x + s, ys = y + s; + + return noise2_Base(xs, ys); + } + + /** + * 2D SuperSimplex noise, with Y pointing down the main diagonal. + * Might be better for a 2D sandbox style game, where Y is vertical. + * Probably slightly less optimal for heightmaps or continent maps. + */ + public double noise2_XBeforeY(double x, double y) { + + // Skew transform and rotation baked into one. + double xx = x * 0.7071067811865476; + double yy = y * 1.224744871380249; + + return noise2_Base(yy + xx, yy - xx); + } + + /** + * 2D SuperSimplex noise base. + * Lookup table implementation inspired by DigitalShadow. + */ + private double noise2_Base(double xs, double ys) { + double value = 0; + + // Get base points and offsets + int xsb = fastFloor(xs), ysb = fastFloor(ys); + double xsi = xs - xsb, ysi = ys - ysb; + + // Index to point list + int a = (int)(xsi + ysi); + int index = + (a << 2) | + (int)(xsi - ysi / 2 + 1 - a / 2.0) << 3 | + (int)(ysi - xsi / 2 + 1 - a / 2.0) << 4; + + double ssi = (xsi + ysi) * -0.211324865405187; + double xi = xsi + ssi, yi = ysi + ssi; + + // Point contributions + for (int i = 0; i < 4; i++) { + LatticePoint2D c = LOOKUP_2D[index + i]; + + double dx = xi + c.dx, dy = yi + c.dy; + double attn = 2.0 / 3.0 - dx * dx - dy * dy; + if (attn <= 0) continue; + + int pxm = (xsb + c.xsv) & PMASK, pym = (ysb + c.ysv) & PMASK; + Grad2 grad = permGrad2[perm[pxm] ^ pym]; + double extrapolation = grad.dx * dx + grad.dy * dy; + + attn *= attn; + value += attn * attn * extrapolation; + } + + return value; + } + + /** + * 3D Re-oriented 8-point BCC noise, classic orientation + * Proper substitute for what 3D SuperSimplex would be, + * in light of Forbidden Formulae. + * Use noise3_XYBeforeZ or noise3_XZBeforeY instead, wherever appropriate. + */ + public double noise3_Classic(double x, double y, double z) { + + // Re-orient the cubic lattices via rotation, to produce the expected look on cardinal planar slices. + // If texturing objects that don't tend to have cardinal plane faces, you could even remove this. + // Orthonormal rotation. Not a skew transform. + double r = (2.0 / 3.0) * (x + y + z); + double xr = r - x, yr = r - y, zr = r - z; + + // Evaluate both lattices to form a BCC lattice. + return noise3_BCC(xr, yr, zr); + } + + /** + * 3D Re-oriented 8-point BCC noise, with better visual isotropy in (X, Y). + * Recommended for 3D terrain and time-varied animations. + * The Z coordinate should always be the "different" coordinate in your use case. + * If Y is vertical in world coordinates, call noise3_XYBeforeZ(x, z, Y) or use noise3_XZBeforeY. + * If Z is vertical in world coordinates, call noise3_XYBeforeZ(x, y, Z). + * For a time varied animation, call noise3_XYBeforeZ(x, y, T). + */ + public double noise3_XYBeforeZ(double x, double y, double z) { + + // Re-orient the cubic lattices without skewing, to make X and Y triangular like 2D. + // Orthonormal rotation. Not a skew transform. + double xy = x + y; + double s2 = xy * -0.211324865405187; + double zz = z * 0.577350269189626; + double xr = x + s2 - zz, yr = y + s2 - zz; + double zr = xy * 0.577350269189626 + zz; + + // Evaluate both lattices to form a BCC lattice. + return noise3_BCC(xr, yr, zr); + } + + /** + * 3D Re-oriented 8-point BCC noise, with better visual isotropy in (X, Z). + * Recommended for 3D terrain and time-varied animations. + * The Y coordinate should always be the "different" coordinate in your use case. + * If Y is vertical in world coordinates, call noise3_XZBeforeY(x, Y, z). + * If Z is vertical in world coordinates, call noise3_XZBeforeY(x, Z, y) or use noise3_XYBeforeZ. + * For a time varied animation, call noise3_XZBeforeY(x, T, y) or use noise3_XYBeforeZ. + */ + public double noise3_XZBeforeY(double x, double y, double z) { + + // Re-orient the cubic lattices without skewing, to make X and Z triangular like 2D. + // Orthonormal rotation. Not a skew transform. + double xz = x + z; + double s2 = xz * -0.211324865405187; + double yy = y * 0.577350269189626; + double xr = x + s2 - yy; double zr = z + s2 - yy; + double yr = xz * 0.577350269189626 + yy; + + // Evaluate both lattices to form a BCC lattice. + return noise3_BCC(xr, yr, zr); + } + + /** + * Generate overlapping cubic lattices for 3D Re-oriented BCC noise. + * Lookup table implementation inspired by DigitalShadow. + * It was actually faster to narrow down the points in the loop itself, + * than to build up the index with enough info to isolate 8 points. + */ + private double noise3_BCC(double xr, double yr, double zr) { + + // Get base and offsets inside cube of first lattice. + int xrb = fastFloor(xr), yrb = fastFloor(yr), zrb = fastFloor(zr); + double xri = xr - xrb, yri = yr - yrb, zri = zr - zrb; + + // Identify which octant of the cube we're in. This determines which cell + // in the other cubic lattice we're in, and also narrows down one point on each. + int xht = (int)(xri + 0.5), yht = (int)(yri + 0.5), zht = (int)(zri + 0.5); + int index = (xht << 0) | (yht << 1) | (zht << 2); + + // Point contributions + double value = 0; + LatticePoint3D c = LOOKUP_3D[index]; + while (c != null) { + double dxr = xri + c.dxr, dyr = yri + c.dyr, dzr = zri + c.dzr; + double attn = 0.75 - dxr * dxr - dyr * dyr - dzr * dzr; + if (attn < 0) { + c = c.nextOnFailure; + } else { + int pxm = (xrb + c.xrv) & PMASK, pym = (yrb + c.yrv) & PMASK, pzm = (zrb + c.zrv) & PMASK; + Grad3 grad = permGrad3[perm[perm[pxm] ^ pym] ^ pzm]; + double extrapolation = grad.dx * dxr + grad.dy * dyr + grad.dz * dzr; + + attn *= attn; + value += attn * attn * extrapolation; + c = c.nextOnSuccess; + } + } + return value; + } + + /** + * 4D SuperSimplex noise, classic lattice orientation. + */ + public double noise4_Classic(double x, double y, double z, double w) { + + // Get points for A4 lattice + double s = 0.309016994374947 * (x + y + z + w); + double xs = x + s, ys = y + s, zs = z + s, ws = w + s; + + return noise4_Base(xs, ys, zs, ws); + } + + /** + * 4D SuperSimplex noise, with XY and ZW forming orthogonal triangular-based planes. + * Recommended for 3D terrain, where X and Y (or Z and W) are horizontal. + * Recommended for noise(x, y, sin(time), cos(time)) trick. + */ + public double noise4_XYBeforeZW(double x, double y, double z, double w) { + + double s2 = (x + y) * -0.28522513987434876941 + (z + w) * 0.83897065470611435718; + double t2 = (z + w) * 0.21939749883706435719 + (x + y) * -0.48214856493302476942; + double xs = x + s2, ys = y + s2, zs = z + t2, ws = w + t2; + + return noise4_Base(xs, ys, zs, ws); + } + + /** + * 4D SuperSimplex noise, with XZ and YW forming orthogonal triangular-based planes. + * Recommended for 3D terrain, where X and Z (or Y and W) are horizontal. + */ + public double noise4_XZBeforeYW(double x, double y, double z, double w) { + + double s2 = (x + z) * -0.28522513987434876941 + (y + w) * 0.83897065470611435718; + double t2 = (y + w) * 0.21939749883706435719 + (x + z) * -0.48214856493302476942; + double xs = x + s2, ys = y + t2, zs = z + s2, ws = w + t2; + + return noise4_Base(xs, ys, zs, ws); + } + + /** + * 4D SuperSimplex noise, with XYZ oriented like noise3_Classic, + * and W for an extra degree of freedom. + * Recommended for time-varied animations which texture a 3D object (W=time) + */ + public double noise4_XYZBeforeW(double x, double y, double z, double w) { + + double xyz = x + y + z; + double ww = w * 1.118033988749894; + double s2 = xyz * -0.16666666666666666 + ww; + double xs = x + s2, ys = y + s2, zs = z + s2, ws = -0.5 * xyz + ww; + + return noise4_Base(xs, ys, zs, ws); + } + + /** + * 4D SuperSimplex noise base. + * Using ultra-simple 4x4x4x4 lookup partitioning. + * This isn't as elegant or SIMD/GPU/etc. portable as other approaches, + * but it does compete performance-wise with optimized OpenSimplex1. + */ + private double noise4_Base(double xs, double ys, double zs, double ws) { + double value = 0; + + // Get base points and offsets + int xsb = fastFloor(xs), ysb = fastFloor(ys), zsb = fastFloor(zs), wsb = fastFloor(ws); + double xsi = xs - xsb, ysi = ys - ysb, zsi = zs - zsb, wsi = ws - wsb; + + // Unskewed offsets + double ssi = (xsi + ysi + zsi + wsi) * -0.138196601125011; + double xi = xsi + ssi, yi = ysi + ssi, zi = zsi + ssi, wi = wsi + ssi; + + int index = ((fastFloor(xs * 4) & 3) << 0) + | ((fastFloor(ys * 4) & 3) << 2) + | ((fastFloor(zs * 4) & 3) << 4) + | ((fastFloor(ws * 4) & 3) << 6); + + // Point contributions + for (LatticePoint4D c : LOOKUP_4D[index]) { + double dx = xi + c.dx, dy = yi + c.dy, dz = zi + c.dz, dw = wi + c.dw; + double attn = 0.8 - dx * dx - dy * dy - dz * dz - dw * dw; + if (attn > 0) { + attn *= attn; + + int pxm = (xsb + c.xsv) & PMASK, pym = (ysb + c.ysv) & PMASK; + int pzm = (zsb + c.zsv) & PMASK, pwm = (wsb + c.wsv) & PMASK; + Grad4 grad = permGrad4[perm[perm[perm[pxm] ^ pym] ^ pzm] ^ pwm]; + double extrapolation = grad.dx * dx + grad.dy * dy + grad.dz * dz + grad.dw * dw; + + value += attn * attn * extrapolation; + } + } + return value; + } + + /* + * Utility + */ + + private static int fastFloor(double x) { + int xi = (int)x; + return x < xi ? xi - 1 : xi; + } + + /* + * Definitions + */ + + private static final LatticePoint2D[] LOOKUP_2D; + private static final LatticePoint3D[] LOOKUP_3D; + private static final LatticePoint4D[][] LOOKUP_4D; + static { + LOOKUP_2D = new LatticePoint2D[8 * 4]; + LOOKUP_3D = new LatticePoint3D[8]; + LOOKUP_4D = new LatticePoint4D[256][]; + + for (int i = 0; i < 8; i++) { + int i1, j1, i2, j2; + if ((i & 1) == 0) { + if ((i & 2) == 0) { i1 = -1; j1 = 0; } else { i1 = 1; j1 = 0; } + if ((i & 4) == 0) { i2 = 0; j2 = -1; } else { i2 = 0; j2 = 1; } + } else { + if ((i & 2) != 0) { i1 = 2; j1 = 1; } else { i1 = 0; j1 = 1; } + if ((i & 4) != 0) { i2 = 1; j2 = 2; } else { i2 = 1; j2 = 0; } + } + LOOKUP_2D[i * 4 + 0] = new LatticePoint2D(0, 0); + LOOKUP_2D[i * 4 + 1] = new LatticePoint2D(1, 1); + LOOKUP_2D[i * 4 + 2] = new LatticePoint2D(i1, j1); + LOOKUP_2D[i * 4 + 3] = new LatticePoint2D(i2, j2); + } + + for (int i = 0; i < 8; i++) { + int i1, j1, k1, i2, j2, k2; + i1 = (i >> 0) & 1; j1 = (i >> 1) & 1; k1 = (i >> 2) & 1; + i2 = i1 ^ 1; j2 = j1 ^ 1; k2 = k1 ^ 1; + + // The two points within this octant, one from each of the two cubic half-lattices. + LatticePoint3D c0 = new LatticePoint3D(i1, j1, k1, 0); + LatticePoint3D c1 = new LatticePoint3D(i1 + i2, j1 + j2, k1 + k2, 1); + + // (1, 0, 0) vs (0, 1, 1) away from octant. + LatticePoint3D c2 = new LatticePoint3D(i1 ^ 1, j1, k1, 0); + LatticePoint3D c3 = new LatticePoint3D(i1, j1 ^ 1, k1 ^ 1, 0); + + // (1, 0, 0) vs (0, 1, 1) away from octant, on second half-lattice. + LatticePoint3D c4 = new LatticePoint3D(i1 + (i2 ^ 1), j1 + j2, k1 + k2, 1); + LatticePoint3D c5 = new LatticePoint3D(i1 + i2, j1 + (j2 ^ 1), k1 + (k2 ^ 1), 1); + + // (0, 1, 0) vs (1, 0, 1) away from octant. + LatticePoint3D c6 = new LatticePoint3D(i1, j1 ^ 1, k1, 0); + LatticePoint3D c7 = new LatticePoint3D(i1 ^ 1, j1, k1 ^ 1, 0); + + // (0, 1, 0) vs (1, 0, 1) away from octant, on second half-lattice. + LatticePoint3D c8 = new LatticePoint3D(i1 + i2, j1 + (j2 ^ 1), k1 + k2, 1); + LatticePoint3D c9 = new LatticePoint3D(i1 + (i2 ^ 1), j1 + j2, k1 + (k2 ^ 1), 1); + + // (0, 0, 1) vs (1, 1, 0) away from octant. + LatticePoint3D cA = new LatticePoint3D(i1, j1, k1 ^ 1, 0); + LatticePoint3D cB = new LatticePoint3D(i1 ^ 1, j1 ^ 1, k1, 0); + + // (0, 0, 1) vs (1, 1, 0) away from octant, on second half-lattice. + LatticePoint3D cC = new LatticePoint3D(i1 + i2, j1 + j2, k1 + (k2 ^ 1), 1); + LatticePoint3D cD = new LatticePoint3D(i1 + (i2 ^ 1), j1 + (j2 ^ 1), k1 + k2, 1); + + // First two points are guaranteed. + c0.nextOnFailure = c0.nextOnSuccess = c1; + c1.nextOnFailure = c1.nextOnSuccess = c2; + + // If c2 is in range, then we know c3 and c4 are not. + c2.nextOnFailure = c3; c2.nextOnSuccess = c5; + c3.nextOnFailure = c4; c3.nextOnSuccess = c4; + + // If c4 is in range, then we know c5 is not. + c4.nextOnFailure = c5; c4.nextOnSuccess = c6; + c5.nextOnFailure = c5.nextOnSuccess = c6; + + // If c6 is in range, then we know c7 and c8 are not. + c6.nextOnFailure = c7; c6.nextOnSuccess = c9; + c7.nextOnFailure = c8; c7.nextOnSuccess = c8; + + // If c8 is in range, then we know c9 is not. + c8.nextOnFailure = c9; c8.nextOnSuccess = cA; + c9.nextOnFailure = c9.nextOnSuccess = cA; + + // If cA is in range, then we know cB and cC are not. + cA.nextOnFailure = cB; cA.nextOnSuccess = cD; + cB.nextOnFailure = cC; cB.nextOnSuccess = cC; + + // If cC is in range, then we know cD is not. + cC.nextOnFailure = cD; cC.nextOnSuccess = null; + cD.nextOnFailure = cD.nextOnSuccess = null; + + LOOKUP_3D[i] = c0; + } + + int[][] lookup4DPregen = { + { 0x15, 0x45, 0x51, 0x54, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x15, 0x45, 0x51, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA6, 0xAA }, + { 0x01, 0x05, 0x11, 0x15, 0x41, 0x45, 0x51, 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0xA6, 0xAA }, + { 0x01, 0x15, 0x16, 0x45, 0x46, 0x51, 0x52, 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x15, 0x45, 0x54, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA9, 0xAA }, + { 0x05, 0x15, 0x45, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xAA }, + { 0x05, 0x15, 0x45, 0x55, 0x56, 0x59, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0xAA }, + { 0x05, 0x15, 0x16, 0x45, 0x46, 0x55, 0x56, 0x59, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0xAA, 0xAB }, + { 0x04, 0x05, 0x14, 0x15, 0x44, 0x45, 0x54, 0x55, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA }, + { 0x05, 0x15, 0x45, 0x55, 0x56, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0xAA }, + { 0x05, 0x15, 0x45, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x9A, 0xAA }, + { 0x05, 0x15, 0x16, 0x45, 0x46, 0x55, 0x56, 0x59, 0x5A, 0x5B, 0x6A, 0x9A, 0xAA, 0xAB }, + { 0x04, 0x15, 0x19, 0x45, 0x49, 0x54, 0x55, 0x58, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x05, 0x15, 0x19, 0x45, 0x49, 0x55, 0x56, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0xAA, 0xAE }, + { 0x05, 0x15, 0x19, 0x45, 0x49, 0x55, 0x56, 0x59, 0x5A, 0x5E, 0x6A, 0x9A, 0xAA, 0xAE }, + { 0x05, 0x15, 0x1A, 0x45, 0x4A, 0x55, 0x56, 0x59, 0x5A, 0x5B, 0x5E, 0x6A, 0x9A, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x15, 0x51, 0x54, 0x55, 0x56, 0x59, 0x65, 0x66, 0x69, 0x6A, 0x95, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x11, 0x15, 0x51, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0xA5, 0xA6, 0xAA }, + { 0x11, 0x15, 0x51, 0x55, 0x56, 0x5A, 0x65, 0x66, 0x6A, 0x96, 0xA6, 0xAA }, + { 0x11, 0x15, 0x16, 0x51, 0x52, 0x55, 0x56, 0x5A, 0x65, 0x66, 0x6A, 0x96, 0xA6, 0xAA, 0xAB }, + { 0x14, 0x15, 0x54, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x99, 0xA5, 0xA9, 0xAA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x9A, 0xA6, 0xA9, 0xAA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x15, 0x16, 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x6B, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x14, 0x15, 0x54, 0x55, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x99, 0xA9, 0xAA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x9A, 0xAA }, + { 0x15, 0x16, 0x55, 0x56, 0x59, 0x5A, 0x66, 0x6A, 0x6B, 0x9A, 0xAA, 0xAB }, + { 0x14, 0x15, 0x19, 0x54, 0x55, 0x58, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x99, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x19, 0x55, 0x59, 0x5A, 0x69, 0x6A, 0x6E, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x19, 0x55, 0x56, 0x59, 0x5A, 0x69, 0x6A, 0x6E, 0x9A, 0xAA, 0xAE }, + { 0x15, 0x1A, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x6B, 0x6E, 0x9A, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x10, 0x11, 0x14, 0x15, 0x50, 0x51, 0x54, 0x55, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x11, 0x15, 0x51, 0x55, 0x56, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xAA }, + { 0x11, 0x15, 0x51, 0x55, 0x56, 0x65, 0x66, 0x6A, 0xA6, 0xAA }, + { 0x11, 0x15, 0x16, 0x51, 0x52, 0x55, 0x56, 0x65, 0x66, 0x67, 0x6A, 0xA6, 0xAA, 0xAB }, + { 0x14, 0x15, 0x54, 0x55, 0x59, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA9, 0xAA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xA6, 0xAA }, + { 0x15, 0x16, 0x55, 0x56, 0x5A, 0x65, 0x66, 0x6A, 0x6B, 0xA6, 0xAA, 0xAB }, + { 0x14, 0x15, 0x54, 0x55, 0x59, 0x65, 0x69, 0x6A, 0xA9, 0xAA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xA9, 0xAA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xAA }, + { 0x15, 0x16, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x6B, 0xAA, 0xAB }, + { 0x14, 0x15, 0x19, 0x54, 0x55, 0x58, 0x59, 0x65, 0x69, 0x6A, 0x6D, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x19, 0x55, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x6E, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x19, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x6E, 0xAA, 0xAE }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x66, 0x69, 0x6A, 0x6B, 0x6E, 0x9A, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x10, 0x15, 0x25, 0x51, 0x54, 0x55, 0x61, 0x64, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x11, 0x15, 0x25, 0x51, 0x55, 0x56, 0x61, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xAA, 0xBA }, + { 0x11, 0x15, 0x25, 0x51, 0x55, 0x56, 0x61, 0x65, 0x66, 0x6A, 0x76, 0xA6, 0xAA, 0xBA }, + { 0x11, 0x15, 0x26, 0x51, 0x55, 0x56, 0x62, 0x65, 0x66, 0x67, 0x6A, 0x76, 0xA6, 0xAA, 0xAB, 0xBA, 0xBB }, + { 0x14, 0x15, 0x25, 0x54, 0x55, 0x59, 0x64, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x25, 0x55, 0x65, 0x66, 0x69, 0x6A, 0x7A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x25, 0x55, 0x56, 0x65, 0x66, 0x69, 0x6A, 0x7A, 0xA6, 0xAA, 0xBA }, + { 0x15, 0x26, 0x55, 0x56, 0x65, 0x66, 0x6A, 0x6B, 0x7A, 0xA6, 0xAA, 0xAB, 0xBA, 0xBB }, + { 0x14, 0x15, 0x25, 0x54, 0x55, 0x59, 0x64, 0x65, 0x69, 0x6A, 0x79, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x25, 0x55, 0x59, 0x65, 0x66, 0x69, 0x6A, 0x7A, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x25, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x7A, 0xAA, 0xBA }, + { 0x15, 0x55, 0x56, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x6B, 0x7A, 0xA6, 0xAA, 0xAB, 0xBA, 0xBB }, + { 0x14, 0x15, 0x29, 0x54, 0x55, 0x59, 0x65, 0x68, 0x69, 0x6A, 0x6D, 0x79, 0xA9, 0xAA, 0xAE, 0xBA, 0xBE }, + { 0x15, 0x29, 0x55, 0x59, 0x65, 0x69, 0x6A, 0x6E, 0x7A, 0xA9, 0xAA, 0xAE, 0xBA, 0xBE }, + { 0x15, 0x55, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x6E, 0x7A, 0xA9, 0xAA, 0xAE, 0xBA, 0xBE }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x6B, 0x6E, 0x7A, 0xAA, 0xAB, 0xAE, 0xBA, 0xBF }, + { 0x45, 0x51, 0x54, 0x55, 0x56, 0x59, 0x65, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x41, 0x45, 0x51, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xAA }, + { 0x41, 0x45, 0x51, 0x55, 0x56, 0x5A, 0x66, 0x95, 0x96, 0x9A, 0xA6, 0xAA }, + { 0x41, 0x45, 0x46, 0x51, 0x52, 0x55, 0x56, 0x5A, 0x66, 0x95, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x44, 0x45, 0x54, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x69, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA9, 0xAA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xA9, 0xAA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x66, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x45, 0x46, 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0x9B, 0xA6, 0xAA, 0xAB }, + { 0x44, 0x45, 0x54, 0x55, 0x59, 0x5A, 0x69, 0x95, 0x99, 0x9A, 0xA9, 0xAA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xAA }, + { 0x45, 0x46, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x96, 0x9A, 0x9B, 0xAA, 0xAB }, + { 0x44, 0x45, 0x49, 0x54, 0x55, 0x58, 0x59, 0x5A, 0x69, 0x95, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x45, 0x49, 0x55, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0x9E, 0xA9, 0xAA, 0xAE }, + { 0x45, 0x49, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x99, 0x9A, 0x9E, 0xAA, 0xAE }, + { 0x45, 0x4A, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x9A, 0x9B, 0x9E, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x50, 0x51, 0x54, 0x55, 0x56, 0x59, 0x65, 0x66, 0x69, 0x95, 0x96, 0x99, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x55, 0x56, 0x59, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x55, 0x56, 0x5A, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xAA, 0xAB }, + { 0x51, 0x52, 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0xA6, 0xA7, 0xAA, 0xAB }, + { 0x54, 0x55, 0x56, 0x59, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x15, 0x45, 0x51, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x54, 0x55, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA5, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x45, 0x54, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x45, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xA9, 0xAA, 0xAB, 0xAE }, + { 0x55, 0x56, 0x59, 0x5A, 0x66, 0x6A, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x54, 0x55, 0x58, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA, 0xAD, 0xAE }, + { 0x55, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x55, 0x56, 0x59, 0x5A, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x9A, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x50, 0x51, 0x54, 0x55, 0x65, 0x66, 0x69, 0x95, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x6A, 0x95, 0x96, 0xA5, 0xA6, 0xAA }, + { 0x51, 0x52, 0x55, 0x56, 0x65, 0x66, 0x6A, 0x96, 0xA6, 0xA7, 0xAA, 0xAB }, + { 0x54, 0x55, 0x59, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x99, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x51, 0x54, 0x55, 0x56, 0x59, 0x65, 0x66, 0x69, 0x6A, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x51, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAB, 0xBA }, + { 0x55, 0x56, 0x5A, 0x65, 0x66, 0x6A, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x6A, 0x95, 0x99, 0xA5, 0xA9, 0xAA }, + { 0x15, 0x54, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAE, 0xBA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x9A, 0xA6, 0xA9, 0xAA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x54, 0x55, 0x58, 0x59, 0x65, 0x69, 0x6A, 0x99, 0xA9, 0xAA, 0xAD, 0xAE }, + { 0x55, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x66, 0x69, 0x6A, 0x9A, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x50, 0x51, 0x54, 0x55, 0x61, 0x64, 0x65, 0x66, 0x69, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x51, 0x55, 0x61, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xB6, 0xBA }, + { 0x51, 0x55, 0x56, 0x61, 0x65, 0x66, 0x6A, 0xA5, 0xA6, 0xAA, 0xB6, 0xBA }, + { 0x51, 0x55, 0x56, 0x62, 0x65, 0x66, 0x6A, 0xA6, 0xA7, 0xAA, 0xAB, 0xB6, 0xBA, 0xBB }, + { 0x54, 0x55, 0x64, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xB9, 0xBA }, + { 0x55, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x55, 0x56, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x55, 0x56, 0x65, 0x66, 0x6A, 0xA6, 0xAA, 0xAB, 0xBA, 0xBB }, + { 0x54, 0x55, 0x59, 0x64, 0x65, 0x69, 0x6A, 0xA5, 0xA9, 0xAA, 0xB9, 0xBA }, + { 0x55, 0x59, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x15, 0x55, 0x56, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xA6, 0xAA, 0xAB, 0xBA, 0xBB }, + { 0x54, 0x55, 0x59, 0x65, 0x68, 0x69, 0x6A, 0xA9, 0xAA, 0xAD, 0xAE, 0xB9, 0xBA, 0xBE }, + { 0x55, 0x59, 0x65, 0x69, 0x6A, 0xA9, 0xAA, 0xAE, 0xBA, 0xBE }, + { 0x15, 0x55, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xA9, 0xAA, 0xAE, 0xBA, 0xBE }, + { 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0xAA, 0xAB, 0xAE, 0xBA, 0xBF }, + { 0x40, 0x41, 0x44, 0x45, 0x50, 0x51, 0x54, 0x55, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x41, 0x45, 0x51, 0x55, 0x56, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xAA }, + { 0x41, 0x45, 0x51, 0x55, 0x56, 0x95, 0x96, 0x9A, 0xA6, 0xAA }, + { 0x41, 0x45, 0x46, 0x51, 0x52, 0x55, 0x56, 0x95, 0x96, 0x97, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x44, 0x45, 0x54, 0x55, 0x59, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA9, 0xAA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xAA }, + { 0x45, 0x46, 0x55, 0x56, 0x5A, 0x95, 0x96, 0x9A, 0x9B, 0xA6, 0xAA, 0xAB }, + { 0x44, 0x45, 0x54, 0x55, 0x59, 0x95, 0x99, 0x9A, 0xA9, 0xAA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xA9, 0xAA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xAA }, + { 0x45, 0x46, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0x9B, 0xAA, 0xAB }, + { 0x44, 0x45, 0x49, 0x54, 0x55, 0x58, 0x59, 0x95, 0x99, 0x9A, 0x9D, 0xA9, 0xAA, 0xAE }, + { 0x45, 0x49, 0x55, 0x59, 0x5A, 0x95, 0x99, 0x9A, 0x9E, 0xA9, 0xAA, 0xAE }, + { 0x45, 0x49, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0x9E, 0xAA, 0xAE }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x96, 0x99, 0x9A, 0x9B, 0x9E, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x50, 0x51, 0x54, 0x55, 0x65, 0x95, 0x96, 0x99, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xAA }, + { 0x51, 0x52, 0x55, 0x56, 0x66, 0x95, 0x96, 0x9A, 0xA6, 0xA7, 0xAA, 0xAB }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x45, 0x51, 0x54, 0x55, 0x56, 0x59, 0x65, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x45, 0x51, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAB, 0xEA }, + { 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x95, 0x99, 0x9A, 0xA5, 0xA9, 0xAA }, + { 0x45, 0x54, 0x55, 0x56, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAE, 0xEA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xA9, 0xAA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x66, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xAA, 0xAB }, + { 0x54, 0x55, 0x58, 0x59, 0x69, 0x95, 0x99, 0x9A, 0xA9, 0xAA, 0xAD, 0xAE }, + { 0x55, 0x59, 0x5A, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA9, 0xAA, 0xAE }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x96, 0x99, 0x9A, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x50, 0x51, 0x54, 0x55, 0x65, 0x95, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xAA }, + { 0x51, 0x52, 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xA7, 0xAA, 0xAB }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x54, 0x55, 0x56, 0x59, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA, 0xEA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x51, 0x55, 0x56, 0x5A, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xAA, 0xAB }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA9, 0xAA }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA }, + { 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA6, 0xA9, 0xAA, 0xAB }, + { 0x54, 0x55, 0x58, 0x59, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA9, 0xAA, 0xAD, 0xAE }, + { 0x54, 0x55, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA5, 0xA9, 0xAA, 0xAE }, + { 0x55, 0x56, 0x59, 0x5A, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA6, 0xA9, 0xAA, 0xAE }, + { 0x55, 0x56, 0x59, 0x5A, 0x66, 0x69, 0x6A, 0x96, 0x99, 0x9A, 0xA6, 0xA9, 0xAA, 0xAB, 0xAE, 0xAF }, + { 0x50, 0x51, 0x54, 0x55, 0x61, 0x64, 0x65, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xB5, 0xBA }, + { 0x51, 0x55, 0x61, 0x65, 0x66, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xB6, 0xBA }, + { 0x51, 0x55, 0x56, 0x61, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xAA, 0xB6, 0xBA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x6A, 0x96, 0xA5, 0xA6, 0xA7, 0xAA, 0xAB, 0xB6, 0xBA, 0xBB }, + { 0x54, 0x55, 0x64, 0x65, 0x69, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xB9, 0xBA }, + { 0x55, 0x65, 0x66, 0x69, 0x6A, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x6A, 0x96, 0xA5, 0xA6, 0xAA, 0xAB, 0xBA, 0xBB }, + { 0x54, 0x55, 0x59, 0x64, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA9, 0xAA, 0xB9, 0xBA }, + { 0x54, 0x55, 0x59, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x99, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x55, 0x56, 0x59, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA }, + { 0x55, 0x56, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x96, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAB, 0xBA, 0xBB }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x6A, 0x99, 0xA5, 0xA9, 0xAA, 0xAD, 0xAE, 0xB9, 0xBA, 0xBE }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x6A, 0x99, 0xA5, 0xA9, 0xAA, 0xAE, 0xBA, 0xBE }, + { 0x55, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAE, 0xBA, 0xBE }, + { 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x9A, 0xA6, 0xA9, 0xAA, 0xAB, 0xAE, 0xBA }, + { 0x40, 0x45, 0x51, 0x54, 0x55, 0x85, 0x91, 0x94, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x41, 0x45, 0x51, 0x55, 0x56, 0x85, 0x91, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xAA, 0xEA }, + { 0x41, 0x45, 0x51, 0x55, 0x56, 0x85, 0x91, 0x95, 0x96, 0x9A, 0xA6, 0xAA, 0xD6, 0xEA }, + { 0x41, 0x45, 0x51, 0x55, 0x56, 0x86, 0x92, 0x95, 0x96, 0x97, 0x9A, 0xA6, 0xAA, 0xAB, 0xD6, 0xEA, 0xEB }, + { 0x44, 0x45, 0x54, 0x55, 0x59, 0x85, 0x94, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA9, 0xAA, 0xEA }, + { 0x45, 0x55, 0x85, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xDA, 0xEA }, + { 0x45, 0x55, 0x56, 0x85, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xAA, 0xDA, 0xEA }, + { 0x45, 0x55, 0x56, 0x86, 0x95, 0x96, 0x9A, 0x9B, 0xA6, 0xAA, 0xAB, 0xDA, 0xEA, 0xEB }, + { 0x44, 0x45, 0x54, 0x55, 0x59, 0x85, 0x94, 0x95, 0x99, 0x9A, 0xA9, 0xAA, 0xD9, 0xEA }, + { 0x45, 0x55, 0x59, 0x85, 0x95, 0x96, 0x99, 0x9A, 0xA9, 0xAA, 0xDA, 0xEA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x85, 0x95, 0x96, 0x99, 0x9A, 0xAA, 0xDA, 0xEA }, + { 0x45, 0x55, 0x56, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0x9B, 0xA6, 0xAA, 0xAB, 0xDA, 0xEA, 0xEB }, + { 0x44, 0x45, 0x54, 0x55, 0x59, 0x89, 0x95, 0x98, 0x99, 0x9A, 0x9D, 0xA9, 0xAA, 0xAE, 0xD9, 0xEA, 0xEE }, + { 0x45, 0x55, 0x59, 0x89, 0x95, 0x99, 0x9A, 0x9E, 0xA9, 0xAA, 0xAE, 0xDA, 0xEA, 0xEE }, + { 0x45, 0x55, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0x9E, 0xA9, 0xAA, 0xAE, 0xDA, 0xEA, 0xEE }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0x9B, 0x9E, 0xAA, 0xAB, 0xAE, 0xDA, 0xEA, 0xEF }, + { 0x50, 0x51, 0x54, 0x55, 0x65, 0x91, 0x94, 0x95, 0x96, 0x99, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x51, 0x55, 0x91, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xE6, 0xEA }, + { 0x51, 0x55, 0x56, 0x91, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xAA, 0xE6, 0xEA }, + { 0x51, 0x55, 0x56, 0x92, 0x95, 0x96, 0x9A, 0xA6, 0xA7, 0xAA, 0xAB, 0xE6, 0xEA, 0xEB }, + { 0x54, 0x55, 0x94, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xE9, 0xEA }, + { 0x55, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x55, 0x56, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x55, 0x56, 0x95, 0x96, 0x9A, 0xA6, 0xAA, 0xAB, 0xEA, 0xEB }, + { 0x54, 0x55, 0x59, 0x94, 0x95, 0x99, 0x9A, 0xA5, 0xA9, 0xAA, 0xE9, 0xEA }, + { 0x55, 0x59, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x45, 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x45, 0x55, 0x56, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xAA, 0xAB, 0xEA, 0xEB }, + { 0x54, 0x55, 0x59, 0x95, 0x98, 0x99, 0x9A, 0xA9, 0xAA, 0xAD, 0xAE, 0xE9, 0xEA, 0xEE }, + { 0x55, 0x59, 0x95, 0x99, 0x9A, 0xA9, 0xAA, 0xAE, 0xEA, 0xEE }, + { 0x45, 0x55, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xA9, 0xAA, 0xAE, 0xEA, 0xEE }, + { 0x55, 0x56, 0x59, 0x5A, 0x95, 0x96, 0x99, 0x9A, 0xAA, 0xAB, 0xAE, 0xEA, 0xEF }, + { 0x50, 0x51, 0x54, 0x55, 0x65, 0x91, 0x94, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xE5, 0xEA }, + { 0x51, 0x55, 0x65, 0x91, 0x95, 0x96, 0xA5, 0xA6, 0xA9, 0xAA, 0xE6, 0xEA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x91, 0x95, 0x96, 0xA5, 0xA6, 0xAA, 0xE6, 0xEA }, + { 0x51, 0x55, 0x56, 0x66, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xA7, 0xAA, 0xAB, 0xE6, 0xEA, 0xEB }, + { 0x54, 0x55, 0x65, 0x94, 0x95, 0x99, 0xA5, 0xA6, 0xA9, 0xAA, 0xE9, 0xEA }, + { 0x55, 0x65, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x51, 0x55, 0x56, 0x66, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xAA, 0xAB, 0xEA, 0xEB }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x94, 0x95, 0x99, 0xA5, 0xA9, 0xAA, 0xE9, 0xEA }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x55, 0x56, 0x59, 0x65, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xEA }, + { 0x55, 0x56, 0x5A, 0x66, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAB, 0xEA, 0xEB }, + { 0x54, 0x55, 0x59, 0x69, 0x95, 0x99, 0x9A, 0xA5, 0xA9, 0xAA, 0xAD, 0xAE, 0xE9, 0xEA, 0xEE }, + { 0x54, 0x55, 0x59, 0x69, 0x95, 0x99, 0x9A, 0xA5, 0xA9, 0xAA, 0xAE, 0xEA, 0xEE }, + { 0x55, 0x59, 0x5A, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAE, 0xEA, 0xEE }, + { 0x55, 0x56, 0x59, 0x5A, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA6, 0xA9, 0xAA, 0xAB, 0xAE, 0xEA }, + { 0x50, 0x51, 0x54, 0x55, 0x65, 0x95, 0xA1, 0xA4, 0xA5, 0xA6, 0xA9, 0xAA, 0xB5, 0xBA, 0xE5, 0xEA, 0xFA }, + { 0x51, 0x55, 0x65, 0x95, 0xA1, 0xA5, 0xA6, 0xA9, 0xAA, 0xB6, 0xBA, 0xE6, 0xEA, 0xFA }, + { 0x51, 0x55, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xA9, 0xAA, 0xB6, 0xBA, 0xE6, 0xEA, 0xFA }, + { 0x51, 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xA7, 0xAA, 0xAB, 0xB6, 0xBA, 0xE6, 0xEA, 0xFB }, + { 0x54, 0x55, 0x65, 0x95, 0xA4, 0xA5, 0xA6, 0xA9, 0xAA, 0xB9, 0xBA, 0xE9, 0xEA, 0xFA }, + { 0x55, 0x65, 0x95, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA, 0xEA, 0xFA }, + { 0x51, 0x55, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA, 0xEA, 0xFA }, + { 0x55, 0x56, 0x65, 0x66, 0x95, 0x96, 0xA5, 0xA6, 0xAA, 0xAB, 0xBA, 0xEA, 0xFB }, + { 0x54, 0x55, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA6, 0xA9, 0xAA, 0xB9, 0xBA, 0xE9, 0xEA, 0xFA }, + { 0x54, 0x55, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA, 0xEA, 0xFA }, + { 0x55, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xBA, 0xEA, 0xFA }, + { 0x55, 0x56, 0x65, 0x66, 0x6A, 0x95, 0x96, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAB, 0xBA, 0xEA }, + { 0x54, 0x55, 0x59, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA9, 0xAA, 0xAD, 0xAE, 0xB9, 0xBA, 0xE9, 0xEA, 0xFE }, + { 0x55, 0x59, 0x65, 0x69, 0x95, 0x99, 0xA5, 0xA9, 0xAA, 0xAE, 0xBA, 0xEA, 0xFE }, + { 0x55, 0x59, 0x65, 0x69, 0x6A, 0x95, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAE, 0xBA, 0xEA }, + { 0x55, 0x56, 0x59, 0x5A, 0x65, 0x66, 0x69, 0x6A, 0x95, 0x96, 0x99, 0x9A, 0xA5, 0xA6, 0xA9, 0xAA, 0xAB, 0xAE, 0xBA, 0xEA }, + }; + LatticePoint4D[] latticePoints = new LatticePoint4D[256]; + for (int i = 0; i < 256; i++) { + int cx = ((i >> 0) & 3) - 1; + int cy = ((i >> 2) & 3) - 1; + int cz = ((i >> 4) & 3) - 1; + int cw = ((i >> 6) & 3) - 1; + latticePoints[i] = new LatticePoint4D(cx, cy, cz, cw); + } + for (int i = 0; i < 256; i++) { + LOOKUP_4D[i] = new LatticePoint4D[lookup4DPregen[i].length]; + for (int j = 0; j < lookup4DPregen[i].length; j++) { + LOOKUP_4D[i][j] = latticePoints[lookup4DPregen[i][j]]; + } + } + } + + private static class LatticePoint2D { + int xsv, ysv; + double dx, dy; + public LatticePoint2D(int xsv, int ysv) { + this.xsv = xsv; this.ysv = ysv; + double ssv = (xsv + ysv) * -0.211324865405187; + this.dx = -xsv - ssv; + this.dy = -ysv - ssv; + } + } + + private static class LatticePoint3D { + public double dxr, dyr, dzr; + public int xrv, yrv, zrv; + LatticePoint3D nextOnFailure, nextOnSuccess; + public LatticePoint3D(int xrv, int yrv, int zrv, int lattice) { + this.dxr = -xrv + lattice * 0.5; this.dyr = -yrv + lattice * 0.5; this.dzr = -zrv + lattice * 0.5; + this.xrv = xrv + lattice * 1024; this.yrv = yrv + lattice * 1024; this.zrv = zrv + lattice * 1024; + } + } + + private static class LatticePoint4D { + int xsv, ysv, zsv, wsv; + double dx, dy, dz, dw; + public LatticePoint4D(int xsv, int ysv, int zsv, int wsv) { + this.xsv = xsv; this.ysv = ysv; this.zsv = zsv; this.wsv = wsv; + double ssv = (xsv + ysv + zsv + wsv) * -0.138196601125011; + this.dx = -xsv - ssv; + this.dy = -ysv - ssv; + this.dz = -zsv - ssv; + this.dw = -wsv - ssv; + } + } + + /* + * Gradients + */ + + private static class Grad2 { + double dx, dy; + public Grad2(double dx, double dy) { + this.dx = dx; this.dy = dy; + } + } + + private static class Grad3 { + double dx, dy, dz; + public Grad3(double dx, double dy, double dz) { + this.dx = dx; this.dy = dy; this.dz = dz; + } + } + + private static class Grad4 { + double dx, dy, dz, dw; + public Grad4(double dx, double dy, double dz, double dw) { + this.dx = dx; this.dy = dy; this.dz = dz; this.dw = dw; + } + } + + private static final double N2 = 0.05481866495625118; + private static final double N3 = 0.2781926117527186; + private static final double N4 = 0.11127401889945551; + private static final Grad2[] GRADIENTS_2D; + private static final Grad3[] GRADIENTS_3D; + private static final Grad4[] GRADIENTS_4D; + static { + + GRADIENTS_2D = new Grad2[PSIZE]; + Grad2[] grad2 = { + new Grad2( 0.130526192220052, 0.99144486137381), + new Grad2( 0.38268343236509, 0.923879532511287), + new Grad2( 0.608761429008721, 0.793353340291235), + new Grad2( 0.793353340291235, 0.608761429008721), + new Grad2( 0.923879532511287, 0.38268343236509), + new Grad2( 0.99144486137381, 0.130526192220051), + new Grad2( 0.99144486137381, -0.130526192220051), + new Grad2( 0.923879532511287, -0.38268343236509), + new Grad2( 0.793353340291235, -0.60876142900872), + new Grad2( 0.608761429008721, -0.793353340291235), + new Grad2( 0.38268343236509, -0.923879532511287), + new Grad2( 0.130526192220052, -0.99144486137381), + new Grad2(-0.130526192220052, -0.99144486137381), + new Grad2(-0.38268343236509, -0.923879532511287), + new Grad2(-0.608761429008721, -0.793353340291235), + new Grad2(-0.793353340291235, -0.608761429008721), + new Grad2(-0.923879532511287, -0.38268343236509), + new Grad2(-0.99144486137381, -0.130526192220052), + new Grad2(-0.99144486137381, 0.130526192220051), + new Grad2(-0.923879532511287, 0.38268343236509), + new Grad2(-0.793353340291235, 0.608761429008721), + new Grad2(-0.608761429008721, 0.793353340291235), + new Grad2(-0.38268343236509, 0.923879532511287), + new Grad2(-0.130526192220052, 0.99144486137381) + }; + + for (int i = 0; i < grad2.length; i++) { + grad2[i].dx /= N2; grad2[i].dy /= N2; + } + for (int i = 0; i < PSIZE; i++) { + GRADIENTS_2D[i] = grad2[i % grad2.length]; + } + + GRADIENTS_3D = new Grad3[PSIZE]; + Grad3[] grad3 = { + new Grad3(-2.22474487139, -2.22474487139, -1.0), + new Grad3(-2.22474487139, -2.22474487139, 1.0), + new Grad3(-3.0862664687972017, -1.1721513422464978, 0.0), + new Grad3(-1.1721513422464978, -3.0862664687972017, 0.0), + new Grad3(-2.22474487139, -1.0, -2.22474487139), + new Grad3(-2.22474487139, 1.0, -2.22474487139), + new Grad3(-1.1721513422464978, 0.0, -3.0862664687972017), + new Grad3(-3.0862664687972017, 0.0, -1.1721513422464978), + new Grad3(-2.22474487139, -1.0, 2.22474487139), + new Grad3(-2.22474487139, 1.0, 2.22474487139), + new Grad3(-3.0862664687972017, 0.0, 1.1721513422464978), + new Grad3(-1.1721513422464978, 0.0, 3.0862664687972017), + new Grad3(-2.22474487139, 2.22474487139, -1.0), + new Grad3(-2.22474487139, 2.22474487139, 1.0), + new Grad3(-1.1721513422464978, 3.0862664687972017, 0.0), + new Grad3(-3.0862664687972017, 1.1721513422464978, 0.0), + new Grad3(-1.0, -2.22474487139, -2.22474487139), + new Grad3( 1.0, -2.22474487139, -2.22474487139), + new Grad3( 0.0, -3.0862664687972017, -1.1721513422464978), + new Grad3( 0.0, -1.1721513422464978, -3.0862664687972017), + new Grad3(-1.0, -2.22474487139, 2.22474487139), + new Grad3( 1.0, -2.22474487139, 2.22474487139), + new Grad3( 0.0, -1.1721513422464978, 3.0862664687972017), + new Grad3( 0.0, -3.0862664687972017, 1.1721513422464978), + new Grad3(-1.0, 2.22474487139, -2.22474487139), + new Grad3( 1.0, 2.22474487139, -2.22474487139), + new Grad3( 0.0, 1.1721513422464978, -3.0862664687972017), + new Grad3( 0.0, 3.0862664687972017, -1.1721513422464978), + new Grad3(-1.0, 2.22474487139, 2.22474487139), + new Grad3( 1.0, 2.22474487139, 2.22474487139), + new Grad3( 0.0, 3.0862664687972017, 1.1721513422464978), + new Grad3( 0.0, 1.1721513422464978, 3.0862664687972017), + new Grad3( 2.22474487139, -2.22474487139, -1.0), + new Grad3( 2.22474487139, -2.22474487139, 1.0), + new Grad3( 1.1721513422464978, -3.0862664687972017, 0.0), + new Grad3( 3.0862664687972017, -1.1721513422464978, 0.0), + new Grad3( 2.22474487139, -1.0, -2.22474487139), + new Grad3( 2.22474487139, 1.0, -2.22474487139), + new Grad3( 3.0862664687972017, 0.0, -1.1721513422464978), + new Grad3( 1.1721513422464978, 0.0, -3.0862664687972017), + new Grad3( 2.22474487139, -1.0, 2.22474487139), + new Grad3( 2.22474487139, 1.0, 2.22474487139), + new Grad3( 1.1721513422464978, 0.0, 3.0862664687972017), + new Grad3( 3.0862664687972017, 0.0, 1.1721513422464978), + new Grad3( 2.22474487139, 2.22474487139, -1.0), + new Grad3( 2.22474487139, 2.22474487139, 1.0), + new Grad3( 3.0862664687972017, 1.1721513422464978, 0.0), + new Grad3( 1.1721513422464978, 3.0862664687972017, 0.0) + }; + for (int i = 0; i < grad3.length; i++) { + grad3[i].dx /= N3; grad3[i].dy /= N3; grad3[i].dz /= N3; + } + for (int i = 0; i < PSIZE; i++) { + GRADIENTS_3D[i] = grad3[i % grad3.length]; + } + + GRADIENTS_4D = new Grad4[PSIZE]; + Grad4[] grad4 = { + new Grad4(-0.753341017856078, -0.37968289875261624, -0.37968289875261624, -0.37968289875261624), + new Grad4(-0.7821684431180708, -0.4321472685365301, -0.4321472685365301, 0.12128480194602098), + new Grad4(-0.7821684431180708, -0.4321472685365301, 0.12128480194602098, -0.4321472685365301), + new Grad4(-0.7821684431180708, 0.12128480194602098, -0.4321472685365301, -0.4321472685365301), + new Grad4(-0.8586508742123365, -0.508629699630796, 0.044802370851755174, 0.044802370851755174), + new Grad4(-0.8586508742123365, 0.044802370851755174, -0.508629699630796, 0.044802370851755174), + new Grad4(-0.8586508742123365, 0.044802370851755174, 0.044802370851755174, -0.508629699630796), + new Grad4(-0.9982828964265062, -0.03381941603233842, -0.03381941603233842, -0.03381941603233842), + new Grad4(-0.37968289875261624, -0.753341017856078, -0.37968289875261624, -0.37968289875261624), + new Grad4(-0.4321472685365301, -0.7821684431180708, -0.4321472685365301, 0.12128480194602098), + new Grad4(-0.4321472685365301, -0.7821684431180708, 0.12128480194602098, -0.4321472685365301), + new Grad4( 0.12128480194602098, -0.7821684431180708, -0.4321472685365301, -0.4321472685365301), + new Grad4(-0.508629699630796, -0.8586508742123365, 0.044802370851755174, 0.044802370851755174), + new Grad4( 0.044802370851755174, -0.8586508742123365, -0.508629699630796, 0.044802370851755174), + new Grad4( 0.044802370851755174, -0.8586508742123365, 0.044802370851755174, -0.508629699630796), + new Grad4(-0.03381941603233842, -0.9982828964265062, -0.03381941603233842, -0.03381941603233842), + new Grad4(-0.37968289875261624, -0.37968289875261624, -0.753341017856078, -0.37968289875261624), + new Grad4(-0.4321472685365301, -0.4321472685365301, -0.7821684431180708, 0.12128480194602098), + new Grad4(-0.4321472685365301, 0.12128480194602098, -0.7821684431180708, -0.4321472685365301), + new Grad4( 0.12128480194602098, -0.4321472685365301, -0.7821684431180708, -0.4321472685365301), + new Grad4(-0.508629699630796, 0.044802370851755174, -0.8586508742123365, 0.044802370851755174), + new Grad4( 0.044802370851755174, -0.508629699630796, -0.8586508742123365, 0.044802370851755174), + new Grad4( 0.044802370851755174, 0.044802370851755174, -0.8586508742123365, -0.508629699630796), + new Grad4(-0.03381941603233842, -0.03381941603233842, -0.9982828964265062, -0.03381941603233842), + new Grad4(-0.37968289875261624, -0.37968289875261624, -0.37968289875261624, -0.753341017856078), + new Grad4(-0.4321472685365301, -0.4321472685365301, 0.12128480194602098, -0.7821684431180708), + new Grad4(-0.4321472685365301, 0.12128480194602098, -0.4321472685365301, -0.7821684431180708), + new Grad4( 0.12128480194602098, -0.4321472685365301, -0.4321472685365301, -0.7821684431180708), + new Grad4(-0.508629699630796, 0.044802370851755174, 0.044802370851755174, -0.8586508742123365), + new Grad4( 0.044802370851755174, -0.508629699630796, 0.044802370851755174, -0.8586508742123365), + new Grad4( 0.044802370851755174, 0.044802370851755174, -0.508629699630796, -0.8586508742123365), + new Grad4(-0.03381941603233842, -0.03381941603233842, -0.03381941603233842, -0.9982828964265062), + new Grad4(-0.6740059517812944, -0.3239847771997537, -0.3239847771997537, 0.5794684678643381), + new Grad4(-0.7504883828755602, -0.4004672082940195, 0.15296486218853164, 0.5029860367700724), + new Grad4(-0.7504883828755602, 0.15296486218853164, -0.4004672082940195, 0.5029860367700724), + new Grad4(-0.8828161875373585, 0.08164729285680945, 0.08164729285680945, 0.4553054119602712), + new Grad4(-0.4553054119602712, -0.08164729285680945, -0.08164729285680945, 0.8828161875373585), + new Grad4(-0.5029860367700724, -0.15296486218853164, 0.4004672082940195, 0.7504883828755602), + new Grad4(-0.5029860367700724, 0.4004672082940195, -0.15296486218853164, 0.7504883828755602), + new Grad4(-0.5794684678643381, 0.3239847771997537, 0.3239847771997537, 0.6740059517812944), + new Grad4(-0.3239847771997537, -0.6740059517812944, -0.3239847771997537, 0.5794684678643381), + new Grad4(-0.4004672082940195, -0.7504883828755602, 0.15296486218853164, 0.5029860367700724), + new Grad4( 0.15296486218853164, -0.7504883828755602, -0.4004672082940195, 0.5029860367700724), + new Grad4( 0.08164729285680945, -0.8828161875373585, 0.08164729285680945, 0.4553054119602712), + new Grad4(-0.08164729285680945, -0.4553054119602712, -0.08164729285680945, 0.8828161875373585), + new Grad4(-0.15296486218853164, -0.5029860367700724, 0.4004672082940195, 0.7504883828755602), + new Grad4( 0.4004672082940195, -0.5029860367700724, -0.15296486218853164, 0.7504883828755602), + new Grad4( 0.3239847771997537, -0.5794684678643381, 0.3239847771997537, 0.6740059517812944), + new Grad4(-0.3239847771997537, -0.3239847771997537, -0.6740059517812944, 0.5794684678643381), + new Grad4(-0.4004672082940195, 0.15296486218853164, -0.7504883828755602, 0.5029860367700724), + new Grad4( 0.15296486218853164, -0.4004672082940195, -0.7504883828755602, 0.5029860367700724), + new Grad4( 0.08164729285680945, 0.08164729285680945, -0.8828161875373585, 0.4553054119602712), + new Grad4(-0.08164729285680945, -0.08164729285680945, -0.4553054119602712, 0.8828161875373585), + new Grad4(-0.15296486218853164, 0.4004672082940195, -0.5029860367700724, 0.7504883828755602), + new Grad4( 0.4004672082940195, -0.15296486218853164, -0.5029860367700724, 0.7504883828755602), + new Grad4( 0.3239847771997537, 0.3239847771997537, -0.5794684678643381, 0.6740059517812944), + new Grad4(-0.6740059517812944, -0.3239847771997537, 0.5794684678643381, -0.3239847771997537), + new Grad4(-0.7504883828755602, -0.4004672082940195, 0.5029860367700724, 0.15296486218853164), + new Grad4(-0.7504883828755602, 0.15296486218853164, 0.5029860367700724, -0.4004672082940195), + new Grad4(-0.8828161875373585, 0.08164729285680945, 0.4553054119602712, 0.08164729285680945), + new Grad4(-0.4553054119602712, -0.08164729285680945, 0.8828161875373585, -0.08164729285680945), + new Grad4(-0.5029860367700724, -0.15296486218853164, 0.7504883828755602, 0.4004672082940195), + new Grad4(-0.5029860367700724, 0.4004672082940195, 0.7504883828755602, -0.15296486218853164), + new Grad4(-0.5794684678643381, 0.3239847771997537, 0.6740059517812944, 0.3239847771997537), + new Grad4(-0.3239847771997537, -0.6740059517812944, 0.5794684678643381, -0.3239847771997537), + new Grad4(-0.4004672082940195, -0.7504883828755602, 0.5029860367700724, 0.15296486218853164), + new Grad4( 0.15296486218853164, -0.7504883828755602, 0.5029860367700724, -0.4004672082940195), + new Grad4( 0.08164729285680945, -0.8828161875373585, 0.4553054119602712, 0.08164729285680945), + new Grad4(-0.08164729285680945, -0.4553054119602712, 0.8828161875373585, -0.08164729285680945), + new Grad4(-0.15296486218853164, -0.5029860367700724, 0.7504883828755602, 0.4004672082940195), + new Grad4( 0.4004672082940195, -0.5029860367700724, 0.7504883828755602, -0.15296486218853164), + new Grad4( 0.3239847771997537, -0.5794684678643381, 0.6740059517812944, 0.3239847771997537), + new Grad4(-0.3239847771997537, -0.3239847771997537, 0.5794684678643381, -0.6740059517812944), + new Grad4(-0.4004672082940195, 0.15296486218853164, 0.5029860367700724, -0.7504883828755602), + new Grad4( 0.15296486218853164, -0.4004672082940195, 0.5029860367700724, -0.7504883828755602), + new Grad4( 0.08164729285680945, 0.08164729285680945, 0.4553054119602712, -0.8828161875373585), + new Grad4(-0.08164729285680945, -0.08164729285680945, 0.8828161875373585, -0.4553054119602712), + new Grad4(-0.15296486218853164, 0.4004672082940195, 0.7504883828755602, -0.5029860367700724), + new Grad4( 0.4004672082940195, -0.15296486218853164, 0.7504883828755602, -0.5029860367700724), + new Grad4( 0.3239847771997537, 0.3239847771997537, 0.6740059517812944, -0.5794684678643381), + new Grad4(-0.6740059517812944, 0.5794684678643381, -0.3239847771997537, -0.3239847771997537), + new Grad4(-0.7504883828755602, 0.5029860367700724, -0.4004672082940195, 0.15296486218853164), + new Grad4(-0.7504883828755602, 0.5029860367700724, 0.15296486218853164, -0.4004672082940195), + new Grad4(-0.8828161875373585, 0.4553054119602712, 0.08164729285680945, 0.08164729285680945), + new Grad4(-0.4553054119602712, 0.8828161875373585, -0.08164729285680945, -0.08164729285680945), + new Grad4(-0.5029860367700724, 0.7504883828755602, -0.15296486218853164, 0.4004672082940195), + new Grad4(-0.5029860367700724, 0.7504883828755602, 0.4004672082940195, -0.15296486218853164), + new Grad4(-0.5794684678643381, 0.6740059517812944, 0.3239847771997537, 0.3239847771997537), + new Grad4(-0.3239847771997537, 0.5794684678643381, -0.6740059517812944, -0.3239847771997537), + new Grad4(-0.4004672082940195, 0.5029860367700724, -0.7504883828755602, 0.15296486218853164), + new Grad4( 0.15296486218853164, 0.5029860367700724, -0.7504883828755602, -0.4004672082940195), + new Grad4( 0.08164729285680945, 0.4553054119602712, -0.8828161875373585, 0.08164729285680945), + new Grad4(-0.08164729285680945, 0.8828161875373585, -0.4553054119602712, -0.08164729285680945), + new Grad4(-0.15296486218853164, 0.7504883828755602, -0.5029860367700724, 0.4004672082940195), + new Grad4( 0.4004672082940195, 0.7504883828755602, -0.5029860367700724, -0.15296486218853164), + new Grad4( 0.3239847771997537, 0.6740059517812944, -0.5794684678643381, 0.3239847771997537), + new Grad4(-0.3239847771997537, 0.5794684678643381, -0.3239847771997537, -0.6740059517812944), + new Grad4(-0.4004672082940195, 0.5029860367700724, 0.15296486218853164, -0.7504883828755602), + new Grad4( 0.15296486218853164, 0.5029860367700724, -0.4004672082940195, -0.7504883828755602), + new Grad4( 0.08164729285680945, 0.4553054119602712, 0.08164729285680945, -0.8828161875373585), + new Grad4(-0.08164729285680945, 0.8828161875373585, -0.08164729285680945, -0.4553054119602712), + new Grad4(-0.15296486218853164, 0.7504883828755602, 0.4004672082940195, -0.5029860367700724), + new Grad4( 0.4004672082940195, 0.7504883828755602, -0.15296486218853164, -0.5029860367700724), + new Grad4( 0.3239847771997537, 0.6740059517812944, 0.3239847771997537, -0.5794684678643381), + new Grad4( 0.5794684678643381, -0.6740059517812944, -0.3239847771997537, -0.3239847771997537), + new Grad4( 0.5029860367700724, -0.7504883828755602, -0.4004672082940195, 0.15296486218853164), + new Grad4( 0.5029860367700724, -0.7504883828755602, 0.15296486218853164, -0.4004672082940195), + new Grad4( 0.4553054119602712, -0.8828161875373585, 0.08164729285680945, 0.08164729285680945), + new Grad4( 0.8828161875373585, -0.4553054119602712, -0.08164729285680945, -0.08164729285680945), + new Grad4( 0.7504883828755602, -0.5029860367700724, -0.15296486218853164, 0.4004672082940195), + new Grad4( 0.7504883828755602, -0.5029860367700724, 0.4004672082940195, -0.15296486218853164), + new Grad4( 0.6740059517812944, -0.5794684678643381, 0.3239847771997537, 0.3239847771997537), + new Grad4( 0.5794684678643381, -0.3239847771997537, -0.6740059517812944, -0.3239847771997537), + new Grad4( 0.5029860367700724, -0.4004672082940195, -0.7504883828755602, 0.15296486218853164), + new Grad4( 0.5029860367700724, 0.15296486218853164, -0.7504883828755602, -0.4004672082940195), + new Grad4( 0.4553054119602712, 0.08164729285680945, -0.8828161875373585, 0.08164729285680945), + new Grad4( 0.8828161875373585, -0.08164729285680945, -0.4553054119602712, -0.08164729285680945), + new Grad4( 0.7504883828755602, -0.15296486218853164, -0.5029860367700724, 0.4004672082940195), + new Grad4( 0.7504883828755602, 0.4004672082940195, -0.5029860367700724, -0.15296486218853164), + new Grad4( 0.6740059517812944, 0.3239847771997537, -0.5794684678643381, 0.3239847771997537), + new Grad4( 0.5794684678643381, -0.3239847771997537, -0.3239847771997537, -0.6740059517812944), + new Grad4( 0.5029860367700724, -0.4004672082940195, 0.15296486218853164, -0.7504883828755602), + new Grad4( 0.5029860367700724, 0.15296486218853164, -0.4004672082940195, -0.7504883828755602), + new Grad4( 0.4553054119602712, 0.08164729285680945, 0.08164729285680945, -0.8828161875373585), + new Grad4( 0.8828161875373585, -0.08164729285680945, -0.08164729285680945, -0.4553054119602712), + new Grad4( 0.7504883828755602, -0.15296486218853164, 0.4004672082940195, -0.5029860367700724), + new Grad4( 0.7504883828755602, 0.4004672082940195, -0.15296486218853164, -0.5029860367700724), + new Grad4( 0.6740059517812944, 0.3239847771997537, 0.3239847771997537, -0.5794684678643381), + new Grad4( 0.03381941603233842, 0.03381941603233842, 0.03381941603233842, 0.9982828964265062), + new Grad4(-0.044802370851755174, -0.044802370851755174, 0.508629699630796, 0.8586508742123365), + new Grad4(-0.044802370851755174, 0.508629699630796, -0.044802370851755174, 0.8586508742123365), + new Grad4(-0.12128480194602098, 0.4321472685365301, 0.4321472685365301, 0.7821684431180708), + new Grad4( 0.508629699630796, -0.044802370851755174, -0.044802370851755174, 0.8586508742123365), + new Grad4( 0.4321472685365301, -0.12128480194602098, 0.4321472685365301, 0.7821684431180708), + new Grad4( 0.4321472685365301, 0.4321472685365301, -0.12128480194602098, 0.7821684431180708), + new Grad4( 0.37968289875261624, 0.37968289875261624, 0.37968289875261624, 0.753341017856078), + new Grad4( 0.03381941603233842, 0.03381941603233842, 0.9982828964265062, 0.03381941603233842), + new Grad4(-0.044802370851755174, 0.044802370851755174, 0.8586508742123365, 0.508629699630796), + new Grad4(-0.044802370851755174, 0.508629699630796, 0.8586508742123365, -0.044802370851755174), + new Grad4(-0.12128480194602098, 0.4321472685365301, 0.7821684431180708, 0.4321472685365301), + new Grad4( 0.508629699630796, -0.044802370851755174, 0.8586508742123365, -0.044802370851755174), + new Grad4( 0.4321472685365301, -0.12128480194602098, 0.7821684431180708, 0.4321472685365301), + new Grad4( 0.4321472685365301, 0.4321472685365301, 0.7821684431180708, -0.12128480194602098), + new Grad4( 0.37968289875261624, 0.37968289875261624, 0.753341017856078, 0.37968289875261624), + new Grad4( 0.03381941603233842, 0.9982828964265062, 0.03381941603233842, 0.03381941603233842), + new Grad4(-0.044802370851755174, 0.8586508742123365, -0.044802370851755174, 0.508629699630796), + new Grad4(-0.044802370851755174, 0.8586508742123365, 0.508629699630796, -0.044802370851755174), + new Grad4(-0.12128480194602098, 0.7821684431180708, 0.4321472685365301, 0.4321472685365301), + new Grad4( 0.508629699630796, 0.8586508742123365, -0.044802370851755174, -0.044802370851755174), + new Grad4( 0.4321472685365301, 0.7821684431180708, -0.12128480194602098, 0.4321472685365301), + new Grad4( 0.4321472685365301, 0.7821684431180708, 0.4321472685365301, -0.12128480194602098), + new Grad4( 0.37968289875261624, 0.753341017856078, 0.37968289875261624, 0.37968289875261624), + new Grad4( 0.9982828964265062, 0.03381941603233842, 0.03381941603233842, 0.03381941603233842), + new Grad4( 0.8586508742123365, -0.044802370851755174, -0.044802370851755174, 0.508629699630796), + new Grad4( 0.8586508742123365, -0.044802370851755174, 0.508629699630796, -0.044802370851755174), + new Grad4( 0.7821684431180708, -0.12128480194602098, 0.4321472685365301, 0.4321472685365301), + new Grad4( 0.8586508742123365, 0.508629699630796, -0.044802370851755174, -0.044802370851755174), + new Grad4( 0.7821684431180708, 0.4321472685365301, -0.12128480194602098, 0.4321472685365301), + new Grad4( 0.7821684431180708, 0.4321472685365301, 0.4321472685365301, -0.12128480194602098), + new Grad4( 0.753341017856078, 0.37968289875261624, 0.37968289875261624, 0.37968289875261624) + }; + for (int i = 0; i < grad4.length; i++) { + grad4[i].dx /= N4; grad4[i].dy /= N4; grad4[i].dz /= N4; grad4[i].dw /= N4; + } + for (int i = 0; i < PSIZE; i++) { + GRADIENTS_4D[i] = grad4[i % grad4.length]; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/volmit/iris/noise/PerlinNoise.java b/src/main/java/com/volmit/iris/noise/PerlinNoise.java index 7ac1560cd..f450fa235 100644 --- a/src/main/java/com/volmit/iris/noise/PerlinNoise.java +++ b/src/main/java/com/volmit/iris/noise/PerlinNoise.java @@ -1,4 +1,4 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; import java.util.Random; diff --git a/src/main/java/com/volmit/iris/noise/PolygonGenerator.java b/src/main/java/com/volmit/iris/noise/PolygonGenerator.java index 485a580f5..79a94e00f 100644 --- a/src/main/java/com/volmit/iris/noise/PolygonGenerator.java +++ b/src/main/java/com/volmit/iris/noise/PolygonGenerator.java @@ -1,7 +1,12 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; import java.util.function.Function; +import com.volmit.iris.util.KList; +import com.volmit.iris.util.KMap; +import com.volmit.iris.util.M; +import com.volmit.iris.util.RNG; + public class PolygonGenerator { private double[] rarity; diff --git a/src/main/java/com/volmit/iris/noise/RarityCellGenerator.java b/src/main/java/com/volmit/iris/noise/RarityCellGenerator.java index 4b9cab73a..7c53d361c 100644 --- a/src/main/java/com/volmit/iris/noise/RarityCellGenerator.java +++ b/src/main/java/com/volmit/iris/noise/RarityCellGenerator.java @@ -1,4 +1,8 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; + +import com.volmit.iris.util.IRare; +import com.volmit.iris.util.KList; +import com.volmit.iris.util.RNG; public class RarityCellGenerator extends CellGenerator { diff --git a/src/main/java/com/volmit/iris/noise/SNG.java b/src/main/java/com/volmit/iris/noise/SNG.java index 8de39ee7e..1037613bb 100644 --- a/src/main/java/com/volmit/iris/noise/SNG.java +++ b/src/main/java/com/volmit/iris/noise/SNG.java @@ -1,4 +1,4 @@ -package com.volmit.iris.util; +package com.volmit.iris.noise; import java.util.Random; diff --git a/src/main/java/com/volmit/iris/noise/SimplexNoise.java b/src/main/java/com/volmit/iris/noise/SimplexNoise.java new file mode 100644 index 000000000..377f7c7d6 --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/SimplexNoise.java @@ -0,0 +1,24 @@ +package com.volmit.iris.noise; + +public class SimplexNoise implements NoiseGenerator { + private final OpenSimplex n; + + public SimplexNoise(long seed) { + this.n = new OpenSimplex(seed); + } + + @Override + public double noise(double x) { + return (n.noise2(x, 0) / 2D) + 0.5D; + } + + @Override + public double noise(double x, double z) { + return (n.noise2(x, z) / 2D) + 0.5D; + } + + @Override + public double noise(double x, double y, double z) { + return (n.noise3_XZBeforeY(x, y, z) / 2D) + 0.5D; + } +} diff --git a/src/main/java/com/volmit/iris/noise/Test.java b/src/main/java/com/volmit/iris/noise/Test.java new file mode 100644 index 000000000..9a3a46c7e --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/Test.java @@ -0,0 +1,17 @@ +package com.volmit.iris.noise; + +public class Test { + + public static void main(String[] args) { + NoiseGenerator t = null; + + for (NoiseType i : NoiseType.values()) { + System.out.println("Test: " + i.name()); + t = i.create(0); + for (int j = 0; j < 100; j++) { + System.out.println(t.noise(j * 1)); + } + } + } + +} diff --git a/src/main/java/com/volmit/iris/noise/VascularNoise.java b/src/main/java/com/volmit/iris/noise/VascularNoise.java new file mode 100644 index 000000000..08ed5dad3 --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/VascularNoise.java @@ -0,0 +1,31 @@ +package com.volmit.iris.noise; + +public class VascularNoise implements NoiseGenerator { + private final FastNoise n; + + public VascularNoise(long seed) { + this.n = new FastNoise((int) seed); + n.SetNoiseType(FastNoise.NoiseType.Cellular); + n.SetCellularReturnType(FastNoise.CellularReturnType.Distance2Sub); + n.SetCellularDistanceFunction(FastNoise.CellularDistanceFunction.Natural); + } + + private double filter(double noise) { + return 1D - ((noise / 2D) + 0.5D); + } + + @Override + public double noise(double x) { + return filter(n.GetCellular((float) x, 0)); + } + + @Override + public double noise(double x, double z) { + return filter(n.GetCellular((float) x, (float) z)); + } + + @Override + public double noise(double x, double y, double z) { + return filter(n.GetCellular((float) x, (float) y, (float) z)); + } +} diff --git a/src/main/java/com/volmit/iris/noise/WhiteNoise.java b/src/main/java/com/volmit/iris/noise/WhiteNoise.java new file mode 100644 index 000000000..7b4bd375b --- /dev/null +++ b/src/main/java/com/volmit/iris/noise/WhiteNoise.java @@ -0,0 +1,25 @@ +package com.volmit.iris.noise; + +public class WhiteNoise implements NoiseGenerator { + private final FastNoise n; + + public WhiteNoise(long seed) { + n = new FastNoise((int) seed); + } + + @Override + public double noise(double x) { + return (n.GetWhiteNoise((float) x, 0) / 2D) + 0.5D; + } + + @Override + public double noise(double x, double z) { + return (n.GetWhiteNoise((float) x, (float) z) / 2D) + 0.5D; + } + + @Override + public double noise(double x, double y, double z) { + return (n.GetWhiteNoise((float) x, (float) y, (float) z) / 2D) + 0.5D; + } + +} diff --git a/src/main/java/com/volmit/iris/object/IrisBiome.java b/src/main/java/com/volmit/iris/object/IrisBiome.java index 864417b63..2ab8d0820 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiome.java +++ b/src/main/java/com/volmit/iris/object/IrisBiome.java @@ -6,8 +6,9 @@ import org.bukkit.block.data.BlockData; import com.volmit.iris.Iris; import com.volmit.iris.gen.ContextualChunkGenerator; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; +import com.volmit.iris.noise.RarityCellGenerator; import com.volmit.iris.util.ArrayType; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.IRare; @@ -16,7 +17,6 @@ import com.volmit.iris.util.KSet; import com.volmit.iris.util.MaxNumber; import com.volmit.iris.util.MinNumber; import com.volmit.iris.util.RNG; -import com.volmit.iris.util.RarityCellGenerator; import com.volmit.iris.util.Required; import lombok.Data; diff --git a/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java b/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java index 7ceea6389..6e1f842f7 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java +++ b/src/main/java/com/volmit/iris/object/IrisBiomeDecorator.java @@ -3,9 +3,9 @@ package com.volmit.iris.object; import org.bukkit.block.data.BlockData; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.B; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.KList; diff --git a/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java b/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java index 8a97c044a..9128561df 100644 --- a/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java +++ b/src/main/java/com/volmit/iris/object/IrisBiomePaletteLayer.java @@ -3,9 +3,9 @@ package com.volmit.iris.object; import org.bukkit.block.data.BlockData; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.B; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.KList; diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index 3ede5257c..420ec5266 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -9,9 +9,9 @@ import com.volmit.iris.Iris; import com.volmit.iris.gen.ContextualChunkGenerator; import com.volmit.iris.gen.PostBlockChunkGenerator; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.B; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.ChunkPosition; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; diff --git a/src/main/java/com/volmit/iris/object/IrisGenerator.java b/src/main/java/com/volmit/iris/object/IrisGenerator.java index ea33aa808..b7d553f96 100644 --- a/src/main/java/com/volmit/iris/object/IrisGenerator.java +++ b/src/main/java/com/volmit/iris/object/IrisGenerator.java @@ -2,8 +2,8 @@ package com.volmit.iris.object; import com.volmit.iris.Iris; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CellGenerator; import com.volmit.iris.util.ArrayType; -import com.volmit.iris.util.CellGenerator; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.IrisInterpolation; diff --git a/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java b/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java index 8bdba5987..30ab266a4 100644 --- a/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java +++ b/src/main/java/com/volmit/iris/object/IrisNoiseGenerator.java @@ -1,8 +1,8 @@ package com.volmit.iris.object; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.IrisInterpolation; diff --git a/src/main/java/com/volmit/iris/object/IrisRegion.java b/src/main/java/com/volmit/iris/object/IrisRegion.java index fdc77957e..b70ff1528 100644 --- a/src/main/java/com/volmit/iris/object/IrisRegion.java +++ b/src/main/java/com/volmit/iris/object/IrisRegion.java @@ -3,8 +3,8 @@ package com.volmit.iris.object; import com.volmit.iris.Iris; import com.volmit.iris.gen.ContextualChunkGenerator; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.IRare; diff --git a/src/main/java/com/volmit/iris/object/IrisRegionRidge.java b/src/main/java/com/volmit/iris/object/IrisRegionRidge.java index 37aaec3d6..6688a71c8 100644 --- a/src/main/java/com/volmit/iris/object/IrisRegionRidge.java +++ b/src/main/java/com/volmit/iris/object/IrisRegionRidge.java @@ -1,7 +1,7 @@ package com.volmit.iris.object; import com.volmit.iris.gen.atomics.AtomicCache; -import com.volmit.iris.util.CellGenerator; +import com.volmit.iris.noise.CellGenerator; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.MaxNumber; diff --git a/src/main/java/com/volmit/iris/object/IrisRegionSpot.java b/src/main/java/com/volmit/iris/object/IrisRegionSpot.java index 965c93426..7c62ba55c 100644 --- a/src/main/java/com/volmit/iris/object/IrisRegionSpot.java +++ b/src/main/java/com/volmit/iris/object/IrisRegionSpot.java @@ -1,7 +1,7 @@ package com.volmit.iris.object; import com.volmit.iris.gen.atomics.AtomicCache; -import com.volmit.iris.util.CellGenerator; +import com.volmit.iris.noise.CellGenerator; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.MinNumber; diff --git a/src/main/java/com/volmit/iris/object/IrisStructure.java b/src/main/java/com/volmit/iris/object/IrisStructure.java index 5c82ee7cc..d028a76f3 100644 --- a/src/main/java/com/volmit/iris/object/IrisStructure.java +++ b/src/main/java/com/volmit/iris/object/IrisStructure.java @@ -1,9 +1,9 @@ package com.volmit.iris.object; import com.volmit.iris.gen.atomics.AtomicCache; +import com.volmit.iris.noise.CNG; import com.volmit.iris.util.ArrayType; import com.volmit.iris.util.BlockPosition; -import com.volmit.iris.util.CNG; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.KList; diff --git a/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java b/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java index 3fd8fd9b9..65f3cef64 100644 --- a/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java +++ b/src/main/java/com/volmit/iris/object/IrisStructurePlacement.java @@ -4,7 +4,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.gen.ContextualChunkGenerator; import com.volmit.iris.gen.ParallaxChunkGenerator; import com.volmit.iris.gen.atomics.AtomicCache; -import com.volmit.iris.util.CellGenerator; +import com.volmit.iris.noise.CellGenerator; import com.volmit.iris.util.Desc; import com.volmit.iris.util.DontObfuscate; import com.volmit.iris.util.MaxNumber;