111 lines
3.3 KiB
Java
111 lines
3.3 KiB
Java
package com.hypixel.hytale.procedurallib.condition;
|
|
|
|
import java.util.Arrays;
|
|
import javax.annotation.Nonnull;
|
|
|
|
public class BasicHeightThresholdInterpreter implements IHeightThresholdInterpreter {
|
|
@Nonnull
|
|
protected final float[] interpolatedThresholds;
|
|
protected final int lowestNonOne;
|
|
protected final int highestNonZero;
|
|
|
|
public BasicHeightThresholdInterpreter(@Nonnull int[] positions, @Nonnull float[] thresholds, int length) {
|
|
if (positions.length != thresholds.length) {
|
|
throw new IllegalArgumentException(String.format("Mismatching array lengths! positions: %s, thresholds: %s", positions.length, thresholds.length));
|
|
} else {
|
|
this.interpolatedThresholds = new float[length];
|
|
|
|
for (int y = 0; y < this.interpolatedThresholds.length; y++) {
|
|
float threshold = thresholds[thresholds.length - 1];
|
|
|
|
for (int i = 0; i < positions.length; i++) {
|
|
if (y < positions[i]) {
|
|
if (i == 0) {
|
|
threshold = thresholds[i];
|
|
} else {
|
|
float distance = (float)(y - positions[i - 1]) / (positions[i] - positions[i - 1]);
|
|
threshold = IHeightThresholdInterpreter.lerp(thresholds[i - 1], thresholds[i], distance);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
this.interpolatedThresholds[y] = threshold;
|
|
}
|
|
|
|
int lowestNonOne = 0;
|
|
|
|
while (lowestNonOne < length && !(this.interpolatedThresholds[lowestNonOne] < 1.0F)) {
|
|
lowestNonOne++;
|
|
}
|
|
|
|
this.lowestNonOne = lowestNonOne;
|
|
int highestNonZero = length - 1;
|
|
|
|
while (highestNonZero >= 0 && !(this.interpolatedThresholds[highestNonZero] > 0.0F)) {
|
|
highestNonZero--;
|
|
}
|
|
|
|
this.highestNonZero = highestNonZero;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getLowestNonOne() {
|
|
return this.lowestNonOne;
|
|
}
|
|
|
|
@Override
|
|
public int getHighestNonZero() {
|
|
return this.highestNonZero;
|
|
}
|
|
|
|
@Override
|
|
public double getContext(int seed, double x, double y) {
|
|
return 0.0;
|
|
}
|
|
|
|
@Override
|
|
public int getLength() {
|
|
return this.interpolatedThresholds.length;
|
|
}
|
|
|
|
@Override
|
|
public float getThreshold(int seed, double x, double y, int height) {
|
|
return this.getThreshold(seed, x, y, height, this.getContext(seed, x, y));
|
|
}
|
|
|
|
@Override
|
|
public float getThreshold(int seed, double x, double y, int height, double context) {
|
|
if (height > this.highestNonZero) {
|
|
return 0.0F;
|
|
} else {
|
|
if (height < 0) {
|
|
height = 0;
|
|
}
|
|
|
|
if (height >= this.interpolatedThresholds.length) {
|
|
height = this.interpolatedThresholds.length - 1;
|
|
}
|
|
|
|
return this.interpolatedThresholds[height];
|
|
}
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "BasicHeightThresholdInterpreter{interpolatedThresholds="
|
|
+ Arrays.toString(this.interpolatedThresholds)
|
|
+ ", lowestNonOne="
|
|
+ this.lowestNonOne
|
|
+ ", highestNonZero="
|
|
+ this.highestNonZero
|
|
+ "}";
|
|
}
|
|
|
|
public interface Constants {
|
|
String ERROR_ARRAY_LENGTH = "Mismatching array lengths! positions: %s, thresholds: %s";
|
|
}
|
|
}
|