Iris/src/main/java/com/volmit/iris/noise/PerlinNoise.java
2020-09-02 21:06:01 -04:00

78 lines
1.5 KiB
Java

package com.volmit.iris.noise;
import com.volmit.iris.util.RNG;
public class PerlinNoise implements NoiseGenerator, OctaveNoise {
private final FastNoise n;
private int octaves;
public PerlinNoise(long seed) {
this.n = new FastNoise(new RNG(seed).imax());
n.setNoiseType(FastNoise.NoiseType.Perlin);
octaves = 1;
}
public double f(double v) {
return (v / 2D) + 0.5D;
}
@Override
public double noise(double x) {
if (octaves <= 1) {
return f(n.GetPerlin((float) x, 0f));
}
double f = 1;
double m = 0;
double v = 0;
for (int i = 0; i < octaves; i++) {
v += n.GetPerlin((float) (x * (f == 1 ? f++ : (f *= 2))), 0f) * f;
m += f;
}
return f(v / m);
}
@Override
public double noise(double x, double z) {
if (octaves <= 1) {
return f(n.GetPerlin((float) x, (float) z));
}
double f = 1;
double m = 0;
double v = 0;
for (int i = 0; i < octaves; i++) {
f = f == 1 ? f + 1 : f * 2;
v += n.GetPerlin((float) (x * f), (float) (z * f)) * f;
m += f;
}
return f(v / m);
}
@Override
public double noise(double x, double y, double z) {
if (octaves <= 1) {
return f(n.GetPerlin((float) x, (float) y, (float) z));
}
double f = 1;
double m = 0;
double v = 0;
for (int i = 0; i < octaves; i++) {
f = f == 1 ? f + 1 : f * 2;
v += n.GetPerlin((float) (x * f), (float) (y * f), (float) (z * f)) * f;
m += f;
}
return f(v / m);
}
@Override
public void setOctaves(int o) {
octaves = o;
}
}