hytale-server/com/hypixel/hytale/builtin/hytalegenerator/fields/noise/CellNoiseField.java

122 lines
4.3 KiB
Java

package com.hypixel.hytale.builtin.hytalegenerator.fields.noise;
import com.hypixel.hytale.builtin.hytalegenerator.fields.FastNoiseLite;
import javax.annotation.Nonnull;
public class CellNoiseField extends NoiseField {
private FastNoiseLite cellNoise;
private int seed;
private boolean doDomainWarp;
private double scaleX;
private double scaleY;
private double scaleZ;
public CellNoiseField(
int seed,
double scaleX,
double scaleY,
double scaleZ,
double jitter,
int octaves,
@Nonnull FastNoiseLite.CellularReturnType cellType,
@Nonnull FastNoiseLite.DomainWarpType domainWarpType,
double warpAmount,
double warpScale
) {
if (octaves >= 1 && !(warpAmount <= 0.0) && !(warpScale <= 0.0)) {
this.seed = seed;
this.scaleX = scaleX;
this.scaleY = scaleY;
this.scaleZ = scaleZ;
this.cellNoise = new FastNoiseLite();
float frequency = 1.0F;
float warpFrequency = 1.0F / (float)warpScale;
this.doDomainWarp = true;
jitter *= 2.0;
this.cellNoise.setNoiseType(FastNoiseLite.NoiseType.Cellular);
this.cellNoise.setCellularReturnType(cellType);
this.cellNoise.setFractalOctaves(octaves);
this.cellNoise.setFractalType(FastNoiseLite.FractalType.FBm);
this.cellNoise.setCellularDistanceFunction(FastNoiseLite.CellularDistanceFunction.Euclidean);
this.cellNoise.setSeed(seed);
this.cellNoise.setFrequency(frequency);
this.cellNoise.setDomainWarpType(FastNoiseLite.DomainWarpType.OpenSimplex2);
this.cellNoise.setDomainWarpAmp((float)warpAmount);
this.cellNoise.setDomainWarpFreq(warpFrequency);
this.cellNoise.setCellularJitter((float)jitter);
} else {
throw new IllegalArgumentException();
}
}
public CellNoiseField(int seed, double scaleX, double scaleY, double scaleZ, double jitter, int octaves, @Nonnull FastNoiseLite.CellularReturnType cellType) {
if (octaves < 1) {
throw new IllegalArgumentException();
} else {
this.seed = seed;
this.scaleX = scaleX;
this.scaleY = scaleY;
this.scaleZ = scaleZ;
this.cellNoise = new FastNoiseLite();
float frequency = 1.0F;
this.doDomainWarp = false;
jitter *= 2.0;
this.cellNoise.setNoiseType(FastNoiseLite.NoiseType.Cellular);
this.cellNoise.setCellularReturnType(cellType);
this.cellNoise.setFractalOctaves(octaves);
this.cellNoise.setFractalType(FastNoiseLite.FractalType.FBm);
this.cellNoise.setCellularDistanceFunction(FastNoiseLite.CellularDistanceFunction.Euclidean);
this.cellNoise.setSeed(seed);
this.cellNoise.setFrequency(frequency);
this.cellNoise.setCellularJitter((float)jitter);
}
}
@Override
public double valueAt(double x, double y, double z, double w) {
x /= this.scaleX;
y /= this.scaleY;
z /= this.scaleZ;
if (this.doDomainWarp) {
FastNoiseLite.Vector3 point = new FastNoiseLite.Vector3((float)x, (float)y, (float)z);
this.cellNoise.DomainWarp(point);
return this.cellNoise.getNoise(point.x, point.y, point.z);
} else {
return this.cellNoise.getNoise(x, y, z);
}
}
@Override
public double valueAt(double x, double y, double z) {
x /= this.scaleX;
y /= this.scaleY;
z /= this.scaleZ;
if (this.doDomainWarp) {
FastNoiseLite.Vector3 point = new FastNoiseLite.Vector3((float)x, (float)y, (float)z);
this.cellNoise.DomainWarp(point);
return this.cellNoise.getNoise(point.x, point.y, point.z);
} else {
return this.cellNoise.getNoise(x, y, z);
}
}
@Override
public double valueAt(double x, double z) {
x /= this.scaleX;
z /= this.scaleZ;
if (this.doDomainWarp) {
FastNoiseLite.Vector2 point = new FastNoiseLite.Vector2((float)x, (float)z);
this.cellNoise.DomainWarp(point);
return this.cellNoise.getNoise(point.x, point.y);
} else {
return this.cellNoise.getNoise(x, z);
}
}
@Override
public double valueAt(double x) {
x /= this.scaleX;
return this.cellNoise.getNoise((float)x, 0.0);
}
}