fix domain warp frequency issue

This commit is contained in:
dfsek
2021-01-25 11:12:20 -07:00
parent dca0891e00
commit 89f52a22c8
4 changed files with 89 additions and 96 deletions
@@ -637,6 +637,21 @@ public class FastNoiseLite implements NoiseSampler {
*/ */
@Override @Override
public double getNoise(double x, double y) { public double getNoise(double x, double y) {
return getNoiseSeeded(mSeed, x, y);
}
/**
* 3D noise at given position using current settings
* <p>
* Noise output bounded between -1...1
*/
@Override
public double getNoise(double x, double y, double z) {
return getNoiseSeeded(mSeed, x, y, z);
}
@Override
public double getNoiseSeeded(int seed, double x, double y) {
if(!mDomainWarpType.equals(DomainWarpType.None)) { if(!mDomainWarpType.equals(DomainWarpType.None)) {
Vector2 dWarp = new Vector2(x, y); Vector2 dWarp = new Vector2(x, y);
domainWarp(dWarp); domainWarp(dWarp);
@@ -664,23 +679,18 @@ public class FastNoiseLite implements NoiseSampler {
switch(mFractalType) { switch(mFractalType) {
default: default:
return getNoiseSeeded(mSeed, x, y); return getNoiseRaw(seed, x, y);
case FBm: case FBm:
return genFractalFBm(x, y); return genFractalFBm(seed, x, y);
case Ridged: case Ridged:
return genFractalRidged(x, y); return genFractalRidged(seed, x, y);
case PingPong: case PingPong:
return genFractalPingPong(x, y); return genFractalPingPong(seed, x, y);
} }
} }
/**
* 3D noise at given position using current settings
* <p>
* Noise output bounded between -1...1
*/
@Override @Override
public double getNoise(double x, double y, double z) { public double getNoiseSeeded(int seed, double x, double y, double z) {
if(!mDomainWarpType.equals(DomainWarpType.None)) { if(!mDomainWarpType.equals(DomainWarpType.None)) {
Vector3 dWarp = new Vector3(x, y, z); Vector3 dWarp = new Vector3(x, y, z);
domainWarp(dWarp); domainWarp(dWarp);
@@ -736,60 +746,17 @@ public class FastNoiseLite implements NoiseSampler {
switch(mFractalType) { switch(mFractalType) {
default: default:
return getNoiseSeeded(mSeed, x, y, z); return getNoiseRaw(seed, x, y, z);
case FBm: case FBm:
return genFractalFBm(x, y, z); return genFractalFBm(seed, x, y, z);
case Ridged: case Ridged:
return genFractalRidged(x, y, z); return genFractalRidged(seed, x, y, z);
case PingPong: case PingPong:
return genFractalPingPong(x, y, z); return genFractalPingPong(seed, x, y, z);
} }
} }
/** public double getNoiseRaw(int seed, double x, double y) {
* 2D warps the input position using current domain warp settings
* <p>
* Example usage with GetNoise
* <code>DomainWarp(coord)
* noise = GetNoise(x, y)</code>
*/
public void domainWarp(Vector2 coord) {
switch(mFractalType) {
default:
domainWarpSingle(coord);
break;
case DomainWarpProgressive:
domainWarpFractalProgressive(coord);
break;
case DomainWarpIndependent:
domainWarpFractalIndependent(coord);
break;
}
}
/**
* 3D warps the input position using current domain warp settings
* <p>
* Example usage with GetNoise
* <code>DomainWarp(coord)
* noise = GetNoise(x, y, z)</code>
*/
public void domainWarp(Vector3 coord) {
switch(mFractalType) {
default:
domainWarpSingle(coord);
break;
case DomainWarpProgressive:
domainWarpFractalProgressive(coord);
break;
case DomainWarpIndependent:
domainWarpFractalIndependent(coord);
break;
}
}
@Override
public double getNoiseSeeded(int seed, double x, double y) {
switch(mNoiseType) { switch(mNoiseType) {
case OpenSimplex2: case OpenSimplex2:
return singleSimplex(seed, x, y); return singleSimplex(seed, x, y);
@@ -810,8 +777,7 @@ public class FastNoiseLite implements NoiseSampler {
} }
} }
@Override public double getNoiseRaw(int seed, double x, double y, double z) {
public double getNoiseSeeded(int seed, double x, double y, double z) {
switch(mNoiseType) { switch(mNoiseType) {
case OpenSimplex2: case OpenSimplex2:
return singleOpenSimplex2(seed, x, y, z); return singleOpenSimplex2(seed, x, y, z);
@@ -832,13 +798,54 @@ public class FastNoiseLite implements NoiseSampler {
} }
} }
private double genFractalFBm(double x, double y) { /**
int seed = mSeed; * 2D warps the input position using current domain warp settings
* <p>
* Example usage with GetNoise
* <code>DomainWarp(coord)
* noise = GetNoise(x, y)</code>
*/
public void domainWarp(Vector2 coord) {
switch(mFractalType) {
default:
domainWarpSingle(mSeed, coord);
break;
case DomainWarpProgressive:
domainWarpFractalProgressive(mSeed, coord);
break;
case DomainWarpIndependent:
domainWarpFractalIndependent(mSeed, coord);
break;
}
}
/**
* 3D warps the input position using current domain warp settings
* <p>
* Example usage with GetNoise
* <code>DomainWarp(coord)
* noise = GetNoise(x, y, z)</code>
*/
public void domainWarp(Vector3 coord) {
switch(mFractalType) {
default:
domainWarpSingle(mSeed, coord);
break;
case DomainWarpProgressive:
domainWarpFractalProgressive(mSeed, coord);
break;
case DomainWarpIndependent:
domainWarpFractalIndependent(mSeed, coord);
break;
}
}
private double genFractalFBm(int seed, double x, double y) {
double sum = 0; double sum = 0;
double amp = mFractalBounding; double amp = mFractalBounding;
for(int i = 0; i < mOctaves; i++) { for(int i = 0; i < mOctaves; i++) {
double noise = getNoiseSeeded(seed++, x, y); double noise = getNoiseRaw(seed++, x, y);
sum += noise * amp; sum += noise * amp;
amp *= lerp(1.0, fastMin(noise + 1, 2) * 0.5, mWeightedStrength); amp *= lerp(1.0, fastMin(noise + 1, 2) * 0.5, mWeightedStrength);
@@ -850,13 +857,12 @@ public class FastNoiseLite implements NoiseSampler {
return sum; return sum;
} }
private double genFractalFBm(double x, double y, double z) { private double genFractalFBm(int seed, double x, double y, double z) {
int seed = mSeed;
double sum = 0; double sum = 0;
double amp = mFractalBounding; double amp = mFractalBounding;
for(int i = 0; i < mOctaves; i++) { for(int i = 0; i < mOctaves; i++) {
double noise = getNoiseSeeded(seed++, x, y, z); double noise = getNoiseRaw(seed++, x, y, z);
sum += noise * amp; sum += noise * amp;
amp *= lerp(1.0, (noise + 1) * 0.5, mWeightedStrength); amp *= lerp(1.0, (noise + 1) * 0.5, mWeightedStrength);
@@ -869,13 +875,12 @@ public class FastNoiseLite implements NoiseSampler {
return sum; return sum;
} }
private double genFractalRidged(double x, double y) { private double genFractalRidged(int seed, double x, double y) {
int seed = mSeed;
double sum = 0; double sum = 0;
double amp = mFractalBounding; double amp = mFractalBounding;
for(int i = 0; i < mOctaves; i++) { for(int i = 0; i < mOctaves; i++) {
double noise = fastAbs(getNoiseSeeded(seed++, x, y)); double noise = fastAbs(getNoiseRaw(seed++, x, y));
sum += (noise * -2 + 1) * amp; sum += (noise * -2 + 1) * amp;
amp *= lerp(1.0, 1 - noise, mWeightedStrength); amp *= lerp(1.0, 1 - noise, mWeightedStrength);
@@ -888,13 +893,12 @@ public class FastNoiseLite implements NoiseSampler {
} }
// Generic noise gen // Generic noise gen
private double genFractalRidged(double x, double y, double z) { private double genFractalRidged(int seed, double x, double y, double z) {
int seed = mSeed;
double sum = 0; double sum = 0;
double amp = mFractalBounding; double amp = mFractalBounding;
for(int i = 0; i < mOctaves; i++) { for(int i = 0; i < mOctaves; i++) {
double noise = fastAbs(getNoiseSeeded(seed++, x, y, z)); double noise = fastAbs(getNoiseRaw(seed++, x, y, z));
sum += (noise * -2 + 1) * amp; sum += (noise * -2 + 1) * amp;
amp *= lerp(1.0, 1 - noise, mWeightedStrength); amp *= lerp(1.0, 1 - noise, mWeightedStrength);
@@ -907,13 +911,12 @@ public class FastNoiseLite implements NoiseSampler {
return sum; return sum;
} }
private double genFractalPingPong(double x, double y) { private double genFractalPingPong(int seed, double x, double y) {
int seed = mSeed;
double sum = 0; double sum = 0;
double amp = mFractalBounding; double amp = mFractalBounding;
for(int i = 0; i < mOctaves; i++) { for(int i = 0; i < mOctaves; i++) {
double noise = pingPong((getNoiseSeeded(seed++, x, y) + 1) * mPingPongStrength); double noise = pingPong((getNoiseRaw(seed++, x, y) + 1) * mPingPongStrength);
sum += (noise - 0.5) * 2 * amp; sum += (noise - 0.5) * 2 * amp;
amp *= lerp(1.0, noise, mWeightedStrength); amp *= lerp(1.0, noise, mWeightedStrength);
@@ -926,13 +929,12 @@ public class FastNoiseLite implements NoiseSampler {
} }
// Noise Coordinate Transforms (frequency, and possible skew or rotation) // Noise Coordinate Transforms (frequency, and possible skew or rotation)
private double genFractalPingPong(double x, double y, double z) { private double genFractalPingPong(int seed, double x, double y, double z) {
int seed = mSeed;
double sum = 0; double sum = 0;
double amp = mFractalBounding; double amp = mFractalBounding;
for(int i = 0; i < mOctaves; i++) { for(int i = 0; i < mOctaves; i++) {
double noise = pingPong((getNoiseSeeded(seed++, x, y, z) + 1) * mPingPongStrength); double noise = pingPong((getNoiseRaw(seed++, x, y, z) + 1) * mPingPongStrength);
sum += (noise - 0.5) * 2 * amp; sum += (noise - 0.5) * 2 * amp;
amp *= lerp(1.0, noise, mWeightedStrength); amp *= lerp(1.0, noise, mWeightedStrength);
@@ -1919,23 +1921,17 @@ public class FastNoiseLite implements NoiseSampler {
} }
private void singleFunctionDomainWarp(int seed, double amp, double x, double y, double freq, Vector2 coord) { private void singleFunctionDomainWarp(int seed, double amp, double x, double y, double freq, Vector2 coord) {
x *= freq;
y *= freq;
coord.add(domainWarpFunction.getNoiseSeeded(seed + 1, x, y) * amp, coord.add(domainWarpFunction.getNoiseSeeded(seed + 1, x, y) * amp,
domainWarpFunction.getNoiseSeeded(seed + 2, x, y) * amp); domainWarpFunction.getNoiseSeeded(seed + 2, x, y) * amp);
} }
private void singleFunctionDomainWarp(int seed, double amp, double x, double y, double z, double freq, Vector3 coord) { private void singleFunctionDomainWarp(int seed, double amp, double x, double y, double z, double freq, Vector3 coord) {
x *= freq;
y *= freq;
z *= freq;
coord.add(domainWarpFunction.getNoiseSeeded(seed + 1, x, y, z) * amp, coord.add(domainWarpFunction.getNoiseSeeded(seed + 1, x, y, z) * amp,
domainWarpFunction.getNoiseSeeded(seed + 3, x, y, z) * amp, domainWarpFunction.getNoiseSeeded(seed + 3, x, y, z) * amp,
domainWarpFunction.getNoiseSeeded(seed + 2, x, y, z) * amp); domainWarpFunction.getNoiseSeeded(seed + 2, x, y, z) * amp);
} }
private void domainWarpSingle(Vector2 coord) { private void domainWarpSingle(int seed, Vector2 coord) {
int seed = mSeed;
double amp = mDomainWarpAmp * mFractalBounding; double amp = mDomainWarpAmp * mFractalBounding;
double freq = mFrequency; double freq = mFrequency;
@@ -1963,8 +1959,7 @@ public class FastNoiseLite implements NoiseSampler {
} }
// Value Cubic Noise // Value Cubic Noise
private void domainWarpSingle(Vector3 coord) { private void domainWarpSingle(int seed, Vector3 coord) {
int seed = mSeed;
double amp = mDomainWarpAmp * mFractalBounding; double amp = mDomainWarpAmp * mFractalBounding;
double freq = mFrequency; double freq = mFrequency;
@@ -2018,8 +2013,7 @@ public class FastNoiseLite implements NoiseSampler {
doSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); doSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord);
} }
private void domainWarpFractalProgressive(Vector2 coord) { private void domainWarpFractalProgressive(int seed, Vector2 coord) {
int seed = mSeed;
double amp = mDomainWarpAmp * mFractalBounding; double amp = mDomainWarpAmp * mFractalBounding;
double freq = mFrequency; double freq = mFrequency;
@@ -2053,8 +2047,7 @@ public class FastNoiseLite implements NoiseSampler {
} }
// Value Noise // Value Noise
private void domainWarpFractalProgressive(Vector3 coord) { private void domainWarpFractalProgressive(int seed, Vector3 coord) {
int seed = mSeed;
double amp = mDomainWarpAmp * mFractalBounding; double amp = mDomainWarpAmp * mFractalBounding;
double freq = mFrequency; double freq = mFrequency;
@@ -2115,7 +2108,7 @@ public class FastNoiseLite implements NoiseSampler {
} }
// Domain Warp Fractal Independant // Domain Warp Fractal Independant
private void domainWarpFractalIndependent(Vector2 coord) { private void domainWarpFractalIndependent(int seed, Vector2 coord) {
double xs = coord.getX(); double xs = coord.getX();
@@ -2136,7 +2129,6 @@ public class FastNoiseLite implements NoiseSampler {
break; break;
} }
int seed = mSeed;
double amp = mDomainWarpAmp * mFractalBounding; double amp = mDomainWarpAmp * mFractalBounding;
double freq = mFrequency; double freq = mFrequency;
@@ -2150,7 +2142,7 @@ public class FastNoiseLite implements NoiseSampler {
} }
// Domain Warp // Domain Warp
private void domainWarpFractalIndependent(Vector3 coord) { private void domainWarpFractalIndependent(int seed, Vector3 coord) {
double xs = coord.getX(); double xs = coord.getX();
@@ -2198,7 +2190,6 @@ public class FastNoiseLite implements NoiseSampler {
break; break;
} }
int seed = mSeed;
double amp = mDomainWarpAmp * mFractalBounding; double amp = mDomainWarpAmp * mFractalBounding;
double freq = mFrequency; double freq = mFrequency;
@@ -28,6 +28,7 @@ public class ProbabilityCollectionLoader implements TypeLoader<ProbabilityCollec
List<Map<Object, Integer>> map = (List<Map<Object, Integer>>) o; List<Map<Object, Integer>> map = (List<Map<Object, Integer>>) o;
for(Map<Object, Integer> l : map) { for(Map<Object, Integer> l : map) {
for(Map.Entry<Object, Integer> entry : l.entrySet()) { for(Map.Entry<Object, Integer> entry : l.entrySet()) {
if(entry.getValue() == null) throw new LoadException("No probability defined for entry \"" + entry.getKey() + "\"");
Object val = configLoader.loadType(generic, entry.getKey()); Object val = configLoader.loadType(generic, entry.getKey());
collection.add(val, entry.getValue()); collection.add(val, entry.getValue());
} }
@@ -41,6 +41,7 @@ public class SelfProbabilityCollectionLoader<T> implements TypeLoader<Probabilit
private void addItems(ConfigLoader loader, ProbabilityCollection<T> collection, Type generic, Map<Object, Integer> l) throws LoadException { private void addItems(ConfigLoader loader, ProbabilityCollection<T> collection, Type generic, Map<Object, Integer> l) throws LoadException {
for(Map.Entry<Object, Integer> entry : l.entrySet()) { for(Map.Entry<Object, Integer> entry : l.entrySet()) {
if(entry.getValue() == null) throw new LoadException("No probability defined for entry \"" + entry.getKey() + "\"");
if(entry.getKey().toString().equals("SELF")) { if(entry.getKey().toString().equals("SELF")) {
collection.add(null, entry.getValue()); // hmm maybe replace this with something better later collection.add(null, entry.getValue()); // hmm maybe replace this with something better later
continue; continue;
@@ -68,7 +68,7 @@ public class NoiseBuilder implements ConfigTemplate {
@Value("domain-warp.function") @Value("domain-warp.function")
@Default @Default
private NoiseBuilder domainWarp = null; private NoiseBuilder domainWarp;
@Value("rotation-type") @Value("rotation-type")
@Default @Default