mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-20 03:04:08 +00:00
78 lines
1.5 KiB
Java
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;
|
|
}
|
|
}
|