diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java index 526afe137..4c96cc42b 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/normalizer/Normalizer.java @@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.normalizer; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.List; + public abstract class Normalizer implements NoiseSampler { private final NoiseSampler sampler; @@ -20,12 +22,12 @@ public abstract class Normalizer implements NoiseSampler { public abstract double normalize(double in); @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return normalize(sampler.noise(seed, x, y)); } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return normalize(sampler.noise(seed, x, y, z)); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java index 2ead08442..8be28c7f4 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/DomainWarpedSampler.java @@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.List; + public class DomainWarpedSampler implements NoiseSampler { private final NoiseSampler function; @@ -22,7 +24,7 @@ public class DomainWarpedSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return function.noise(seed++, x + warp.noise(seed++, x, y) * amplitude, y + warp.noise(seed, x, y) * amplitude @@ -30,7 +32,7 @@ public class DomainWarpedSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return function.noise(seed++, x + warp.noise(seed++, x, y, z) * amplitude, y + warp.noise(seed++, x, y, z) * amplitude, diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java index bd60744ad..17dc4a08f 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/ImageSampler.java @@ -8,6 +8,7 @@ package com.dfsek.terra.addons.noise.samplers; import java.awt.image.BufferedImage; +import java.util.List; import com.dfsek.terra.api.noise.NoiseSampler; @@ -25,14 +26,14 @@ public class ImageSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return ((channel.getChannel(image.getRGB(Math.floorMod((int) Math.floor(x * frequency), image.getWidth()), Math.floorMod((int) Math.floor(y * frequency), image.getHeight()))) / 255D) - 0.5) * 2; } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return noise(seed, x, y); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java index 05997df7f..05d721ec0 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/KernelSampler.java @@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.List; + public class KernelSampler implements NoiseSampler { private final double[][] kernel; @@ -25,7 +27,7 @@ public class KernelSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { x *= frequency; y *= frequency; double accumulator = 0; @@ -43,7 +45,7 @@ public class KernelSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { x *= frequency; y *= frequency; z *= frequency; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/LinearHeightmapSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/LinearHeightmapSampler.java index 1f7726034..fb86070c6 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/LinearHeightmapSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/LinearHeightmapSampler.java @@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.List; + public class LinearHeightmapSampler implements NoiseSampler { private final NoiseSampler sampler; @@ -16,12 +18,12 @@ public class LinearHeightmapSampler implements NoiseSampler { @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return noise(seed, x, 0, y); } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return -y + base + sampler.noise(seed, x, y, z) * scale; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java index b634da5dc..379c657bd 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/TranslateSampler.java @@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.List; + public class TranslateSampler implements NoiseSampler { @@ -16,12 +18,12 @@ public class TranslateSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return sampler.noise(seed, x - dx, y - dz); } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return sampler.noise(seed, x - dx, y - dy, z - dz); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java index eb18a60a0..48fd4288c 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/arithmetic/BinaryArithmeticSampler.java @@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers.arithmetic; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.List; + public abstract class BinaryArithmeticSampler implements NoiseSampler { private final NoiseSampler left; @@ -13,12 +15,12 @@ public abstract class BinaryArithmeticSampler implements NoiseSampler { } @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return operate(left.noise(seed, x, y), right.noise(seed, x, y)); } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return operate(left.noise(seed, x, y, z), right.noise(seed, x, y, z)); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java index 89efaf376..e5d7a2719 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/CellularSampler.java @@ -10,6 +10,8 @@ package com.dfsek.terra.addons.noise.samplers.noise; import com.dfsek.terra.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.List; + /** * NoiseSampler implementation for Cellular (Voronoi/Worley) Noise. @@ -219,7 +221,7 @@ public class CellularSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long sl, double x, double y) { + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int xr = (int) Math.round(x); int yr = (int) Math.round(y); @@ -273,9 +275,7 @@ public class CellularSampler extends NoiseFunction { if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) { distance0 = Math.sqrt(distance0); - if(returnType != ReturnType.CellValue) { - distance1 = Math.sqrt(distance1); - } + distance1 = Math.sqrt(distance1); } return switch(returnType) { @@ -298,7 +298,7 @@ public class CellularSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int xr = (int) Math.round(x); int yr = (int) Math.round(y); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java index 9aa9c85d1..2806a2894 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ConstantSampler.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.noise.samplers.noise; +import java.util.List; + + /** * Sampler3D implementation that returns a constant. */ @@ -18,12 +21,12 @@ public class ConstantSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return constant; } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return constant; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java index 246c7bab1..0f86f6d33 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/DistanceSampler.java @@ -1,6 +1,9 @@ package com.dfsek.terra.addons.noise.samplers.noise; +import java.util.List; + + public class DistanceSampler extends NoiseFunction { private final DistanceFunction distanceFunction; @@ -22,7 +25,7 @@ public class DistanceSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { double dx = x - ox; double dy = y - oz; if (normalize && (Math.abs(dx) > radius || Math.abs(dy) > radius)) return 1; @@ -32,7 +35,7 @@ public class DistanceSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { double dx = x - ox; double dy = y - oy; double dz = z - oz; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java index c2d93ed2f..965acb378 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/ExpressionFunction.java @@ -13,6 +13,7 @@ import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.functions.Function; +import java.util.List; import java.util.Map; import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext; @@ -41,12 +42,12 @@ public class ExpressionFunction extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return expression.evaluate(new SeedContext(seed), x, 0, y); } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return expression.evaluate(new SeedContext(seed), x, y, z); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java index 458d5fbfe..01c4225c5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/GaborNoiseSampler.java @@ -10,6 +10,8 @@ package com.dfsek.terra.addons.noise.samplers.noise; import com.dfsek.terra.addons.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + public class GaborNoiseSampler extends NoiseFunction { private final WhiteNoiseSampler rand; @@ -103,12 +105,12 @@ public class GaborNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double z) { + public double getNoiseRaw(long seed, double x, double z, List context, int contextLayer, int contextRadius) { return gaborNoise(seed, x, z); } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return gaborNoise(seed, x, z); } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java index 545b59385..5819ae3b1 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/NoiseFunction.java @@ -9,6 +9,9 @@ package com.dfsek.terra.addons.noise.samplers.noise; import com.dfsek.terra.api.noise.NoiseSampler; +import java.util.ArrayList; +import java.util.List; + public abstract class NoiseFunction implements NoiseSampler { // Hashing @@ -50,16 +53,32 @@ public abstract class NoiseFunction implements NoiseSampler { } @Override - public double noise(long seed, double x, double y) { - return getNoiseRaw(seed + salt, x * frequency, y * frequency); + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { + return getNoiseRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius); } @Override - public double noise(long seed, double x, double y, double z) { - return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency); + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { + return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency, context, contextLayer, contextRadius); } - public abstract double getNoiseRaw(long seed, double x, double y); + public double getNoiseRaw(long seed, double x, double y) { + int contextRadius = getContextRadius(); + + ArrayList list = new ArrayList<>(); + generateContext(seed, x, y, list, 0, contextRadius); + return getNoiseRaw(seed, x, y, list, 0, getContextRadius()); + } - public abstract double getNoiseRaw(long seed, double x, double y, double z); + public double getNoiseRaw(long seed, double x, double y, double z) { + int contextRadius = getContextRadius(); + + ArrayList list = new ArrayList<>(); + generateContext(seed, x, y, z, list, 0, contextRadius); + return getNoiseRaw(seed, x, y, z, list, 0, getContextRadius()); + } + + public abstract double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius); + + public abstract double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius); } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java index 905ca153e..bcfd52897 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/PseudoErosionSampler.java @@ -12,6 +12,8 @@ import com.dfsek.terra.api.util.MathUtil; import com.google.errorprone.annotations.InlineMe; +import java.util.List; + import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_X; import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_Y; import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.hash; @@ -28,7 +30,7 @@ import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.hash; * The algorithm iterates through the cells near the sample point, calculates the distance between the position and the line segment * between the cell and its connected cell, and returns the minimum of these distances. */ -public class PseudoErosionSampler implements NoiseSampler { +public class PseudoErosionSampler extends NoiseFunction { private static final double[] RAND_VECS_3D = { -0.7292736885d, -0.6618439697d, 0.1735581948d, 0, 0.790292081d, -0.5480887466d, -0.2739291014d, 0, 0.7217578935d, 0.6226212466d, -0.3023380997d, 0, 0.565683137d, -0.8208298145d, -0.0790000257d, 0, 0.760049034d, -0.5555979497d, -0.3370999617d, 0, @@ -232,22 +234,29 @@ public class PseudoErosionSampler implements NoiseSampler { } - public double getNoiseRaw(long sl, double x, double y) { + public void generateContextRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; - double finalDistance = Double.MAX_VALUE; // Round sampled position to integers to derive grid coordinates int gridX = (int) Math.round(x); int gridY = (int) Math.round(y); + int nextContextLayer = contextLayer + 1; + int nextContextRadius = contextRadius + getContextRadius(); + + context.add(contextLayer, new double[0]); + this.lookup.generateContext(seed, x, y, context, nextContextLayer, nextContextRadius); + + int contextCircumference = (contextRadius * 2 + 1); + int contextSizeArraySize = contextCircumference * contextCircumference * 3; // Precompute cell positions and lookup values - double[] cellData = new double[PRECOMPUTE_SIZE * PRECOMPUTE_SIZE * 3]; + double[] cellData = new double[contextSizeArraySize]; int cellDataIndex = 0; - for(int xi = -PRECOMPUTE_RADIUS; xi <= PRECOMPUTE_RADIUS; xi++) { + for(int xi = -contextRadius; xi <= contextRadius; xi++) { int gridXi = gridX + xi; int gridXiPrimed = gridXi * PRIME_X; - for(int yi = -PRECOMPUTE_RADIUS; yi <= PRECOMPUTE_RADIUS; yi++) { + for(int yi = -contextRadius; yi <= contextRadius; yi++) { int gridYi = gridY + yi; int jitterIdx = hash(seed, gridXiPrimed, gridYi * PRIME_Y) & (255 << 1); @@ -258,7 +267,7 @@ public class PseudoErosionSampler implements NoiseSampler { double actualCellX = cellX * inverseFrequency; double actualCellY = cellY * inverseFrequency; - double lookup = this.lookup.noise(seed, actualCellX, actualCellY); + double lookup = this.lookup.noise(seed, actualCellX, actualCellY, context, nextContextLayer, nextContextRadius); cellData[cellDataIndex++] = cellX; cellData[cellDataIndex++] = cellY; @@ -266,16 +275,34 @@ public class PseudoErosionSampler implements NoiseSampler { } } + context.add(contextLayer, cellData); + } + + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { + double finalDistance = Double.MAX_VALUE; + + double[] cellData = context.get(contextLayer); + + int xIndexSize = (contextRadius * 6) + 3; + + int deltaRadius = (contextRadius - NEARBY_CELLS_RADIUS); + + int xIndex = xIndexSize * deltaRadius; + int yIndex = 3 * deltaRadius; + // Iterate over nearby cells - cellDataIndex = 21; + int cellDataIndex = xIndex; + //int cellDataIndex = 21; for(int xi = -NEARBY_CELLS_RADIUS; xi <= NEARBY_CELLS_RADIUS; xi++) { - cellDataIndex += 3; + cellDataIndex += yIndex; + //cellDataIndex += 3; for(int yi = -NEARBY_CELLS_RADIUS; yi <= NEARBY_CELLS_RADIUS; yi++) { // Find cell position with the lowest lookup value within moore neighborhood of neighbor double lowestLookup = Double.MAX_VALUE; double connectedCellX = 0; double connectedCellY = 0; + //int cellDataIndexN = cellDataIndex - xIndex - 1; int cellDataIndexN = cellDataIndex - 22; int yniMin = yi - MAX_CONNECTION_RADIUS; int yniMax = yi + MAX_CONNECTION_RADIUS; @@ -304,7 +331,8 @@ public class PseudoErosionSampler implements NoiseSampler { cellDataIndex += 3; } - cellDataIndex += 3; + cellDataIndex += yIndex; + //cellDataIndex += 3; } return finalDistance; @@ -344,18 +372,33 @@ public class PseudoErosionSampler implements NoiseSampler { } - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { // TODO return 0; } @Override - public double noise(long seed, double x, double y) { - return getNoiseRaw(seed + salt, x * frequency, y * frequency); + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { + return getNoiseRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius); } @Override - public double noise(long seed, double x, double y, double z) { - return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency); + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { + return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency, context, contextLayer, contextRadius); + } + + @Override + public void generateContext(long seed, double x, double y, List context, int contextLayer, int contextRadius) { + generateContextRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius); + } + + @Override + public void generateContext(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { + //no-op + } + + @Override + public int getContextRadius() { + return PRECOMPUTE_RADIUS; } } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java index a51c574c3..2af9c14b5 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/BrownianMotionSampler.java @@ -10,6 +10,8 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + public class BrownianMotionSampler extends FractalNoiseFunction { public BrownianMotionSampler(NoiseSampler input) { @@ -17,7 +19,7 @@ public class BrownianMotionSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { double sum = 0; double amp = fractalBounding; @@ -35,7 +37,7 @@ public class BrownianMotionSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java index e8fd2a114..58e8e5da1 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/PingPongSampler.java @@ -10,6 +10,8 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + public class PingPongSampler extends FractalNoiseFunction { private double pingPongStrength = 2.0; @@ -29,7 +31,7 @@ public class PingPongSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { double sum = 0; double amp = fractalBounding; @@ -47,7 +49,7 @@ public class PingPongSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java index 19800bed8..67a26d998 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/fractal/RidgedFractalSampler.java @@ -10,6 +10,8 @@ package com.dfsek.terra.addons.noise.samplers.noise.fractal; import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + public class RidgedFractalSampler extends FractalNoiseFunction { @@ -18,7 +20,7 @@ public class RidgedFractalSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { double sum = 0; double amp = fractalBounding; @@ -36,7 +38,7 @@ public class RidgedFractalSampler extends FractalNoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { double sum = 0; double amp = fractalBounding; diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java index 11047a8fc..ed9c68740 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/GaussianNoiseSampler.java @@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers.noise.random; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; +import java.util.List; + /** * NoiseSampler implementation to provide random, normally distributed (Gaussian) noise. @@ -21,7 +23,7 @@ public class GaussianNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { double v1, v2, s; do { v1 = whiteNoiseSampler.noise(seed++, x, y); @@ -33,7 +35,7 @@ public class GaussianNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { double v1, v2, s; do { v1 = whiteNoiseSampler.noise(seed++, x, y, z); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java index 4c98e04e1..bdd7bb2bf 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/random/WhiteNoiseSampler.java @@ -10,6 +10,8 @@ package com.dfsek.terra.addons.noise.samplers.noise.random; import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + /** * NoiseSampler implementation to produce random, uniformly distributed (white) noise. @@ -40,12 +42,12 @@ public class WhiteNoiseSampler extends NoiseFunction { } @Override - public double getNoiseRaw(long seed, double x, double y) { + public double getNoiseRaw(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return (getNoiseUnmapped(seed, x, y) - 1.5) * 2; } @Override - public double getNoiseRaw(long seed, double x, double y, double z) { + public double getNoiseRaw(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2; } diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java index be20803a8..1c8837bab 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2SSampler.java @@ -7,13 +7,16 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; +import java.util.List; + + /** * NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise. */ public class OpenSimplex2SSampler extends SimplexStyleSampler { @Override @SuppressWarnings("NumericOverflow") - public double getNoiseRaw(long sl, double x, double y) { + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; // 2D OpenSimplex2S case is a modified 2D simplex noise. @@ -121,7 +124,7 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler { @Override @SuppressWarnings("NumericOverflow") - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { int seed = (int) sl; // 3D OpenSimplex2S case uses two offset rotated cube grids. final double R3 = (2.0 / 3.0); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java index 5c5256478..a494f7142 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/OpenSimplex2Sampler.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; +import java.util.List; + + /** * NoiseSampler implementation to provide OpenSimplex2 noise. */ @@ -14,7 +17,7 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { private static final double SQRT3 = 1.7320508075688772935274463415059; @Override - public double getNoiseRaw(long sl, double x, double y) { + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. final double G2 = (3 - SQRT3) / 6; @@ -75,7 +78,7 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { int seed = (int) sl; // 3D OpenSimplex2Sampler case uses two offset rotated cube grids. final double R3 = (2.0 / 3.0); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java index 7b8866c44..d6b38bf4a 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/PerlinSampler.java @@ -9,13 +9,15 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + /** * NoiseSampler implementation to provide Perlin Noise. */ public class PerlinSampler extends SimplexStyleSampler { @Override - public double getNoiseRaw(long sl, double x, double y) { + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int x0 = (int) Math.floor(x); int y0 = (int) Math.floor(y); @@ -40,7 +42,7 @@ public class PerlinSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int x0 = (int) Math.floor(x); int y0 = (int) Math.floor(y); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java index 5066f1488..5f4759dc4 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/simplex/SimplexSampler.java @@ -7,6 +7,9 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex; +import java.util.List; + + public class SimplexSampler extends SimplexStyleSampler { private static final Double2[] GRAD_2D = { new Double2(-1, -1), new Double2(1, -1), new Double2(-1, 1), new Double2(1, 1), @@ -58,7 +61,7 @@ public class SimplexSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(long sl, double x, double y) { + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; double t = (x + y) * F2; int i = (int) Math.floor(x + t); @@ -115,7 +118,7 @@ public class SimplexSampler extends SimplexStyleSampler { } @Override - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { int seed = (int) sl; double t = (x + y + z) * F3; int i = (int) Math.floor(x + t); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java index ab4074a5c..cc4086268 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueCubicSampler.java @@ -9,10 +9,12 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + public class ValueCubicSampler extends ValueStyleNoise { @Override - public double getNoiseRaw(long sl, double x, double y) { + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int x1 = (int) Math.floor(x); int y1 = (int) Math.floor(y); @@ -42,7 +44,7 @@ public class ValueCubicSampler extends ValueStyleNoise { } @Override - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int x1 = (int) Math.floor(x); int y1 = (int) Math.floor(y); diff --git a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java index c4912d90f..493f15813 100644 --- a/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java +++ b/common/addons/config-noise-function/src/main/java/com/dfsek/terra/addons/noise/samplers/noise/value/ValueSampler.java @@ -9,10 +9,12 @@ package com.dfsek.terra.addons.noise.samplers.noise.value; import com.dfsek.terra.api.util.MathUtil; +import java.util.List; + public class ValueSampler extends ValueStyleNoise { @Override - public double getNoiseRaw(long sl, double x, double y) { + public double getNoiseRaw(long sl, double x, double y, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int x0 = (int) Math.floor(x); int y0 = (int) Math.floor(y); @@ -32,7 +34,7 @@ public class ValueSampler extends ValueStyleNoise { } @Override - public double getNoiseRaw(long sl, double x, double y, double z) { + public double getNoiseRaw(long sl, double x, double y, double z, List context, int contextLayer, int contextRadius) { int seed = (int) sl; int x0 = (int) Math.floor(x); int y0 = (int) Math.floor(y); diff --git a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java b/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java index 5e6a5df0b..f9d19c4f3 100644 --- a/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java +++ b/common/api/src/main/java/com/dfsek/terra/api/noise/NoiseSampler.java @@ -13,17 +13,39 @@ import com.dfsek.terra.api.util.vector.Vector2Int; import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3Int; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public interface NoiseSampler { static NoiseSampler zero() { return new NoiseSampler() { + + @Override - public double noise(long seed, double x, double y) { + public double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius) { return 0; } @Override - public double noise(long seed, double x, double y, double z) { + public double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { + return 0; + } + + @Override + public void generateContext(long seed, double x, double y, List context, int contextLayer, int contextRadius) { + //no-op + } + + @Override + public void generateContext(long seed, double x, double y, double z, List context, int contextLayer, + int contextRadius) { + //no-op + } + + @Override + public int getContextRadius() { return 0; } }; @@ -46,15 +68,76 @@ public interface NoiseSampler { return noise(seed, vector2.getX(), vector2.getZ()); } - double noise(long seed, double x, double y); + default double noise(Vector3 vector3, long seed, List context, int contextLayer, int contextRadius) { + return noise(seed, vector3.getX(), vector3.getY(), vector3.getZ(), context, contextLayer, contextRadius); + } + + default double noise(Vector3Int vector3, long seed, List context, int contextLayer, int contextRadius) { + return noise(seed, vector3.getX(), vector3.getY(), vector3.getZ(), context, contextLayer, contextRadius); + } + + + default double noise(Vector2 vector2, long seed, List context, int contextLayer, int contextRadius) { + return noise(seed, vector2.getX(), vector2.getZ(), context, contextLayer, contextRadius); + } + + default double noise(Vector2Int vector2, long seed, List context, int contextLayer, int contextRadius) { + return noise(seed, vector2.getX(), vector2.getZ(), context, contextLayer, contextRadius); + } + + default double noise(long seed, double x, double y) { + int contextRadius = getContextRadius(); + + ArrayList list = new ArrayList<>(); + generateContext(seed, x, y, list, 0, contextRadius); + return noise(seed, x, y, list, 0, contextRadius); + } default double noise(long seed, int x, int y) { return noise(seed, (double) x, y); } - double noise(long seed, double x, double y, double z); + default double noise(long seed, double x, double y, double z) { + int contextRadius = getContextRadius(); + + ArrayList list = new ArrayList<>(); + generateContext(seed, x, y, z, list, 0, contextRadius); + return noise(seed, x, y, z, list, 0, contextRadius); + } default double noise(long seed, int x, int y, int z) { return noise(seed, (double) x, y, z); } + + double noise(long seed, double x, double y, List context, int contextLayer, int contextRadius); + + default double noise(long seed, int x, int y, List context, int contextLayer, int contextRadius) { + return noise(seed, (double) x, y, context, contextLayer, contextRadius); + } + + double noise(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius); + + default double noise(long seed, int x, int y, int z, List context, int contextLayer, int contextRadius) { + return noise(seed, (double) x, y, z, context, contextLayer, contextRadius); + } + + default void generateContext(long seed, double x, double y, List context, int contextLayer, int contextRadius) { + //no-op + } + + default void generateContext(long seed, int x, int y, List context, int contextLayer, int contextRadius) { + generateContext(seed, (double) x, y, context, contextLayer, contextRadius); + } + + default void generateContext(long seed, double x, double y, double z, List context, int contextLayer, int contextRadius) { + //no-op + } + + default void generateContext(long seed, int x, int y, int z, List context, int contextLayer, int contextRadius) { + generateContext(seed, (double) x, y, z, context, contextLayer, contextRadius); + } + + default int getContextRadius() { + return 0; + } }