mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-10-25 21:40:08 +00:00
Noise context api
This commit is contained in:
1 parent
6d67a0747d
commit
18094f511a
26 files changed
+266
-74
No files matched your search
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.normalizer;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public abstract class Normalizer implements NoiseSampler {
|
public abstract class Normalizer implements NoiseSampler {
|
||||||
private final NoiseSampler sampler;
|
private final NoiseSampler sampler;
|
||||||
@@ -20,12 +22,12 @@ public abstract class Normalizer implements NoiseSampler {
|
|||||||
public abstract double normalize(double in);
|
public abstract double normalize(double in);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return normalize(sampler.noise(seed, x, y));
|
return normalize(sampler.noise(seed, x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return normalize(sampler.noise(seed, x, y, z));
|
return normalize(sampler.noise(seed, x, y, z));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class DomainWarpedSampler implements NoiseSampler {
|
public class DomainWarpedSampler implements NoiseSampler {
|
||||||
private final NoiseSampler function;
|
private final NoiseSampler function;
|
||||||
@@ -22,7 +24,7 @@ public class DomainWarpedSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return function.noise(seed++,
|
return function.noise(seed++,
|
||||||
x + warp.noise(seed++, x, y) * amplitude,
|
x + warp.noise(seed++, x, y) * amplitude,
|
||||||
y + warp.noise(seed, x, y) * amplitude
|
y + warp.noise(seed, x, y) * amplitude
|
||||||
@@ -30,7 +32,7 @@ public class DomainWarpedSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return function.noise(seed++,
|
return function.noise(seed++,
|
||||||
x + warp.noise(seed++, x, y, z) * amplitude,
|
x + warp.noise(seed++, x, y, z) * amplitude,
|
||||||
y + warp.noise(seed++, x, y, z) * amplitude,
|
y + warp.noise(seed++, x, y, z) * amplitude,
|
||||||
|
|||||||
+3
-2
@@ -8,6 +8,7 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers;
|
package com.dfsek.terra.addons.noise.samplers;
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
@@ -25,14 +26,14 @@ public class ImageSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return ((channel.getChannel(image.getRGB(Math.floorMod((int) Math.floor(x * frequency), image.getWidth()),
|
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) *
|
Math.floorMod((int) Math.floor(y * frequency), image.getHeight()))) / 255D) - 0.5) *
|
||||||
2;
|
2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return noise(seed, x, y);
|
return noise(seed, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class KernelSampler implements NoiseSampler {
|
public class KernelSampler implements NoiseSampler {
|
||||||
private final double[][] kernel;
|
private final double[][] kernel;
|
||||||
@@ -25,7 +27,7 @@ public class KernelSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
x *= frequency;
|
x *= frequency;
|
||||||
y *= frequency;
|
y *= frequency;
|
||||||
double accumulator = 0;
|
double accumulator = 0;
|
||||||
@@ -43,7 +45,7 @@ public class KernelSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
x *= frequency;
|
x *= frequency;
|
||||||
y *= frequency;
|
y *= frequency;
|
||||||
z *= frequency;
|
z *= frequency;
|
||||||
|
|||||||
+4
-2
@@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class LinearHeightmapSampler implements NoiseSampler {
|
public class LinearHeightmapSampler implements NoiseSampler {
|
||||||
private final NoiseSampler sampler;
|
private final NoiseSampler sampler;
|
||||||
@@ -16,12 +18,12 @@ public class LinearHeightmapSampler implements NoiseSampler {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return noise(seed, x, 0, y);
|
return noise(seed, x, 0, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return -y + base + sampler.noise(seed, x, y, z) * scale;
|
return -y + base + sampler.noise(seed, x, y, z) * scale;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-2
@@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class TranslateSampler implements NoiseSampler {
|
public class TranslateSampler implements NoiseSampler {
|
||||||
|
|
||||||
@@ -16,12 +18,12 @@ public class TranslateSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return sampler.noise(seed, x - dx, y - dz);
|
return sampler.noise(seed, x - dx, y - dz);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return sampler.noise(seed, x - dx, y - dy, z - dz);
|
return sampler.noise(seed, x - dx, y - dy, z - dz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-2
@@ -2,6 +2,8 @@ package com.dfsek.terra.addons.noise.samplers.arithmetic;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public abstract class BinaryArithmeticSampler implements NoiseSampler {
|
public abstract class BinaryArithmeticSampler implements NoiseSampler {
|
||||||
private final NoiseSampler left;
|
private final NoiseSampler left;
|
||||||
@@ -13,12 +15,12 @@ public abstract class BinaryArithmeticSampler implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return operate(left.noise(seed, x, y), right.noise(seed, x, y));
|
return operate(left.noise(seed, x, y), right.noise(seed, x, y));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return operate(left.noise(seed, x, y, z), right.noise(seed, x, y, z));
|
return operate(left.noise(seed, x, y, z), right.noise(seed, x, y, z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -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.addons.noise.samplers.noise.simplex.OpenSimplex2Sampler;
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation for Cellular (Voronoi/Worley) Noise.
|
* NoiseSampler implementation for Cellular (Voronoi/Worley) Noise.
|
||||||
@@ -219,7 +221,7 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int xr = (int) Math.round(x);
|
int xr = (int) Math.round(x);
|
||||||
int yr = (int) Math.round(y);
|
int yr = (int) Math.round(y);
|
||||||
@@ -273,9 +275,7 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
|
|
||||||
if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) {
|
if(distanceFunction == DistanceFunction.Euclidean && returnType != ReturnType.CellValue) {
|
||||||
distance0 = Math.sqrt(distance0);
|
distance0 = Math.sqrt(distance0);
|
||||||
if(returnType != ReturnType.CellValue) {
|
distance1 = Math.sqrt(distance1);
|
||||||
distance1 = Math.sqrt(distance1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return switch(returnType) {
|
return switch(returnType) {
|
||||||
@@ -298,7 +298,7 @@ public class CellularSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int xr = (int) Math.round(x);
|
int xr = (int) Math.round(x);
|
||||||
int yr = (int) Math.round(y);
|
int yr = (int) Math.round(y);
|
||||||
|
|||||||
+5
-2
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sampler3D implementation that returns a constant.
|
* Sampler3D implementation that returns a constant.
|
||||||
*/
|
*/
|
||||||
@@ -18,12 +21,12 @@ public class ConstantSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return constant;
|
return constant;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return constant;
|
return constant;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+5
-2
@@ -1,6 +1,9 @@
|
|||||||
package com.dfsek.terra.addons.noise.samplers.noise;
|
package com.dfsek.terra.addons.noise.samplers.noise;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class DistanceSampler extends NoiseFunction {
|
public class DistanceSampler extends NoiseFunction {
|
||||||
|
|
||||||
private final DistanceFunction distanceFunction;
|
private final DistanceFunction distanceFunction;
|
||||||
@@ -22,7 +25,7 @@ public class DistanceSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double dx = x - ox;
|
double dx = x - ox;
|
||||||
double dy = y - oz;
|
double dy = y - oz;
|
||||||
if (normalize && (Math.abs(dx) > radius || Math.abs(dy) > radius)) return 1;
|
if (normalize && (Math.abs(dx) > radius || Math.abs(dy) > radius)) return 1;
|
||||||
@@ -32,7 +35,7 @@ public class DistanceSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double dx = x - ox;
|
double dx = x - ox;
|
||||||
double dy = y - oy;
|
double dy = y - oy;
|
||||||
double dz = z - oz;
|
double dz = z - oz;
|
||||||
|
|||||||
+3
-2
@@ -13,6 +13,7 @@ import com.dfsek.paralithic.eval.parser.Scope;
|
|||||||
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
import com.dfsek.paralithic.eval.tokenizer.ParseException;
|
||||||
import com.dfsek.paralithic.functions.Function;
|
import com.dfsek.paralithic.functions.Function;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext;
|
import com.dfsek.terra.addons.noise.paralithic.noise.SeedContext;
|
||||||
@@ -41,12 +42,12 @@ public class ExpressionFunction extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return expression.evaluate(new SeedContext(seed), x, 0, y);
|
return expression.evaluate(new SeedContext(seed), x, 0, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return expression.evaluate(new SeedContext(seed), x, y, z);
|
return expression.evaluate(new SeedContext(seed), x, y, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-2
@@ -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.addons.noise.samplers.noise.random.WhiteNoiseSampler;
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class GaborNoiseSampler extends NoiseFunction {
|
public class GaborNoiseSampler extends NoiseFunction {
|
||||||
private final WhiteNoiseSampler rand;
|
private final WhiteNoiseSampler rand;
|
||||||
@@ -103,12 +105,12 @@ public class GaborNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double z) {
|
public double getNoiseRaw(long seed, double x, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return gaborNoise(seed, x, z);
|
return gaborNoise(seed, x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return gaborNoise(seed, x, z);
|
return gaborNoise(seed, x, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+25
-6
@@ -9,6 +9,9 @@ package com.dfsek.terra.addons.noise.samplers.noise;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public abstract class NoiseFunction implements NoiseSampler {
|
public abstract class NoiseFunction implements NoiseSampler {
|
||||||
// Hashing
|
// Hashing
|
||||||
@@ -50,16 +53,32 @@ public abstract class NoiseFunction implements NoiseSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency);
|
return getNoiseRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency);
|
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<double[]> 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<double[]> 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<double[]> context, int contextLayer, int contextRadius);
|
||||||
|
|
||||||
|
public abstract double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius);
|
||||||
}
|
}
|
||||||
+58
-15
@@ -12,6 +12,8 @@ import com.dfsek.terra.api.util.MathUtil;
|
|||||||
|
|
||||||
import com.google.errorprone.annotations.InlineMe;
|
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_X;
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_Y;
|
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.PRIME_Y;
|
||||||
import static com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction.hash;
|
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
|
* 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.
|
* 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 = {
|
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.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,
|
-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<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
double finalDistance = Double.MAX_VALUE;
|
|
||||||
|
|
||||||
// Round sampled position to integers to derive grid coordinates
|
// Round sampled position to integers to derive grid coordinates
|
||||||
int gridX = (int) Math.round(x);
|
int gridX = (int) Math.round(x);
|
||||||
int gridY = (int) Math.round(y);
|
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
|
// Precompute cell positions and lookup values
|
||||||
double[] cellData = new double[PRECOMPUTE_SIZE * PRECOMPUTE_SIZE * 3];
|
double[] cellData = new double[contextSizeArraySize];
|
||||||
int cellDataIndex = 0;
|
int cellDataIndex = 0;
|
||||||
for(int xi = -PRECOMPUTE_RADIUS; xi <= PRECOMPUTE_RADIUS; xi++) {
|
for(int xi = -contextRadius; xi <= contextRadius; xi++) {
|
||||||
int gridXi = gridX + xi;
|
int gridXi = gridX + xi;
|
||||||
int gridXiPrimed = gridXi * PRIME_X;
|
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 gridYi = gridY + yi;
|
||||||
|
|
||||||
int jitterIdx = hash(seed, gridXiPrimed, gridYi * PRIME_Y) & (255 << 1);
|
int jitterIdx = hash(seed, gridXiPrimed, gridYi * PRIME_Y) & (255 << 1);
|
||||||
@@ -258,7 +267,7 @@ public class PseudoErosionSampler implements NoiseSampler {
|
|||||||
double actualCellX = cellX * inverseFrequency;
|
double actualCellX = cellX * inverseFrequency;
|
||||||
double actualCellY = cellY * 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++] = cellX;
|
||||||
cellData[cellDataIndex++] = cellY;
|
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<double[]> 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
|
// Iterate over nearby cells
|
||||||
cellDataIndex = 21;
|
int cellDataIndex = xIndex;
|
||||||
|
//int cellDataIndex = 21;
|
||||||
for(int xi = -NEARBY_CELLS_RADIUS; xi <= NEARBY_CELLS_RADIUS; xi++) {
|
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++) {
|
for(int yi = -NEARBY_CELLS_RADIUS; yi <= NEARBY_CELLS_RADIUS; yi++) {
|
||||||
|
|
||||||
// Find cell position with the lowest lookup value within moore neighborhood of neighbor
|
// Find cell position with the lowest lookup value within moore neighborhood of neighbor
|
||||||
double lowestLookup = Double.MAX_VALUE;
|
double lowestLookup = Double.MAX_VALUE;
|
||||||
double connectedCellX = 0;
|
double connectedCellX = 0;
|
||||||
double connectedCellY = 0;
|
double connectedCellY = 0;
|
||||||
|
//int cellDataIndexN = cellDataIndex - xIndex - 1;
|
||||||
int cellDataIndexN = cellDataIndex - 22;
|
int cellDataIndexN = cellDataIndex - 22;
|
||||||
int yniMin = yi - MAX_CONNECTION_RADIUS;
|
int yniMin = yi - MAX_CONNECTION_RADIUS;
|
||||||
int yniMax = yi + MAX_CONNECTION_RADIUS;
|
int yniMax = yi + MAX_CONNECTION_RADIUS;
|
||||||
@@ -304,7 +331,8 @@ public class PseudoErosionSampler implements NoiseSampler {
|
|||||||
|
|
||||||
cellDataIndex += 3;
|
cellDataIndex += 3;
|
||||||
}
|
}
|
||||||
cellDataIndex += 3;
|
cellDataIndex += yIndex;
|
||||||
|
//cellDataIndex += 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
return finalDistance;
|
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<double[]> context, int contextLayer, int contextRadius) {
|
||||||
// TODO
|
// TODO
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency);
|
return getNoiseRaw(seed + salt, x * frequency, y * frequency, context, contextLayer, contextRadius);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency);
|
return getNoiseRaw(seed + salt, x * frequency, y * frequency, z * frequency, context, contextLayer, contextRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generateContext(long seed, double x, double y, List<double[]> 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<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
//no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getContextRadius() {
|
||||||
|
return PRECOMPUTE_RADIUS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
-2
@@ -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.noise.NoiseSampler;
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class BrownianMotionSampler extends FractalNoiseFunction {
|
public class BrownianMotionSampler extends FractalNoiseFunction {
|
||||||
public BrownianMotionSampler(NoiseSampler input) {
|
public BrownianMotionSampler(NoiseSampler input) {
|
||||||
@@ -17,7 +19,7 @@ public class BrownianMotionSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
@@ -35,7 +37,7 @@ public class BrownianMotionSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -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.noise.NoiseSampler;
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class PingPongSampler extends FractalNoiseFunction {
|
public class PingPongSampler extends FractalNoiseFunction {
|
||||||
private double pingPongStrength = 2.0;
|
private double pingPongStrength = 2.0;
|
||||||
@@ -29,7 +31,7 @@ public class PingPongSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
@@ -47,7 +49,7 @@ public class PingPongSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -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.noise.NoiseSampler;
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class RidgedFractalSampler extends FractalNoiseFunction {
|
public class RidgedFractalSampler extends FractalNoiseFunction {
|
||||||
|
|
||||||
@@ -18,7 +20,7 @@ public class RidgedFractalSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
@@ -36,7 +38,7 @@ public class RidgedFractalSampler extends FractalNoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double sum = 0;
|
double sum = 0;
|
||||||
double amp = fractalBounding;
|
double amp = fractalBounding;
|
||||||
|
|
||||||
|
|||||||
+4
-2
@@ -9,6 +9,8 @@ package com.dfsek.terra.addons.noise.samplers.noise.random;
|
|||||||
|
|
||||||
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
|
import com.dfsek.terra.addons.noise.samplers.noise.NoiseFunction;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide random, normally distributed (Gaussian) noise.
|
* NoiseSampler implementation to provide random, normally distributed (Gaussian) noise.
|
||||||
@@ -21,7 +23,7 @@ public class GaussianNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double v1, v2, s;
|
double v1, v2, s;
|
||||||
do {
|
do {
|
||||||
v1 = whiteNoiseSampler.noise(seed++, x, y);
|
v1 = whiteNoiseSampler.noise(seed++, x, y);
|
||||||
@@ -33,7 +35,7 @@ public class GaussianNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
double v1, v2, s;
|
double v1, v2, s;
|
||||||
do {
|
do {
|
||||||
v1 = whiteNoiseSampler.noise(seed++, x, y, z);
|
v1 = whiteNoiseSampler.noise(seed++, x, y, z);
|
||||||
|
|||||||
+4
-2
@@ -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.addons.noise.samplers.noise.NoiseFunction;
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to produce random, uniformly distributed (white) noise.
|
* NoiseSampler implementation to produce random, uniformly distributed (white) noise.
|
||||||
@@ -40,12 +42,12 @@ public class WhiteNoiseSampler extends NoiseFunction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y) {
|
public double getNoiseRaw(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return (getNoiseUnmapped(seed, x, y) - 1.5) * 2;
|
return (getNoiseUnmapped(seed, x, y) - 1.5) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long seed, double x, double y, double z) {
|
public double getNoiseRaw(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2;
|
return (getNoiseUnmapped(seed, x, y, z) - 1.5) * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -7,13 +7,16 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise.
|
* NoiseSampler implementation to provide OpenSimplex2 (Smooth Variant) noise.
|
||||||
*/
|
*/
|
||||||
public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("NumericOverflow")
|
@SuppressWarnings("NumericOverflow")
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 2D OpenSimplex2S case is a modified 2D simplex noise.
|
// 2D OpenSimplex2S case is a modified 2D simplex noise.
|
||||||
|
|
||||||
@@ -121,7 +124,7 @@ public class OpenSimplex2SSampler extends SimplexStyleSampler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("NumericOverflow")
|
@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<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 3D OpenSimplex2S case uses two offset rotated cube grids.
|
// 3D OpenSimplex2S case uses two offset rotated cube grids.
|
||||||
final double R3 = (2.0 / 3.0);
|
final double R3 = (2.0 / 3.0);
|
||||||
|
|||||||
+5
-2
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide OpenSimplex2 noise.
|
* NoiseSampler implementation to provide OpenSimplex2 noise.
|
||||||
*/
|
*/
|
||||||
@@ -14,7 +17,7 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler {
|
|||||||
private static final double SQRT3 = 1.7320508075688772935274463415059;
|
private static final double SQRT3 = 1.7320508075688772935274463415059;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex.
|
// 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex.
|
||||||
final double G2 = (3 - SQRT3) / 6;
|
final double G2 = (3 - SQRT3) / 6;
|
||||||
@@ -75,7 +78,7 @@ public class OpenSimplex2Sampler extends SimplexStyleSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
// 3D OpenSimplex2Sampler case uses two offset rotated cube grids.
|
// 3D OpenSimplex2Sampler case uses two offset rotated cube grids.
|
||||||
final double R3 = (2.0 / 3.0);
|
final double R3 = (2.0 / 3.0);
|
||||||
|
|||||||
+4
-2
@@ -9,13 +9,15 @@ package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NoiseSampler implementation to provide Perlin Noise.
|
* NoiseSampler implementation to provide Perlin Noise.
|
||||||
*/
|
*/
|
||||||
public class PerlinSampler extends SimplexStyleSampler {
|
public class PerlinSampler extends SimplexStyleSampler {
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = (int) Math.floor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = (int) Math.floor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
@@ -40,7 +42,7 @@ public class PerlinSampler extends SimplexStyleSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = (int) Math.floor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = (int) Math.floor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
|
|||||||
+5
-2
@@ -7,6 +7,9 @@
|
|||||||
|
|
||||||
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
package com.dfsek.terra.addons.noise.samplers.noise.simplex;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class SimplexSampler extends SimplexStyleSampler {
|
public class SimplexSampler extends SimplexStyleSampler {
|
||||||
private static final Double2[] GRAD_2D = {
|
private static final Double2[] GRAD_2D = {
|
||||||
new Double2(-1, -1), new Double2(1, -1), new Double2(-1, 1), new Double2(1, 1),
|
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
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
double t = (x + y) * F2;
|
double t = (x + y) * F2;
|
||||||
int i = (int) Math.floor(x + t);
|
int i = (int) Math.floor(x + t);
|
||||||
@@ -115,7 +118,7 @@ public class SimplexSampler extends SimplexStyleSampler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
double t = (x + y + z) * F3;
|
double t = (x + y + z) * F3;
|
||||||
int i = (int) Math.floor(x + t);
|
int i = (int) Math.floor(x + t);
|
||||||
|
|||||||
+4
-2
@@ -9,10 +9,12 @@ package com.dfsek.terra.addons.noise.samplers.noise.value;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class ValueCubicSampler extends ValueStyleNoise {
|
public class ValueCubicSampler extends ValueStyleNoise {
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x1 = (int) Math.floor(x);
|
int x1 = (int) Math.floor(x);
|
||||||
int y1 = (int) Math.floor(y);
|
int y1 = (int) Math.floor(y);
|
||||||
@@ -42,7 +44,7 @@ public class ValueCubicSampler extends ValueStyleNoise {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x1 = (int) Math.floor(x);
|
int x1 = (int) Math.floor(x);
|
||||||
int y1 = (int) Math.floor(y);
|
int y1 = (int) Math.floor(y);
|
||||||
|
|||||||
+4
-2
@@ -9,10 +9,12 @@ package com.dfsek.terra.addons.noise.samplers.noise.value;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.util.MathUtil;
|
import com.dfsek.terra.api.util.MathUtil;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public class ValueSampler extends ValueStyleNoise {
|
public class ValueSampler extends ValueStyleNoise {
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y) {
|
public double getNoiseRaw(long sl, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = (int) Math.floor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = (int) Math.floor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
@@ -32,7 +34,7 @@ public class ValueSampler extends ValueStyleNoise {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getNoiseRaw(long sl, double x, double y, double z) {
|
public double getNoiseRaw(long sl, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
int seed = (int) sl;
|
int seed = (int) sl;
|
||||||
int x0 = (int) Math.floor(x);
|
int x0 = (int) Math.floor(x);
|
||||||
int y0 = (int) Math.floor(y);
|
int y0 = (int) Math.floor(y);
|
||||||
|
|||||||
@@ -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.Vector3;
|
||||||
import com.dfsek.terra.api.util.vector.Vector3Int;
|
import com.dfsek.terra.api.util.vector.Vector3Int;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
public interface NoiseSampler {
|
public interface NoiseSampler {
|
||||||
static NoiseSampler zero() {
|
static NoiseSampler zero() {
|
||||||
return new NoiseSampler() {
|
return new NoiseSampler() {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y) {
|
public double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double noise(long seed, double x, double y, double z) {
|
public double noise(long seed, double x, double y, double z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generateContext(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
//no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void generateContext(long seed, double x, double y, double z, List<double[]> context, int contextLayer,
|
||||||
|
int contextRadius) {
|
||||||
|
//no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getContextRadius() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -46,15 +68,76 @@ public interface NoiseSampler {
|
|||||||
return noise(seed, vector2.getX(), vector2.getZ());
|
return noise(seed, vector2.getX(), vector2.getZ());
|
||||||
}
|
}
|
||||||
|
|
||||||
double noise(long seed, double x, double y);
|
default double noise(Vector3 vector3, long seed, List<double[]> 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<double[]> 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<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
return noise(seed, vector2.getX(), vector2.getZ(), context, contextLayer, contextRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
default double noise(Vector2Int vector2, long seed, List<double[]> 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<double[]> 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) {
|
default double noise(long seed, int x, int y) {
|
||||||
return noise(seed, (double) x, 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<double[]> 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) {
|
default double noise(long seed, int x, int y, int z) {
|
||||||
return noise(seed, (double) x, y, z);
|
return noise(seed, (double) x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double noise(long seed, double x, double y, List<double[]> context, int contextLayer, int contextRadius);
|
||||||
|
|
||||||
|
default double noise(long seed, int x, int y, List<double[]> 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<double[]> context, int contextLayer, int contextRadius);
|
||||||
|
|
||||||
|
default double noise(long seed, int x, int y, int z, List<double[]> 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<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
//no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
default void generateContext(long seed, int x, int y, List<double[]> 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<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
//no-op
|
||||||
|
}
|
||||||
|
|
||||||
|
default void generateContext(long seed, int x, int y, int z, List<double[]> context, int contextLayer, int contextRadius) {
|
||||||
|
generateContext(seed, (double) x, y, z, context, contextLayer, contextRadius);
|
||||||
|
}
|
||||||
|
|
||||||
|
default int getContextRadius() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user