165 lines
5.4 KiB
Java
165 lines
5.4 KiB
Java
package com.hypixel.hytale.procedurallib.logic;
|
|
|
|
import com.hypixel.hytale.procedurallib.NoiseFunction;
|
|
import com.hypixel.hytale.procedurallib.logic.cell.CellDistanceFunction;
|
|
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.PointEvaluator;
|
|
import javax.annotation.Nonnull;
|
|
|
|
public abstract class DistanceNoise implements NoiseFunction {
|
|
protected final CellDistanceFunction cellDistanceFunction;
|
|
protected final PointEvaluator pointEvaluator;
|
|
protected final DistanceNoise.Distance2Function distance2Function;
|
|
|
|
public DistanceNoise(CellDistanceFunction cellDistanceFunction, PointEvaluator pointEvaluator, DistanceNoise.Distance2Function distance2Function) {
|
|
this.cellDistanceFunction = cellDistanceFunction;
|
|
this.pointEvaluator = pointEvaluator;
|
|
this.distance2Function = distance2Function;
|
|
}
|
|
|
|
public CellDistanceFunction getCellDistanceFunction() {
|
|
return this.cellDistanceFunction;
|
|
}
|
|
|
|
public DistanceNoise.Distance2Function getDistance2Function() {
|
|
return this.distance2Function;
|
|
}
|
|
|
|
@Override
|
|
public double get(int seed, int offsetSeed, double x, double y) {
|
|
x = this.cellDistanceFunction.scale(x);
|
|
y = this.cellDistanceFunction.scale(y);
|
|
int xr = this.cellDistanceFunction.getCellX(x, y);
|
|
int yr = this.cellDistanceFunction.getCellY(x, y);
|
|
ResultBuffer.ResultBuffer2d buffer = this.localBuffer2d();
|
|
buffer.distance = Double.POSITIVE_INFINITY;
|
|
buffer.distance2 = Double.POSITIVE_INFINITY;
|
|
this.cellDistanceFunction.transition2D(offsetSeed, x, y, xr, yr, buffer, this.pointEvaluator);
|
|
buffer.distance = Math.sqrt(buffer.distance);
|
|
buffer.distance2 = Math.sqrt(buffer.distance2);
|
|
return GeneralNoise.limit(this.distance2Function.eval(buffer.distance, buffer.distance2)) * 2.0 - 1.0;
|
|
}
|
|
|
|
@Override
|
|
public double get(int seed, int offsetSeed, double x, double y, double z) {
|
|
x = this.cellDistanceFunction.scale(x);
|
|
y = this.cellDistanceFunction.scale(y);
|
|
z = this.cellDistanceFunction.scale(z);
|
|
int xr = this.cellDistanceFunction.getCellX(x, y, z);
|
|
int yr = this.cellDistanceFunction.getCellY(x, y, z);
|
|
int zr = this.cellDistanceFunction.getCellZ(x, y, z);
|
|
ResultBuffer.ResultBuffer3d buffer = this.localBuffer3d();
|
|
buffer.distance = Double.POSITIVE_INFINITY;
|
|
buffer.distance2 = Double.POSITIVE_INFINITY;
|
|
this.cellDistanceFunction.transition3D(offsetSeed, x, y, z, xr, yr, zr, buffer, this.pointEvaluator);
|
|
buffer.distance = Math.sqrt(buffer.distance);
|
|
buffer.distance2 = Math.sqrt(buffer.distance2);
|
|
return GeneralNoise.limit(this.distance2Function.eval(buffer.distance, buffer.distance2)) * 2.0 - 1.0;
|
|
}
|
|
|
|
protected abstract ResultBuffer.ResultBuffer2d localBuffer2d();
|
|
|
|
protected abstract ResultBuffer.ResultBuffer3d localBuffer3d();
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "DistanceNoise{cellDistanceFunction="
|
|
+ this.cellDistanceFunction
|
|
+ ", pointEvaluator="
|
|
+ this.pointEvaluator
|
|
+ ", distance2Function="
|
|
+ this.distance2Function
|
|
+ "}";
|
|
}
|
|
|
|
@FunctionalInterface
|
|
public interface Distance2Function {
|
|
double eval(double var1, double var3);
|
|
}
|
|
|
|
public static enum Distance2Mode {
|
|
ADD(new DistanceNoise.Distance2Function() {
|
|
@Override
|
|
public double eval(double distance, double distance2) {
|
|
return distance + distance2;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "AddDistance2Function{}";
|
|
}
|
|
}),
|
|
SUB(new DistanceNoise.Distance2Function() {
|
|
@Override
|
|
public double eval(double distance, double distance2) {
|
|
return distance2 - distance;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "SubDistance2Function{}";
|
|
}
|
|
}),
|
|
MUL(new DistanceNoise.Distance2Function() {
|
|
@Override
|
|
public double eval(double distance, double distance2) {
|
|
return distance * distance2;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "MulDistance2Function{}";
|
|
}
|
|
}),
|
|
DIV(new DistanceNoise.Distance2Function() {
|
|
@Override
|
|
public double eval(double distance, double distance2) {
|
|
return distance / distance2;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "DivDistance2Function{}";
|
|
}
|
|
}),
|
|
MIN(new DistanceNoise.Distance2Function() {
|
|
@Override
|
|
public double eval(double distance, double distance2) {
|
|
return distance;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "MinDistance2Function{}";
|
|
}
|
|
}),
|
|
MAX(new DistanceNoise.Distance2Function() {
|
|
@Override
|
|
public double eval(double distance, double distance2) {
|
|
return distance2;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "MaxDistance2Function{}";
|
|
}
|
|
});
|
|
|
|
private final DistanceNoise.Distance2Function function;
|
|
|
|
private Distance2Mode(DistanceNoise.Distance2Function function) {
|
|
this.function = function;
|
|
}
|
|
|
|
public DistanceNoise.Distance2Function getFunction() {
|
|
return this.function;
|
|
}
|
|
}
|
|
}
|