80 lines
3.0 KiB
Java
80 lines
3.0 KiB
Java
|
package net.minecraft.world.level.levelgen.synth;
|
||
|
|
||
|
import it.unimi.dsi.fastutil.ints.IntRBTreeSet;
|
||
|
import it.unimi.dsi.fastutil.ints.IntSortedSet;
|
||
|
import java.util.List;
|
||
|
import net.minecraft.util.RandomSource;
|
||
|
import net.minecraft.world.level.levelgen.LegacyRandomSource;
|
||
|
import net.minecraft.world.level.levelgen.WorldgenRandom;
|
||
|
|
||
|
public class PerlinSimplexNoise {
|
||
|
private final SimplexNoise[] noiseLevels;
|
||
|
private final double highestFreqValueFactor;
|
||
|
private final double highestFreqInputFactor;
|
||
|
|
||
|
public PerlinSimplexNoise(RandomSource p_230546_, List<Integer> p_230547_) {
|
||
|
this(p_230546_, new IntRBTreeSet(p_230547_));
|
||
|
}
|
||
|
|
||
|
private PerlinSimplexNoise(RandomSource p_230543_, IntSortedSet p_230544_) {
|
||
|
if (p_230544_.isEmpty()) {
|
||
|
throw new IllegalArgumentException("Need some octaves!");
|
||
|
} else {
|
||
|
int i = -p_230544_.firstInt();
|
||
|
int j = p_230544_.lastInt();
|
||
|
int k = i + j + 1;
|
||
|
if (k < 1) {
|
||
|
throw new IllegalArgumentException("Total number of octaves needs to be >= 1");
|
||
|
} else {
|
||
|
SimplexNoise simplexnoise = new SimplexNoise(p_230543_);
|
||
|
int l = j;
|
||
|
this.noiseLevels = new SimplexNoise[k];
|
||
|
if (j >= 0 && j < k && p_230544_.contains(0)) {
|
||
|
this.noiseLevels[j] = simplexnoise;
|
||
|
}
|
||
|
|
||
|
for (int i1 = j + 1; i1 < k; i1++) {
|
||
|
if (i1 >= 0 && p_230544_.contains(l - i1)) {
|
||
|
this.noiseLevels[i1] = new SimplexNoise(p_230543_);
|
||
|
} else {
|
||
|
p_230543_.consumeCount(262);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (j > 0) {
|
||
|
long k1 = (long)(simplexnoise.getValue(simplexnoise.xo, simplexnoise.yo, simplexnoise.zo) * 9.223372E18F);
|
||
|
RandomSource randomsource = new WorldgenRandom(new LegacyRandomSource(k1));
|
||
|
|
||
|
for (int j1 = l - 1; j1 >= 0; j1--) {
|
||
|
if (j1 < k && p_230544_.contains(l - j1)) {
|
||
|
this.noiseLevels[j1] = new SimplexNoise(randomsource);
|
||
|
} else {
|
||
|
randomsource.consumeCount(262);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.highestFreqInputFactor = Math.pow(2.0, j);
|
||
|
this.highestFreqValueFactor = 1.0 / (Math.pow(2.0, k) - 1.0);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public double getValue(double p_75450_, double p_75451_, boolean p_75452_) {
|
||
|
double d0 = 0.0;
|
||
|
double d1 = this.highestFreqInputFactor;
|
||
|
double d2 = this.highestFreqValueFactor;
|
||
|
|
||
|
for (SimplexNoise simplexnoise : this.noiseLevels) {
|
||
|
if (simplexnoise != null) {
|
||
|
d0 += simplexnoise.getValue(p_75450_ * d1 + (p_75452_ ? simplexnoise.xo : 0.0), p_75451_ * d1 + (p_75452_ ? simplexnoise.yo : 0.0))
|
||
|
* d2;
|
||
|
}
|
||
|
|
||
|
d1 /= 2.0;
|
||
|
d2 *= 2.0;
|
||
|
}
|
||
|
|
||
|
return d0;
|
||
|
}
|
||
|
}
|