682 lines
24 KiB
Java
682 lines
24 KiB
Java
package com.hypixel.hytale.procedurallib.logic;
|
|
|
|
import com.hypixel.hytale.procedurallib.NoiseFunction;
|
|
import javax.annotation.Nonnull;
|
|
|
|
public class OldSimplexNoise implements NoiseFunction {
|
|
public static final OldSimplexNoise INSTANCE = new OldSimplexNoise();
|
|
private static final double STRETCH_CONSTANT_2D = -0.211324865405187;
|
|
private static final double SQUISH_CONSTANT_2D = 0.366025403784439;
|
|
private static final double STRETCH_CONSTANT_3D = -0.16666666666666666;
|
|
private static final double SQUISH_CONSTANT_3D = 0.3333333333333333;
|
|
private static final double NORM_CONSTANT_2D = 47.0;
|
|
private static final double NORM_CONSTANT_3D = 103.0;
|
|
@Nonnull
|
|
private static DoubleArray.Double2[] gradients2D = new DoubleArray.Double2[]{
|
|
new DoubleArray.Double2(5.0, 2.0),
|
|
new DoubleArray.Double2(2.0, 5.0),
|
|
new DoubleArray.Double2(-5.0, 2.0),
|
|
new DoubleArray.Double2(-2.0, 5.0),
|
|
new DoubleArray.Double2(5.0, -2.0),
|
|
new DoubleArray.Double2(2.0, -5.0),
|
|
new DoubleArray.Double2(-5.0, -2.0),
|
|
new DoubleArray.Double2(-2.0, -5.0)
|
|
};
|
|
@Nonnull
|
|
private static DoubleArray.Double3[] gradients3D = new DoubleArray.Double3[]{
|
|
new DoubleArray.Double3(-11.0, 4.0, 4.0),
|
|
new DoubleArray.Double3(-4.0, 11.0, 4.0),
|
|
new DoubleArray.Double3(-4.0, 4.0, 11.0),
|
|
new DoubleArray.Double3(11.0, 4.0, 4.0),
|
|
new DoubleArray.Double3(4.0, 11.0, 4.0),
|
|
new DoubleArray.Double3(4.0, 4.0, 11.0),
|
|
new DoubleArray.Double3(-11.0, -4.0, 4.0),
|
|
new DoubleArray.Double3(-4.0, -11.0, 4.0),
|
|
new DoubleArray.Double3(-4.0, -4.0, 11.0),
|
|
new DoubleArray.Double3(11.0, -4.0, 4.0),
|
|
new DoubleArray.Double3(4.0, -11.0, 4.0),
|
|
new DoubleArray.Double3(4.0, -4.0, 11.0),
|
|
new DoubleArray.Double3(-11.0, 4.0, -4.0),
|
|
new DoubleArray.Double3(-4.0, 11.0, -4.0),
|
|
new DoubleArray.Double3(-4.0, 4.0, -11.0),
|
|
new DoubleArray.Double3(11.0, 4.0, -4.0),
|
|
new DoubleArray.Double3(4.0, 11.0, -4.0),
|
|
new DoubleArray.Double3(4.0, 4.0, -11.0),
|
|
new DoubleArray.Double3(-11.0, -4.0, -4.0),
|
|
new DoubleArray.Double3(-4.0, -11.0, -4.0),
|
|
new DoubleArray.Double3(-4.0, -4.0, -11.0),
|
|
new DoubleArray.Double3(11.0, -4.0, -4.0),
|
|
new DoubleArray.Double3(4.0, -11.0, -4.0),
|
|
new DoubleArray.Double3(4.0, -4.0, -11.0)
|
|
};
|
|
|
|
private OldSimplexNoise() {
|
|
}
|
|
|
|
@Override
|
|
public double get(int seed, int offsetSeed, double x, double y) {
|
|
double stretchOffset = (x + y) * -0.211324865405187;
|
|
double xs = x + stretchOffset;
|
|
double ys = y + stretchOffset;
|
|
int xsb = fastFloor(xs);
|
|
int ysb = fastFloor(ys);
|
|
double squishOffset = (xsb + ysb) * 0.366025403784439;
|
|
double xb = xsb + squishOffset;
|
|
double yb = ysb + squishOffset;
|
|
double xins = xs - xsb;
|
|
double yins = ys - ysb;
|
|
double inSum = xins + yins;
|
|
double dx0 = x - xb;
|
|
double dy0 = y - yb;
|
|
double value = 0.0;
|
|
double dx1 = dx0 - 1.0 - 0.366025403784439;
|
|
double dy1 = dy0 - 0.0 - 0.366025403784439;
|
|
double attn1 = 2.0 - dx1 * dx1 - dy1 * dy1;
|
|
if (attn1 > 0.0) {
|
|
attn1 *= attn1;
|
|
value += attn1 * attn1 * extrapolate(offsetSeed, xsb + 1, ysb + 0, dx1, dy1);
|
|
}
|
|
|
|
double dx2 = dx0 - 0.0 - 0.366025403784439;
|
|
double dy2 = dy0 - 1.0 - 0.366025403784439;
|
|
double attn2 = 2.0 - dx2 * dx2 - dy2 * dy2;
|
|
if (attn2 > 0.0) {
|
|
attn2 *= attn2;
|
|
value += attn2 * attn2 * extrapolate(offsetSeed, xsb + 0, ysb + 1, dx2, dy2);
|
|
}
|
|
|
|
double dx_ext;
|
|
double dy_ext;
|
|
int xsv_ext;
|
|
int ysv_ext;
|
|
if (inSum <= 1.0) {
|
|
double zins = 1.0 - inSum;
|
|
if (!(zins > xins) && !(zins > yins)) {
|
|
xsv_ext = xsb + 1;
|
|
ysv_ext = ysb + 1;
|
|
dx_ext = dx0 - 1.0 - 0.732050807568878;
|
|
dy_ext = dy0 - 1.0 - 0.732050807568878;
|
|
} else if (xins > yins) {
|
|
xsv_ext = xsb + 1;
|
|
ysv_ext = ysb - 1;
|
|
dx_ext = dx0 - 1.0;
|
|
dy_ext = dy0 + 1.0;
|
|
} else {
|
|
xsv_ext = xsb - 1;
|
|
ysv_ext = ysb + 1;
|
|
dx_ext = dx0 + 1.0;
|
|
dy_ext = dy0 - 1.0;
|
|
}
|
|
} else {
|
|
double zins = 2.0 - inSum;
|
|
if (!(zins < xins) && !(zins < yins)) {
|
|
dx_ext = dx0;
|
|
dy_ext = dy0;
|
|
xsv_ext = xsb;
|
|
ysv_ext = ysb;
|
|
} else if (xins > yins) {
|
|
xsv_ext = xsb + 2;
|
|
ysv_ext = ysb + 0;
|
|
dx_ext = dx0 - 2.0 - 0.732050807568878;
|
|
dy_ext = dy0 + 0.0 - 0.732050807568878;
|
|
} else {
|
|
xsv_ext = xsb + 0;
|
|
ysv_ext = ysb + 2;
|
|
dx_ext = dx0 + 0.0 - 0.732050807568878;
|
|
dy_ext = dy0 - 2.0 - 0.732050807568878;
|
|
}
|
|
|
|
xsb++;
|
|
ysb++;
|
|
dx0 = dx0 - 1.0 - 0.732050807568878;
|
|
dy0 = dy0 - 1.0 - 0.732050807568878;
|
|
}
|
|
|
|
double attn0 = 2.0 - dx0 * dx0 - dy0 * dy0;
|
|
if (attn0 > 0.0) {
|
|
attn0 *= attn0;
|
|
value += attn0 * attn0 * extrapolate(offsetSeed, xsb, ysb, dx0, dy0);
|
|
}
|
|
|
|
double attn_ext = 2.0 - dx_ext * dx_ext - dy_ext * dy_ext;
|
|
if (attn_ext > 0.0) {
|
|
attn_ext *= attn_ext;
|
|
value += attn_ext * attn_ext * extrapolate(offsetSeed, xsv_ext, ysv_ext, dx_ext, dy_ext);
|
|
}
|
|
|
|
return value / 47.0;
|
|
}
|
|
|
|
@Override
|
|
public double get(int seed, int offsetSeed, double x, double y, double z) {
|
|
double stretchOffset = (x + y + z) * -0.16666666666666666;
|
|
double xs = x + stretchOffset;
|
|
double ys = y + stretchOffset;
|
|
double zs = z + stretchOffset;
|
|
int xsb = fastFloor(xs);
|
|
int ysb = fastFloor(ys);
|
|
int zsb = fastFloor(zs);
|
|
double squishOffset = (xsb + ysb + zsb) * 0.3333333333333333;
|
|
double xb = xsb + squishOffset;
|
|
double yb = ysb + squishOffset;
|
|
double zb = zsb + squishOffset;
|
|
double xins = xs - xsb;
|
|
double yins = ys - ysb;
|
|
double zins = zs - zsb;
|
|
double inSum = xins + yins + zins;
|
|
double dx0 = x - xb;
|
|
double dy0 = y - yb;
|
|
double dz0 = z - zb;
|
|
double value = 0.0;
|
|
double dx_ext0;
|
|
double dy_ext0;
|
|
double dz_ext0;
|
|
double dx_ext1;
|
|
double dy_ext1;
|
|
double dz_ext1;
|
|
int xsv_ext0;
|
|
int ysv_ext0;
|
|
int zsv_ext0;
|
|
int xsv_ext1;
|
|
int ysv_ext1;
|
|
int zsv_ext1;
|
|
if (inSum <= 1.0) {
|
|
byte aPoint = 1;
|
|
double aScore = xins;
|
|
byte bPoint = 2;
|
|
double bScore = yins;
|
|
if (xins >= yins && zins > yins) {
|
|
bScore = zins;
|
|
bPoint = 4;
|
|
} else if (xins < yins && zins > xins) {
|
|
aScore = zins;
|
|
aPoint = 4;
|
|
}
|
|
|
|
double wins = 1.0 - inSum;
|
|
if (!(wins > aScore) && !(wins > bScore)) {
|
|
byte c = (byte)(aPoint | bPoint);
|
|
if ((c & 1) == 0) {
|
|
xsv_ext0 = xsb;
|
|
xsv_ext1 = xsb - 1;
|
|
dx_ext0 = dx0 - 0.6666666666666666;
|
|
dx_ext1 = dx0 + 1.0 - 0.3333333333333333;
|
|
} else {
|
|
xsv_ext0 = xsv_ext1 = xsb + 1;
|
|
dx_ext0 = dx0 - 1.0 - 0.6666666666666666;
|
|
dx_ext1 = dx0 - 1.0 - 0.3333333333333333;
|
|
}
|
|
|
|
if ((c & 2) == 0) {
|
|
ysv_ext0 = ysb;
|
|
ysv_ext1 = ysb - 1;
|
|
dy_ext0 = dy0 - 0.6666666666666666;
|
|
dy_ext1 = dy0 + 1.0 - 0.3333333333333333;
|
|
} else {
|
|
ysv_ext0 = ysv_ext1 = ysb + 1;
|
|
dy_ext0 = dy0 - 1.0 - 0.6666666666666666;
|
|
dy_ext1 = dy0 - 1.0 - 0.3333333333333333;
|
|
}
|
|
|
|
if ((c & 4) == 0) {
|
|
zsv_ext0 = zsb;
|
|
zsv_ext1 = zsb - 1;
|
|
dz_ext0 = dz0 - 0.6666666666666666;
|
|
dz_ext1 = dz0 + 1.0 - 0.3333333333333333;
|
|
} else {
|
|
zsv_ext0 = zsv_ext1 = zsb + 1;
|
|
dz_ext0 = dz0 - 1.0 - 0.6666666666666666;
|
|
dz_ext1 = dz0 - 1.0 - 0.3333333333333333;
|
|
}
|
|
} else {
|
|
byte cx = bScore > aScore ? bPoint : aPoint;
|
|
if ((cx & 1) == 0) {
|
|
xsv_ext0 = xsb - 1;
|
|
xsv_ext1 = xsb;
|
|
dx_ext0 = dx0 + 1.0;
|
|
dx_ext1 = dx0;
|
|
} else {
|
|
xsv_ext0 = xsv_ext1 = xsb + 1;
|
|
dx_ext0 = dx_ext1 = dx0 - 1.0;
|
|
}
|
|
|
|
if ((cx & 2) == 0) {
|
|
ysv_ext1 = ysb;
|
|
ysv_ext0 = ysb;
|
|
dy_ext1 = dy0;
|
|
dy_ext0 = dy0;
|
|
if ((cx & 1) == 0) {
|
|
ysv_ext1 = ysb - 1;
|
|
dy_ext1 = dy0 + 1.0;
|
|
} else {
|
|
ysv_ext0 = ysb - 1;
|
|
dy_ext0 = dy0 + 1.0;
|
|
}
|
|
} else {
|
|
ysv_ext0 = ysv_ext1 = ysb + 1;
|
|
dy_ext0 = dy_ext1 = dy0 - 1.0;
|
|
}
|
|
|
|
if ((cx & 4) == 0) {
|
|
zsv_ext0 = zsb;
|
|
zsv_ext1 = zsb - 1;
|
|
dz_ext0 = dz0;
|
|
dz_ext1 = dz0 + 1.0;
|
|
} else {
|
|
zsv_ext0 = zsv_ext1 = zsb + 1;
|
|
dz_ext0 = dz_ext1 = dz0 - 1.0;
|
|
}
|
|
}
|
|
|
|
double attn0 = 2.0 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0;
|
|
if (attn0 > 0.0) {
|
|
attn0 *= attn0;
|
|
value += attn0 * attn0 * extrapolate(offsetSeed, xsb + 0, ysb + 0, zsb + 0, dx0, dy0, dz0);
|
|
}
|
|
|
|
double dx1 = dx0 - 1.0 - 0.3333333333333333;
|
|
double dy1 = dy0 - 0.0 - 0.3333333333333333;
|
|
double dz1 = dz0 - 0.0 - 0.3333333333333333;
|
|
double attn1 = 2.0 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1;
|
|
if (attn1 > 0.0) {
|
|
attn1 *= attn1;
|
|
value += attn1 * attn1 * extrapolate(offsetSeed, xsb + 1, ysb + 0, zsb + 0, dx1, dy1, dz1);
|
|
}
|
|
|
|
double dx2 = dx0 - 0.0 - 0.3333333333333333;
|
|
double dy2 = dy0 - 1.0 - 0.3333333333333333;
|
|
double attn2 = 2.0 - dx2 * dx2 - dy2 * dy2 - dz1 * dz1;
|
|
if (attn2 > 0.0) {
|
|
attn2 *= attn2;
|
|
value += attn2 * attn2 * extrapolate(offsetSeed, xsb + 0, ysb + 1, zsb + 0, dx2, dy2, dz1);
|
|
}
|
|
|
|
double dz3 = dz0 - 1.0 - 0.3333333333333333;
|
|
double attn3 = 2.0 - dx2 * dx2 - dy1 * dy1 - dz3 * dz3;
|
|
if (attn3 > 0.0) {
|
|
attn3 *= attn3;
|
|
value += attn3 * attn3 * extrapolate(offsetSeed, xsb + 0, ysb + 0, zsb + 1, dx2, dy1, dz3);
|
|
}
|
|
} else if (inSum >= 2.0) {
|
|
byte aPointx = 6;
|
|
double aScorex = xins;
|
|
byte bPointx = 5;
|
|
double bScorex = yins;
|
|
if (xins <= yins && zins < yins) {
|
|
bScorex = zins;
|
|
bPointx = 3;
|
|
} else if (xins > yins && zins < xins) {
|
|
aScorex = zins;
|
|
aPointx = 3;
|
|
}
|
|
|
|
double winsx = 3.0 - inSum;
|
|
if (!(winsx < aScorex) && !(winsx < bScorex)) {
|
|
byte cxx = (byte)(aPointx & bPointx);
|
|
if ((cxx & 1) != 0) {
|
|
xsv_ext0 = xsb + 1;
|
|
xsv_ext1 = xsb + 2;
|
|
dx_ext0 = dx0 - 1.0 - 0.3333333333333333;
|
|
dx_ext1 = dx0 - 2.0 - 0.6666666666666666;
|
|
} else {
|
|
xsv_ext1 = xsb;
|
|
xsv_ext0 = xsb;
|
|
dx_ext0 = dx0 - 0.3333333333333333;
|
|
dx_ext1 = dx0 - 0.6666666666666666;
|
|
}
|
|
|
|
if ((cxx & 2) != 0) {
|
|
ysv_ext0 = ysb + 1;
|
|
ysv_ext1 = ysb + 2;
|
|
dy_ext0 = dy0 - 1.0 - 0.3333333333333333;
|
|
dy_ext1 = dy0 - 2.0 - 0.6666666666666666;
|
|
} else {
|
|
ysv_ext1 = ysb;
|
|
ysv_ext0 = ysb;
|
|
dy_ext0 = dy0 - 0.3333333333333333;
|
|
dy_ext1 = dy0 - 0.6666666666666666;
|
|
}
|
|
|
|
if ((cxx & 4) != 0) {
|
|
zsv_ext0 = zsb + 1;
|
|
zsv_ext1 = zsb + 2;
|
|
dz_ext0 = dz0 - 1.0 - 0.3333333333333333;
|
|
dz_ext1 = dz0 - 2.0 - 0.6666666666666666;
|
|
} else {
|
|
zsv_ext1 = zsb;
|
|
zsv_ext0 = zsb;
|
|
dz_ext0 = dz0 - 0.3333333333333333;
|
|
dz_ext1 = dz0 - 0.6666666666666666;
|
|
}
|
|
} else {
|
|
byte cxxx = bScorex < aScorex ? bPointx : aPointx;
|
|
if ((cxxx & 1) != 0) {
|
|
xsv_ext0 = xsb + 2;
|
|
xsv_ext1 = xsb + 1;
|
|
dx_ext0 = dx0 - 2.0 - 1.0;
|
|
dx_ext1 = dx0 - 1.0 - 1.0;
|
|
} else {
|
|
xsv_ext1 = xsb;
|
|
xsv_ext0 = xsb;
|
|
dx_ext0 = dx_ext1 = dx0 - 1.0;
|
|
}
|
|
|
|
if ((cxxx & 2) != 0) {
|
|
ysv_ext0 = ysv_ext1 = ysb + 1;
|
|
dy_ext0 = dy_ext1 = dy0 - 1.0 - 1.0;
|
|
if ((cxxx & 1) != 0) {
|
|
ysv_ext1++;
|
|
dy_ext1--;
|
|
} else {
|
|
ysv_ext0++;
|
|
dy_ext0--;
|
|
}
|
|
} else {
|
|
ysv_ext1 = ysb;
|
|
ysv_ext0 = ysb;
|
|
dy_ext0 = dy_ext1 = dy0 - 1.0;
|
|
}
|
|
|
|
if ((cxxx & 4) != 0) {
|
|
zsv_ext0 = zsb + 1;
|
|
zsv_ext1 = zsb + 2;
|
|
dz_ext0 = dz0 - 1.0 - 1.0;
|
|
dz_ext1 = dz0 - 2.0 - 1.0;
|
|
} else {
|
|
zsv_ext1 = zsb;
|
|
zsv_ext0 = zsb;
|
|
dz_ext0 = dz_ext1 = dz0 - 1.0;
|
|
}
|
|
}
|
|
|
|
double dx3 = dx0 - 1.0 - 0.6666666666666666;
|
|
double dy3 = dy0 - 1.0 - 0.6666666666666666;
|
|
double dz3 = dz0 - 0.0 - 0.6666666666666666;
|
|
double attn3 = 2.0 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3;
|
|
if (attn3 > 0.0) {
|
|
attn3 *= attn3;
|
|
value += attn3 * attn3 * extrapolate(offsetSeed, xsb + 1, ysb + 1, zsb + 0, dx3, dy3, dz3);
|
|
}
|
|
|
|
double dy2x = dy0 - 0.0 - 0.6666666666666666;
|
|
double dz2 = dz0 - 1.0 - 0.6666666666666666;
|
|
double attn2x = 2.0 - dx3 * dx3 - dy2x * dy2x - dz2 * dz2;
|
|
if (attn2x > 0.0) {
|
|
attn2x *= attn2x;
|
|
value += attn2x * attn2x * extrapolate(offsetSeed, xsb + 1, ysb + 0, zsb + 1, dx3, dy2x, dz2);
|
|
}
|
|
|
|
double dx1x = dx0 - 0.0 - 0.6666666666666666;
|
|
double attn1x = 2.0 - dx1x * dx1x - dy3 * dy3 - dz2 * dz2;
|
|
if (attn1x > 0.0) {
|
|
attn1x *= attn1x;
|
|
value += attn1x * attn1x * extrapolate(offsetSeed, xsb + 0, ysb + 1, zsb + 1, dx1x, dy3, dz2);
|
|
}
|
|
|
|
dx0 = dx0 - 1.0 - 1.0;
|
|
dy0 = dy0 - 1.0 - 1.0;
|
|
dz0 = dz0 - 1.0 - 1.0;
|
|
double attn0x = 2.0 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0;
|
|
if (attn0x > 0.0) {
|
|
attn0x *= attn0x;
|
|
value += attn0x * attn0x * extrapolate(offsetSeed, xsb + 1, ysb + 1, zsb + 1, dx0, dy0, dz0);
|
|
}
|
|
} else {
|
|
double p1 = xins + yins;
|
|
byte aPointxx;
|
|
double aScorexx;
|
|
boolean aIsFurtherSide;
|
|
if (p1 > 1.0) {
|
|
aScorexx = p1 - 1.0;
|
|
aPointxx = 3;
|
|
aIsFurtherSide = true;
|
|
} else {
|
|
aScorexx = 1.0 - p1;
|
|
aPointxx = 4;
|
|
aIsFurtherSide = false;
|
|
}
|
|
|
|
double p2 = xins + zins;
|
|
boolean bIsFurtherSide;
|
|
double bScorexx;
|
|
byte bPointxx;
|
|
if (p2 > 1.0) {
|
|
bScorexx = p2 - 1.0;
|
|
bPointxx = 5;
|
|
bIsFurtherSide = true;
|
|
} else {
|
|
bScorexx = 1.0 - p2;
|
|
bPointxx = 2;
|
|
bIsFurtherSide = false;
|
|
}
|
|
|
|
double p3 = yins + zins;
|
|
if (p3 > 1.0) {
|
|
double score = p3 - 1.0;
|
|
if (aScorexx <= bScorexx && aScorexx < score) {
|
|
aPointxx = 6;
|
|
aIsFurtherSide = true;
|
|
} else if (aScorexx > bScorexx && bScorexx < score) {
|
|
bPointxx = 6;
|
|
bIsFurtherSide = true;
|
|
}
|
|
} else {
|
|
double score = 1.0 - p3;
|
|
if (aScorexx <= bScorexx && aScorexx < score) {
|
|
aPointxx = 1;
|
|
aIsFurtherSide = false;
|
|
} else if (aScorexx > bScorexx && bScorexx < score) {
|
|
bPointxx = 1;
|
|
bIsFurtherSide = false;
|
|
}
|
|
}
|
|
|
|
if (aIsFurtherSide == bIsFurtherSide) {
|
|
if (aIsFurtherSide) {
|
|
dx_ext0 = dx0 - 1.0 - 1.0;
|
|
dy_ext0 = dy0 - 1.0 - 1.0;
|
|
dz_ext0 = dz0 - 1.0 - 1.0;
|
|
xsv_ext0 = xsb + 1;
|
|
ysv_ext0 = ysb + 1;
|
|
zsv_ext0 = zsb + 1;
|
|
byte cxxxx = (byte)(aPointxx & bPointxx);
|
|
if ((cxxxx & 1) != 0) {
|
|
dx_ext1 = dx0 - 2.0 - 0.6666666666666666;
|
|
dy_ext1 = dy0 - 0.6666666666666666;
|
|
dz_ext1 = dz0 - 0.6666666666666666;
|
|
xsv_ext1 = xsb + 2;
|
|
ysv_ext1 = ysb;
|
|
zsv_ext1 = zsb;
|
|
} else if ((cxxxx & 2) != 0) {
|
|
dx_ext1 = dx0 - 0.6666666666666666;
|
|
dy_ext1 = dy0 - 2.0 - 0.6666666666666666;
|
|
dz_ext1 = dz0 - 0.6666666666666666;
|
|
xsv_ext1 = xsb;
|
|
ysv_ext1 = ysb + 2;
|
|
zsv_ext1 = zsb;
|
|
} else {
|
|
dx_ext1 = dx0 - 0.6666666666666666;
|
|
dy_ext1 = dy0 - 0.6666666666666666;
|
|
dz_ext1 = dz0 - 2.0 - 0.6666666666666666;
|
|
xsv_ext1 = xsb;
|
|
ysv_ext1 = ysb;
|
|
zsv_ext1 = zsb + 2;
|
|
}
|
|
} else {
|
|
dx_ext0 = dx0;
|
|
dy_ext0 = dy0;
|
|
dz_ext0 = dz0;
|
|
xsv_ext0 = xsb;
|
|
ysv_ext0 = ysb;
|
|
zsv_ext0 = zsb;
|
|
byte cxxxx = (byte)(aPointxx | bPointxx);
|
|
if ((cxxxx & 1) == 0) {
|
|
dx_ext1 = dx0 + 1.0 - 0.3333333333333333;
|
|
dy_ext1 = dy0 - 1.0 - 0.3333333333333333;
|
|
dz_ext1 = dz0 - 1.0 - 0.3333333333333333;
|
|
xsv_ext1 = xsb - 1;
|
|
ysv_ext1 = ysb + 1;
|
|
zsv_ext1 = zsb + 1;
|
|
} else if ((cxxxx & 2) == 0) {
|
|
dx_ext1 = dx0 - 1.0 - 0.3333333333333333;
|
|
dy_ext1 = dy0 + 1.0 - 0.3333333333333333;
|
|
dz_ext1 = dz0 - 1.0 - 0.3333333333333333;
|
|
xsv_ext1 = xsb + 1;
|
|
ysv_ext1 = ysb - 1;
|
|
zsv_ext1 = zsb + 1;
|
|
} else {
|
|
dx_ext1 = dx0 - 1.0 - 0.3333333333333333;
|
|
dy_ext1 = dy0 - 1.0 - 0.3333333333333333;
|
|
dz_ext1 = dz0 + 1.0 - 0.3333333333333333;
|
|
xsv_ext1 = xsb + 1;
|
|
ysv_ext1 = ysb + 1;
|
|
zsv_ext1 = zsb - 1;
|
|
}
|
|
}
|
|
} else {
|
|
byte c2;
|
|
byte c1;
|
|
if (aIsFurtherSide) {
|
|
c1 = aPointxx;
|
|
c2 = bPointxx;
|
|
} else {
|
|
c1 = bPointxx;
|
|
c2 = aPointxx;
|
|
}
|
|
|
|
if ((c1 & 1) == 0) {
|
|
dx_ext0 = dx0 + 1.0 - 0.3333333333333333;
|
|
dy_ext0 = dy0 - 1.0 - 0.3333333333333333;
|
|
dz_ext0 = dz0 - 1.0 - 0.3333333333333333;
|
|
xsv_ext0 = xsb - 1;
|
|
ysv_ext0 = ysb + 1;
|
|
zsv_ext0 = zsb + 1;
|
|
} else if ((c1 & 2) == 0) {
|
|
dx_ext0 = dx0 - 1.0 - 0.3333333333333333;
|
|
dy_ext0 = dy0 + 1.0 - 0.3333333333333333;
|
|
dz_ext0 = dz0 - 1.0 - 0.3333333333333333;
|
|
xsv_ext0 = xsb + 1;
|
|
ysv_ext0 = ysb - 1;
|
|
zsv_ext0 = zsb + 1;
|
|
} else {
|
|
dx_ext0 = dx0 - 1.0 - 0.3333333333333333;
|
|
dy_ext0 = dy0 - 1.0 - 0.3333333333333333;
|
|
dz_ext0 = dz0 + 1.0 - 0.3333333333333333;
|
|
xsv_ext0 = xsb + 1;
|
|
ysv_ext0 = ysb + 1;
|
|
zsv_ext0 = zsb - 1;
|
|
}
|
|
|
|
dx_ext1 = dx0 - 0.6666666666666666;
|
|
dy_ext1 = dy0 - 0.6666666666666666;
|
|
dz_ext1 = dz0 - 0.6666666666666666;
|
|
xsv_ext1 = xsb;
|
|
ysv_ext1 = ysb;
|
|
zsv_ext1 = zsb;
|
|
if ((c2 & 1) != 0) {
|
|
dx_ext1 -= 2.0;
|
|
xsv_ext1 = xsb + 2;
|
|
} else if ((c2 & 2) != 0) {
|
|
dy_ext1 -= 2.0;
|
|
ysv_ext1 = ysb + 2;
|
|
} else {
|
|
dz_ext1 -= 2.0;
|
|
zsv_ext1 = zsb + 2;
|
|
}
|
|
}
|
|
|
|
double dx1xx = dx0 - 1.0 - 0.3333333333333333;
|
|
double dy1x = dy0 - 0.0 - 0.3333333333333333;
|
|
double dz1x = dz0 - 0.0 - 0.3333333333333333;
|
|
double attn1xx = 2.0 - dx1xx * dx1xx - dy1x * dy1x - dz1x * dz1x;
|
|
if (attn1xx > 0.0) {
|
|
attn1xx *= attn1xx;
|
|
value += attn1xx * attn1xx * extrapolate(offsetSeed, xsb + 1, ysb + 0, zsb + 0, dx1xx, dy1x, dz1x);
|
|
}
|
|
|
|
double dx2x = dx0 - 0.0 - 0.3333333333333333;
|
|
double dy2xx = dy0 - 1.0 - 0.3333333333333333;
|
|
double attn2xx = 2.0 - dx2x * dx2x - dy2xx * dy2xx - dz1x * dz1x;
|
|
if (attn2xx > 0.0) {
|
|
attn2xx *= attn2xx;
|
|
value += attn2xx * attn2xx * extrapolate(offsetSeed, xsb + 0, ysb + 1, zsb + 0, dx2x, dy2xx, dz1x);
|
|
}
|
|
|
|
double dz3x = dz0 - 1.0 - 0.3333333333333333;
|
|
double attn3x = 2.0 - dx2x * dx2x - dy1x * dy1x - dz3x * dz3x;
|
|
if (attn3x > 0.0) {
|
|
attn3x *= attn3x;
|
|
value += attn3x * attn3x * extrapolate(offsetSeed, xsb + 0, ysb + 0, zsb + 1, dx2x, dy1x, dz3x);
|
|
}
|
|
|
|
double dx4 = dx0 - 1.0 - 0.6666666666666666;
|
|
double dy4 = dy0 - 1.0 - 0.6666666666666666;
|
|
double dz4 = dz0 - 0.0 - 0.6666666666666666;
|
|
double attn4 = 2.0 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4;
|
|
if (attn4 > 0.0) {
|
|
attn4 *= attn4;
|
|
value += attn4 * attn4 * extrapolate(offsetSeed, xsb + 1, ysb + 1, zsb + 0, dx4, dy4, dz4);
|
|
}
|
|
|
|
double dy5 = dy0 - 0.0 - 0.6666666666666666;
|
|
double dz5 = dz0 - 1.0 - 0.6666666666666666;
|
|
double attn5 = 2.0 - dx4 * dx4 - dy5 * dy5 - dz5 * dz5;
|
|
if (attn5 > 0.0) {
|
|
attn5 *= attn5;
|
|
value += attn5 * attn5 * extrapolate(offsetSeed, xsb + 1, ysb + 0, zsb + 1, dx4, dy5, dz5);
|
|
}
|
|
|
|
double dx6 = dx0 - 0.0 - 0.6666666666666666;
|
|
double attn6 = 2.0 - dx6 * dx6 - dy4 * dy4 - dz5 * dz5;
|
|
if (attn6 > 0.0) {
|
|
attn6 *= attn6;
|
|
value += attn6 * attn6 * extrapolate(offsetSeed, xsb + 0, ysb + 1, zsb + 1, dx6, dy4, dz5);
|
|
}
|
|
}
|
|
|
|
double attn_ext0 = 2.0 - dx_ext0 * dx_ext0 - dy_ext0 * dy_ext0 - dz_ext0 * dz_ext0;
|
|
if (attn_ext0 > 0.0) {
|
|
attn_ext0 *= attn_ext0;
|
|
value += attn_ext0 * attn_ext0 * extrapolate(offsetSeed, xsv_ext0, ysv_ext0, zsv_ext0, dx_ext0, dy_ext0, dz_ext0);
|
|
}
|
|
|
|
double attn_ext1 = 2.0 - dx_ext1 * dx_ext1 - dy_ext1 * dy_ext1 - dz_ext1 * dz_ext1;
|
|
if (attn_ext1 > 0.0) {
|
|
attn_ext1 *= attn_ext1;
|
|
value += attn_ext1 * attn_ext1 * extrapolate(offsetSeed, xsv_ext1, ysv_ext1, zsv_ext1, dx_ext1, dy_ext1, dz_ext1);
|
|
}
|
|
|
|
return value / 103.0;
|
|
}
|
|
|
|
@Nonnull
|
|
@Override
|
|
public String toString() {
|
|
return "OldSimplexNoise{}";
|
|
}
|
|
|
|
private static double extrapolate(int seed, int x, int y, double xd, double yd) {
|
|
int hash = seed ^ 1619 * x;
|
|
hash ^= 31337 * y;
|
|
hash = hash * hash * hash * 60493;
|
|
hash = hash >> 13 ^ hash;
|
|
DoubleArray.Double2 g = gradients2D[hash & 7];
|
|
return xd * g.x + yd * g.y;
|
|
}
|
|
|
|
private static double extrapolate(int seed, int x, int y, int z, double xd, double yd, double zd) {
|
|
int hash = seed ^ 1619 * x;
|
|
hash ^= 31337 * y;
|
|
hash ^= 6971 * z;
|
|
hash = hash * hash * hash * 60493;
|
|
hash = hash >> 13 ^ hash;
|
|
DoubleArray.Double3 g = gradients3D[hash % gradients3D.length];
|
|
return xd * g.x + yd * g.y + zd * g.z;
|
|
}
|
|
|
|
private static int fastFloor(double x) {
|
|
int xi = (int)x;
|
|
return x < xi ? xi - 1 : xi;
|
|
}
|
|
}
|