Format
This commit is contained in:
opfromthestart 2021-06-10 17:09:24 -04:00
parent ae2980c9de
commit e58007ea11
413 changed files with 2581 additions and 5099 deletions

View File

@ -45,7 +45,7 @@ public class OpenSimplex2S {
source[i] = i;
for (int i = PSIZE - 1; i >= 0; i--) {
seed = seed * 6364136223846793005L + 1442695040888963407L;
int r = (int)((seed + 31) % (i + 1));
int r = (int) ((seed + 31) % (i + 1));
if (r < 0)
r += (i + 1);
perm[i] = source[r];
@ -72,9 +72,9 @@ public class OpenSimplex2S {
}
/**
* 2D SuperSimplex noise, with Y pointing down the main diagonal.
* Might be better for a 2D sandbox style game, where Y is vertical.
* Probably slightly less optimal for heightmaps or continent maps.
* 2D SuperSimplex noise, with Y pointing down the main diagonal. Might be
* better for a 2D sandbox style game, where Y is vertical. Probably
* slightly less optimal for heightmaps or continent maps.
*/
public double noise2_XBeforeY(double x, double y) {
@ -86,8 +86,8 @@ public class OpenSimplex2S {
}
/**
* 2D SuperSimplex noise base.
* Lookup table implementation inspired by DigitalShadow.
* 2D SuperSimplex noise base. Lookup table implementation inspired by
* DigitalShadow.
*/
private double noise2_Base(double xs, double ys) {
double value = 0;
@ -97,11 +97,8 @@ public class OpenSimplex2S {
double xsi = xs - xsb, ysi = ys - ysb;
// Index to point list
int a = (int)(xsi + ysi);
int index =
(a << 2) |
(int)(xsi - ysi / 2 + 1 - a / 2.0) << 3 |
(int)(ysi - xsi / 2 + 1 - a / 2.0) << 4;
int a = (int) (xsi + ysi);
int index = (a << 2) | (int) (xsi - ysi / 2 + 1 - a / 2.0) << 3 | (int) (ysi - xsi / 2 + 1 - a / 2.0) << 4;
double ssi = (xsi + ysi) * -0.211324865405187;
double xi = xsi + ssi, yi = ysi + ssi;
@ -112,7 +109,8 @@ public class OpenSimplex2S {
double dx = xi + c.dx, dy = yi + c.dy;
double attn = 2.0 / 3.0 - dx * dx - dy * dy;
if (attn <= 0) continue;
if (attn <= 0)
continue;
int pxm = (xsb + c.xsv) & PMASK, pym = (ysb + c.ysv) & PMASK;
Grad2 grad = permGrad2[perm[pxm] ^ pym];
@ -126,15 +124,16 @@ public class OpenSimplex2S {
}
/**
* 3D Re-oriented 8-point BCC noise, classic orientation
* Proper substitute for what 3D SuperSimplex would be,
* in light of Forbidden Formulae.
* Use noise3_XYBeforeZ or noise3_XZBeforeY instead, wherever appropriate.
* 3D Re-oriented 8-point BCC noise, classic orientation Proper substitute
* for what 3D SuperSimplex would be, in light of Forbidden Formulae. Use
* noise3_XYBeforeZ or noise3_XZBeforeY instead, wherever appropriate.
*/
public double noise3_Classic(double x, double y, double z) {
// Re-orient the cubic lattices via rotation, to produce the expected look on cardinal planar slices.
// If texturing objects that don't tend to have cardinal plane faces, you could even remove this.
// Re-orient the cubic lattices via rotation, to produce the expected
// look on cardinal planar slices.
// If texturing objects that don't tend to have cardinal plane faces,
// you could even remove this.
// Orthonormal rotation. Not a skew transform.
double r = (2.0 / 3.0) * (x + y + z);
double xr = r - x, yr = r - y, zr = r - z;
@ -145,15 +144,17 @@ public class OpenSimplex2S {
/**
* 3D Re-oriented 8-point BCC noise, with better visual isotropy in (X, Y).
* Recommended for 3D terrain and time-varied animations.
* The Z coordinate should always be the "different" coordinate in your use case.
* If Y is vertical in world coordinates, call noise3_XYBeforeZ(x, z, Y) or use noise3_XZBeforeY.
* If Z is vertical in world coordinates, call noise3_XYBeforeZ(x, y, Z).
* For a time varied animation, call noise3_XYBeforeZ(x, y, T).
* Recommended for 3D terrain and time-varied animations. The Z coordinate
* should always be the "different" coordinate in your use case. If Y is
* vertical in world coordinates, call noise3_XYBeforeZ(x, z, Y) or use
* noise3_XZBeforeY. If Z is vertical in world coordinates, call
* noise3_XYBeforeZ(x, y, Z). For a time varied animation, call
* noise3_XYBeforeZ(x, y, T).
*/
public double noise3_XYBeforeZ(double x, double y, double z) {
// Re-orient the cubic lattices without skewing, to make X and Y triangular like 2D.
// Re-orient the cubic lattices without skewing, to make X and Y
// triangular like 2D.
// Orthonormal rotation. Not a skew transform.
double xy = x + y;
double s2 = xy * -0.211324865405187;
@ -167,20 +168,23 @@ public class OpenSimplex2S {
/**
* 3D Re-oriented 8-point BCC noise, with better visual isotropy in (X, Z).
* Recommended for 3D terrain and time-varied animations.
* The Y coordinate should always be the "different" coordinate in your use case.
* If Y is vertical in world coordinates, call noise3_XZBeforeY(x, Y, z).
* If Z is vertical in world coordinates, call noise3_XZBeforeY(x, Z, y) or use noise3_XYBeforeZ.
* For a time varied animation, call noise3_XZBeforeY(x, T, y) or use noise3_XYBeforeZ.
* Recommended for 3D terrain and time-varied animations. The Y coordinate
* should always be the "different" coordinate in your use case. If Y is
* vertical in world coordinates, call noise3_XZBeforeY(x, Y, z). If Z is
* vertical in world coordinates, call noise3_XZBeforeY(x, Z, y) or use
* noise3_XYBeforeZ. For a time varied animation, call noise3_XZBeforeY(x,
* T, y) or use noise3_XYBeforeZ.
*/
public double noise3_XZBeforeY(double x, double y, double z) {
// Re-orient the cubic lattices without skewing, to make X and Z triangular like 2D.
// Re-orient the cubic lattices without skewing, to make X and Z
// triangular like 2D.
// Orthonormal rotation. Not a skew transform.
double xz = x + z;
double s2 = xz * -0.211324865405187;
double yy = y * 0.577350269189626;
double xr = x + s2 - yy; double zr = z + s2 - yy;
double xr = x + s2 - yy;
double zr = z + s2 - yy;
double yr = xz * 0.577350269189626 + yy;
// Evaluate both lattices to form a BCC lattice.
@ -188,10 +192,10 @@ public class OpenSimplex2S {
}
/**
* Generate overlapping cubic lattices for 3D Re-oriented BCC noise.
* Lookup table implementation inspired by DigitalShadow.
* It was actually faster to narrow down the points in the loop itself,
* than to build up the index with enough info to isolate 8 points.
* Generate overlapping cubic lattices for 3D Re-oriented BCC noise. Lookup
* table implementation inspired by DigitalShadow. It was actually faster to
* narrow down the points in the loop itself, than to build up the index
* with enough info to isolate 8 points.
*/
private double noise3_BCC(double xr, double yr, double zr) {
@ -199,9 +203,11 @@ public class OpenSimplex2S {
int xrb = fastFloor(xr), yrb = fastFloor(yr), zrb = fastFloor(zr);
double xri = xr - xrb, yri = yr - yrb, zri = zr - zrb;
// Identify which octant of the cube we're in. This determines which cell
// in the other cubic lattice we're in, and also narrows down one point on each.
int xht = (int)(xri + 0.5), yht = (int)(yri + 0.5), zht = (int)(zri + 0.5);
// Identify which octant of the cube we're in. This determines which
// cell
// in the other cubic lattice we're in, and also narrows down one point
// on each.
int xht = (int) (xri + 0.5), yht = (int) (yri + 0.5), zht = (int) (zri + 0.5);
int index = (xht << 0) | (yht << 1) | (zht << 2);
// Point contributions
@ -230,9 +236,9 @@ public class OpenSimplex2S {
*/
/**
* Generate the 2D noise over a large area.
* Propagates by flood-fill instead of iterating over a range.
* Results may occasionally slightly exceed [-1, 1] due to the grid-snapped pre-generated kernel.
* Generate the 2D noise over a large area. Propagates by flood-fill instead
* of iterating over a range. Results may occasionally slightly exceed [-1,
* 1] due to the grid-snapped pre-generated kernel.
*/
public void generate2(GenerateContext2D context, double[][] buffer, int x0, int y0) {
int height = buffer.length;
@ -241,11 +247,12 @@ public class OpenSimplex2S {
}
/**
* Generate the 2D noise over a large area.
* Propagates by flood-fill instead of iterating over a range.
* Results may occasionally slightly exceed [-1, 1] due to the grid-snapped pre-generated kernel.
* Generate the 2D noise over a large area. Propagates by flood-fill instead
* of iterating over a range. Results may occasionally slightly exceed [-1,
* 1] due to the grid-snapped pre-generated kernel.
*/
public void generate2(GenerateContext2D context, double[][] buffer, int x0, int y0, int width, int height, int skipX, int skipY) {
public void generate2(GenerateContext2D context, double[][] buffer, int x0, int y0, int width, int height,
int skipX, int skipY) {
Queue<AreaGenLatticePoint2D> queue = new LinkedList<AreaGenLatticePoint2D>();
Set<AreaGenLatticePoint2D> seen = new HashSet<AreaGenLatticePoint2D>();
@ -260,16 +267,19 @@ public class OpenSimplex2S {
// - Much faster than computing the kernel equation every time.
// You can remove these lines if you find it's the opposite for you.
// You'll have to double the bounds again in GenerateContext2D
kernel = new double[scaledRadiusY * 2][/*scaledRadiusX * 2*/];
kernel = new double[scaledRadiusY * 2][/* scaledRadiusX * 2 */];
for (int yy = 0; yy < scaledRadiusY; yy++) {
kernel[2 * scaledRadiusY - yy - 1] = kernel[yy] = (double[]) context.kernel[yy].clone();
}
// Get started with one point/vertex.
// For some lattices, you might need to try a handful of points in the cell,
// or flip a couple of coordinates, to guarantee it or a neighbor contributes.
// For some lattices, you might need to try a handful of points in the
// cell,
// or flip a couple of coordinates, to guarantee it or a neighbor
// contributes.
// For An* lattices, the base coordinate seems fine.
double x0f = x0Skipped * context.xFrequency; double y0f = y0Skipped * context.yFrequency;
double x0f = x0Skipped * context.xFrequency;
double y0f = y0Skipped * context.yFrequency;
double x0s = context.orientation.s00 * x0f + context.orientation.s01 * y0f;
double y0s = context.orientation.s10 * x0f + context.orientation.s11 * y0f;
int x0sb = fastFloor(x0s), y0sb = fastFloor(y0s);
@ -287,11 +297,16 @@ public class OpenSimplex2S {
Grad2 grad = context.orientation.gradients[perm[perm[pxm] ^ pym]];
double gx = grad.dx * context.xFrequency;
double gy = grad.dy * context.yFrequency;
double gOff = 0.5 * (gx + gy); // to correct for (0.5, 0.5)-offset kernel
double gOff = 0.5 * (gx + gy); // to correct for (0.5, 0.5)-offset
// kernel
// Contribution kernel bounds
int yy0 = destPointY - scaledRadiusY; if (yy0 < y0Skipped) yy0 = y0Skipped;
int yy1 = destPointY + scaledRadiusY; if (yy1 > y0 + height) yy1 = y0 + height;
int yy0 = destPointY - scaledRadiusY;
if (yy0 < y0Skipped)
yy0 = y0Skipped;
int yy1 = destPointY + scaledRadiusY;
if (yy1 > y0 + height)
yy1 = y0 + height;
// For each row of the contribution circle,
for (int yy = yy0; yy < yy1; yy++) {
@ -300,16 +315,22 @@ public class OpenSimplex2S {
// Set up bounds so we only loop over what we need to
int thisScaledRadiusX = context.kernelBounds[ky];
int xx0 = destPointX - thisScaledRadiusX; if (xx0 < x0Skipped) xx0 = x0Skipped;
int xx1 = destPointX + thisScaledRadiusX; if (xx1 > x0 + width) xx1 = x0 + width;
int xx0 = destPointX - thisScaledRadiusX;
if (xx0 < x0Skipped)
xx0 = x0Skipped;
int xx1 = destPointX + thisScaledRadiusX;
if (xx1 > x0 + width)
xx1 = x0 + width;
// For each point on that row
for (int xx = xx0; xx < xx1; xx++) {
int dx = xx - destPointX;
int kx = dx + scaledRadiusX;
// gOff accounts for our choice to offset the pre-generated kernel by (0.5, 0.5) to avoid the zero center.
// I found almost no difference in performance using gOff vs not (under 1ns diff per value on my system)
// gOff accounts for our choice to offset the pre-generated
// kernel by (0.5, 0.5) to avoid the zero center.
// I found almost no difference in performance using gOff vs
// not (under 1ns diff per value on my system)
double extrapolation = gx * dx + gy * dy + gOff;
buffer[yy - y0][xx - x0] += kernel[ky][kx] * extrapolation;
@ -318,13 +339,14 @@ public class OpenSimplex2S {
// For each neighbor of the point
for (int i = 0; i < NEIGHBOR_MAP_2D.length; i++) {
AreaGenLatticePoint2D neighbor = new AreaGenLatticePoint2D(context,
point.xsv + NEIGHBOR_MAP_2D[i][0], point.ysv + NEIGHBOR_MAP_2D[i][1]);
AreaGenLatticePoint2D neighbor = new AreaGenLatticePoint2D(context, point.xsv + NEIGHBOR_MAP_2D[i][0],
point.ysv + NEIGHBOR_MAP_2D[i][1]);
// If it's in range of the buffer region and not seen before
if (neighbor.destPointX + scaledRadiusX >= x0Skipped && neighbor.destPointX - scaledRadiusX <= x0 + width - 1
&& neighbor.destPointY + scaledRadiusY >= y0Skipped && neighbor.destPointY - scaledRadiusY <= y0 + height - 1
&& !seen.contains(neighbor)) {
if (neighbor.destPointX + scaledRadiusX >= x0Skipped
&& neighbor.destPointX - scaledRadiusX <= x0 + width - 1
&& neighbor.destPointY + scaledRadiusY >= y0Skipped
&& neighbor.destPointY - scaledRadiusY <= y0 + height - 1 && !seen.contains(neighbor)) {
// Add it to the queue so we can process it at some point
queue.add(neighbor);
@ -337,9 +359,9 @@ public class OpenSimplex2S {
}
/**
* Generate the 3D noise over a large area/volume.
* Propagates by flood-fill instead of iterating over a range.
* Results may occasionally slightly exceed [-1, 1] due to the grid-snapped pre-generated kernel.
* Generate the 3D noise over a large area/volume. Propagates by flood-fill
* instead of iterating over a range. Results may occasionally slightly
* exceed [-1, 1] due to the grid-snapped pre-generated kernel.
*/
public void generate3(GenerateContext3D context, double[][][] buffer, int x0, int y0, int z0) {
int depth = buffer.length;
@ -349,11 +371,12 @@ public class OpenSimplex2S {
}
/**
* Generate the 3D noise over a large area/volume.
* Propagates by flood-fill instead of iterating over a range.
* Results may occasionally slightly exceed [-1, 1] due to the grid-snapped pre-generated kernel.
* Generate the 3D noise over a large area/volume. Propagates by flood-fill
* instead of iterating over a range. Results may occasionally slightly
* exceed [-1, 1] due to the grid-snapped pre-generated kernel.
*/
public void generate3(GenerateContext3D context, double[][][] buffer, int x0, int y0, int z0, int width, int height, int depth, int skipX, int skipY, int skipZ) {
public void generate3(GenerateContext3D context, double[][][] buffer, int x0, int y0, int z0, int width, int height,
int depth, int skipX, int skipY, int skipZ) {
Queue<AreaGenLatticePoint3D> queue = new LinkedList<AreaGenLatticePoint3D>();
Set<AreaGenLatticePoint3D> seen = new HashSet<AreaGenLatticePoint3D>();
@ -365,8 +388,10 @@ public class OpenSimplex2S {
// Quaternion multiplication for rotation.
// https://blog.molecular-matters.com/2013/05/24/a-faster-quaternion-vector-multiplication/
double qx = context.orientation.qx, qy = context.orientation.qy, qz = context.orientation.qz, qw = context.orientation.qw;
double x0f = x0Skipped * context.xFrequency, y0f = y0Skipped * context.yFrequency, z0f = z0Skipped * context.zFrequency;
double qx = context.orientation.qx, qy = context.orientation.qy, qz = context.orientation.qz,
qw = context.orientation.qw;
double x0f = x0Skipped * context.xFrequency, y0f = y0Skipped * context.yFrequency,
z0f = z0Skipped * context.zFrequency;
double tx = 2 * (qy * z0f - qz * y0f);
double ty = 2 * (qz * x0f - qx * z0f);
double tz = 2 * (qx * y0f - qy * x0f);
@ -392,11 +417,16 @@ public class OpenSimplex2S {
double gx = grad.dx * context.xFrequency;
double gy = grad.dy * context.yFrequency;
double gz = grad.dz * context.zFrequency;
double gOff = 0.5 * (gx + gy + gz); // to correct for (0.5, 0.5, 0.5)-offset kernel
double gOff = 0.5 * (gx + gy + gz); // to correct for (0.5, 0.5,
// 0.5)-offset kernel
// Contribution kernel bounds.
int zz0 = destPointZ - scaledRadiusZ; if (zz0 < z0Skipped) zz0 = z0Skipped;
int zz1 = destPointZ + scaledRadiusZ; if (zz1 > z0 + depth) zz1 = z0 + depth;
int zz0 = destPointZ - scaledRadiusZ;
if (zz0 < z0Skipped)
zz0 = z0Skipped;
int zz1 = destPointZ + scaledRadiusZ;
if (zz1 > z0 + depth)
zz1 = z0 + depth;
// For each x/y slice of the contribution sphere,
for (int zz = zz0; zz < zz1; zz++) {
@ -405,8 +435,12 @@ public class OpenSimplex2S {
// Set up bounds so we only loop over what we need to
int thisScaledRadiusY = context.kernelBoundsY[kz];
int yy0 = destPointY - thisScaledRadiusY; if (yy0 < y0Skipped) yy0 = y0Skipped;
int yy1 = destPointY + thisScaledRadiusY; if (yy1 > y0 + height) yy1 = y0 + height;
int yy0 = destPointY - thisScaledRadiusY;
if (yy0 < y0Skipped)
yy0 = y0Skipped;
int yy1 = destPointY + thisScaledRadiusY;
if (yy1 > y0 + height)
yy1 = y0 + height;
// For each row of the contribution circle,
for (int yy = yy0; yy < yy1; yy++) {
@ -415,15 +449,21 @@ public class OpenSimplex2S {
// Set up bounds so we only loop over what we need to
int thisScaledRadiusX = context.kernelBoundsX[kz][ky];
int xx0 = destPointX - thisScaledRadiusX; if (xx0 < x0Skipped) xx0 = x0Skipped;
int xx1 = destPointX + thisScaledRadiusX; if (xx1 > x0 + width) xx1 = x0 + width;
int xx0 = destPointX - thisScaledRadiusX;
if (xx0 < x0Skipped)
xx0 = x0Skipped;
int xx1 = destPointX + thisScaledRadiusX;
if (xx1 > x0 + width)
xx1 = x0 + width;
// For each point on that row
for (int xx = xx0; xx < xx1; xx++) {
int dx = xx - destPointX;
int kx = dx + scaledRadiusX;
// gOff accounts for our choice to offset the pre-generated kernel by (0.5, 0.5, 0.5) to avoid the zero center.
// gOff accounts for our choice to offset the
// pre-generated kernel by (0.5, 0.5, 0.5) to avoid the
// zero center.
double extrapolation = gx * dx + gy * dy + gz * dz + gOff;
buffer[zz - z0][yy - y0][xx - x0] += kernel[kz][ky][kx] * extrapolation;
@ -435,13 +475,16 @@ public class OpenSimplex2S {
for (int i = 0; i < NEIGHBOR_MAP_3D[0].length; i++) {
int l = point.lattice;
AreaGenLatticePoint3D neighbor = new AreaGenLatticePoint3D(context,
point.xsv + NEIGHBOR_MAP_3D[l][i][0], point.ysv + NEIGHBOR_MAP_3D[l][i][1], point.zsv + NEIGHBOR_MAP_3D[l][i][2], 1 ^ l);
point.xsv + NEIGHBOR_MAP_3D[l][i][0], point.ysv + NEIGHBOR_MAP_3D[l][i][1],
point.zsv + NEIGHBOR_MAP_3D[l][i][2], 1 ^ l);
// If it's in range of the buffer region and not seen before
if (neighbor.destPointX + scaledRadiusX >= x0Skipped && neighbor.destPointX - scaledRadiusX <= x0 + width - 1
&& neighbor.destPointY + scaledRadiusY >= y0Skipped && neighbor.destPointY - scaledRadiusY <= y0 + height - 1
&& neighbor.destPointZ + scaledRadiusZ >= z0Skipped && neighbor.destPointZ - scaledRadiusZ <= z0 + depth - 1
&& !seen.contains(neighbor)) {
if (neighbor.destPointX + scaledRadiusX >= x0Skipped
&& neighbor.destPointX - scaledRadiusX <= x0 + width - 1
&& neighbor.destPointY + scaledRadiusY >= y0Skipped
&& neighbor.destPointY - scaledRadiusY <= y0 + height - 1
&& neighbor.destPointZ + scaledRadiusZ >= z0Skipped
&& neighbor.destPointZ - scaledRadiusZ <= z0 + depth - 1 && !seen.contains(neighbor)) {
// Add it to the queue so we can process it at some point
queue.add(neighbor);
@ -458,7 +501,7 @@ public class OpenSimplex2S {
*/
private static int fastFloor(double x) {
int xi = (int)x;
int xi = (int) x;
return x < xi ? xi - 1 : xi;
}
@ -475,11 +518,35 @@ public class OpenSimplex2S {
for (int i = 0; i < 8; i++) {
int i1, j1, i2, j2;
if ((i & 1) == 0) {
if ((i & 2) == 0) { i1 = -1; j1 = 0; } else { i1 = 1; j1 = 0; }
if ((i & 4) == 0) { i2 = 0; j2 = -1; } else { i2 = 0; j2 = 1; }
if ((i & 2) == 0) {
i1 = -1;
j1 = 0;
} else {
if ((i & 2) != 0) { i1 = 2; j1 = 1; } else { i1 = 0; j1 = 1; }
if ((i & 4) != 0) { i2 = 1; j2 = 2; } else { i2 = 1; j2 = 0; }
i1 = 1;
j1 = 0;
}
if ((i & 4) == 0) {
i2 = 0;
j2 = -1;
} else {
i2 = 0;
j2 = 1;
}
} else {
if ((i & 2) != 0) {
i1 = 2;
j1 = 1;
} else {
i1 = 0;
j1 = 1;
}
if ((i & 4) != 0) {
i2 = 1;
j2 = 2;
} else {
i2 = 1;
j2 = 0;
}
}
LOOKUP_2D[i * 4 + 0] = new LatticePoint2D(0, 0);
LOOKUP_2D[i * 4 + 1] = new LatticePoint2D(1, 1);
@ -489,10 +556,15 @@ public class OpenSimplex2S {
for (int i = 0; i < 8; i++) {
int i1, j1, k1, i2, j2, k2;
i1 = (i >> 0) & 1; j1 = (i >> 1) & 1; k1 = (i >> 2) & 1;
i2 = i1 ^ 1; j2 = j1 ^ 1; k2 = k1 ^ 1;
i1 = (i >> 0) & 1;
j1 = (i >> 1) & 1;
k1 = (i >> 2) & 1;
i2 = i1 ^ 1;
j2 = j1 ^ 1;
k2 = k1 ^ 1;
// The two points within this octant, one from each of the two cubic half-lattices.
// The two points within this octant, one from each of the two cubic
// half-lattices.
LatticePoint3D c0 = new LatticePoint3D(i1, j1, k1, 0);
LatticePoint3D c1 = new LatticePoint3D(i1 + i2, j1 + j2, k1 + k2, 1);
@ -525,27 +597,36 @@ public class OpenSimplex2S {
c1.nextOnFailure = c1.nextOnSuccess = c2;
// If c2 is in range, then we know c3 and c4 are not.
c2.nextOnFailure = c3; c2.nextOnSuccess = c5;
c3.nextOnFailure = c4; c3.nextOnSuccess = c4;
c2.nextOnFailure = c3;
c2.nextOnSuccess = c5;
c3.nextOnFailure = c4;
c3.nextOnSuccess = c4;
// If c4 is in range, then we know c5 is not.
c4.nextOnFailure = c5; c4.nextOnSuccess = c6;
c4.nextOnFailure = c5;
c4.nextOnSuccess = c6;
c5.nextOnFailure = c5.nextOnSuccess = c6;
// If c6 is in range, then we know c7 and c8 are not.
c6.nextOnFailure = c7; c6.nextOnSuccess = c9;
c7.nextOnFailure = c8; c7.nextOnSuccess = c8;
c6.nextOnFailure = c7;
c6.nextOnSuccess = c9;
c7.nextOnFailure = c8;
c7.nextOnSuccess = c8;
// If c8 is in range, then we know c9 is not.
c8.nextOnFailure = c9; c8.nextOnSuccess = cA;
c8.nextOnFailure = c9;
c8.nextOnSuccess = cA;
c9.nextOnFailure = c9.nextOnSuccess = cA;
// If cA is in range, then we know cB and cC are not.
cA.nextOnFailure = cB; cA.nextOnSuccess = cD;
cB.nextOnFailure = cC; cB.nextOnSuccess = cC;
cA.nextOnFailure = cB;
cA.nextOnSuccess = cD;
cB.nextOnFailure = cC;
cB.nextOnSuccess = cC;
// If cC is in range, then we know cD is not.
cC.nextOnFailure = cD; cC.nextOnSuccess = null;
cC.nextOnFailure = cD;
cC.nextOnSuccess = null;
cD.nextOnFailure = cD.nextOnSuccess = null;
LOOKUP_3D[i] = c0;
@ -554,28 +635,24 @@ public class OpenSimplex2S {
}
// Hexagon surrounding each vertex.
private static final int[][] NEIGHBOR_MAP_2D = {
{ 1, 0 }, { 1, 1 }, { 0, 1 }, { 0, -1 }, { -1, -1 }, { -1, 0 }
};
private static final int[][] NEIGHBOR_MAP_2D = { { 1, 0 }, { 1, 1 }, { 0, 1 }, { 0, -1 }, { -1, -1 }, { -1, 0 } };
// Cube surrounding each vertex.
// Alternates between half-lattices.
private static final int[][][] NEIGHBOR_MAP_3D = {
{
{ 1024, 1024, 1024 }, { 1025, 1024, 1024 }, { 1024, 1025, 1024 }, { 1025, 1025, 1024 },
{ 1024, 1024, 1025 }, { 1025, 1024, 1025 }, { 1024, 1025, 1025 }, { 1025, 1025, 1025 }
},
{
{ -1024, -1024, -1024 }, { -1025, -1024, 1024 }, { -1024, -1025, -1024 }, { -1025, -1025, -1024 },
{ -1024, -1024, -1025 }, { -1025, -1024, -1025 }, { -1024, -1025, -1025 }, { -1025, -1025, 1025 }
},
};
{ { 1024, 1024, 1024 }, { 1025, 1024, 1024 }, { 1024, 1025, 1024 }, { 1025, 1025, 1024 },
{ 1024, 1024, 1025 }, { 1025, 1024, 1025 }, { 1024, 1025, 1025 }, { 1025, 1025, 1025 } },
{ { -1024, -1024, -1024 }, { -1025, -1024, 1024 }, { -1024, -1025, -1024 }, { -1025, -1025, -1024 },
{ -1024, -1024, -1025 }, { -1025, -1024, -1025 }, { -1024, -1025, -1025 },
{ -1025, -1025, 1025 } }, };
private static class LatticePoint2D {
int xsv, ysv;
double dx, dy;
public LatticePoint2D(int xsv, int ysv) {
this.xsv = xsv; this.ysv = ysv;
this.xsv = xsv;
this.ysv = ysv;
double ssv = (xsv + ysv) * -0.211324865405187;
this.dx = -xsv - ssv;
this.dy = -ysv - ssv;
@ -586,29 +663,42 @@ public class OpenSimplex2S {
public double dxr, dyr, dzr;
public int xrv, yrv, zrv;
LatticePoint3D nextOnFailure, nextOnSuccess;
public LatticePoint3D(int xrv, int yrv, int zrv, int lattice) {
this.dxr = -xrv + lattice * 0.5; this.dyr = -yrv + lattice * 0.5; this.dzr = -zrv + lattice * 0.5;
this.xrv = xrv + lattice * 1024; this.yrv = yrv + lattice * 1024; this.zrv = zrv + lattice * 1024;
this.dxr = -xrv + lattice * 0.5;
this.dyr = -yrv + lattice * 0.5;
this.dzr = -zrv + lattice * 0.5;
this.xrv = xrv + lattice * 1024;
this.yrv = yrv + lattice * 1024;
this.zrv = zrv + lattice * 1024;
}
}
private static class AreaGenLatticePoint2D {
int xsv, ysv;
int destPointX, destPointY;
public AreaGenLatticePoint2D(GenerateContext2D context, int xsv, int ysv) {
this.xsv = xsv; this.ysv = ysv;
//Matrix multiplication for inverse rotation. Simplex skew transforms have always been shorthand for matrices.
this.destPointX = (int)Math.ceil((context.orientation.t00 * xsv + context.orientation.t01 * ysv) * context.xFrequencyInverse);
this.destPointY = (int)Math.ceil((context.orientation.t10 * xsv + context.orientation.t11 * ysv) * context.yFrequencyInverse);
public AreaGenLatticePoint2D(GenerateContext2D context, int xsv, int ysv) {
this.xsv = xsv;
this.ysv = ysv;
// Matrix multiplication for inverse rotation. Simplex skew
// transforms have always been shorthand for matrices.
this.destPointX = (int) Math
.ceil((context.orientation.t00 * xsv + context.orientation.t01 * ysv) * context.xFrequencyInverse);
this.destPointY = (int) Math
.ceil((context.orientation.t10 * xsv + context.orientation.t11 * ysv) * context.yFrequencyInverse);
}
@Override
public int hashCode() {
return xsv * 7841 + ysv;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof AreaGenLatticePoint2D)) return false;
if (!(obj instanceof AreaGenLatticePoint2D))
return false;
AreaGenLatticePoint2D other = (AreaGenLatticePoint2D) obj;
return (other.xsv == this.xsv && other.ysv == this.ysv);
}
@ -617,15 +707,20 @@ public class OpenSimplex2S {
private static class AreaGenLatticePoint3D {
int xsv, ysv, zsv, lattice;
int destPointX, destPointY, destPointZ;
public AreaGenLatticePoint3D(GenerateContext3D context, int xsv, int ysv, int zsv, int lattice) {
this.xsv = xsv; this.ysv = ysv; this.zsv = zsv; this.lattice = lattice;
this.xsv = xsv;
this.ysv = ysv;
this.zsv = zsv;
this.lattice = lattice;
double xr = (xsv - lattice * 1024.5);
double yr = (ysv - lattice * 1024.5);
double zr = (zsv - lattice * 1024.5);
// Quaternion multiplication for inverse rotation.
// https://blog.molecular-matters.com/2013/05/24/a-faster-quaternion-vector-multiplication/
double qx = -context.orientation.qx, qy = -context.orientation.qy, qz = -context.orientation.qz, qw = context.orientation.qw;
double qx = -context.orientation.qx, qy = -context.orientation.qy, qz = -context.orientation.qz,
qw = context.orientation.qw;
double tx = 2 * (qy * zr - qz * yr);
double ty = 2 * (qz * xr - qx * zr);
double tz = 2 * (qx * yr - qy * xr);
@ -633,19 +728,23 @@ public class OpenSimplex2S {
double yrr = yr + qw * ty + (qz * tx - qx * tz);
double zrr = zr + qw * tz + (qx * ty - qy * tx);
this.destPointX = (int)Math.ceil(xrr * context.xFrequencyInverse);
this.destPointY = (int)Math.ceil(yrr * context.yFrequencyInverse);
this.destPointZ = (int)Math.ceil(zrr * context.zFrequencyInverse);
this.destPointX = (int) Math.ceil(xrr * context.xFrequencyInverse);
this.destPointY = (int) Math.ceil(yrr * context.yFrequencyInverse);
this.destPointZ = (int) Math.ceil(zrr * context.zFrequencyInverse);
}
@Override
public int hashCode() {
return xsv * 2122193 + ysv * 2053 + zsv * 2 + lattice;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof AreaGenLatticePoint3D)) return false;
if (!(obj instanceof AreaGenLatticePoint3D))
return false;
AreaGenLatticePoint3D other = (AreaGenLatticePoint3D) obj;
return (other.xsv == this.xsv && other.ysv == this.ysv && other.zsv == this.zsv && other.lattice == this.lattice);
return (other.xsv == this.xsv && other.ysv == this.ysv && other.zsv == this.zsv
&& other.lattice == this.lattice);
}
}
@ -661,7 +760,8 @@ public class OpenSimplex2S {
int[] kernelBounds;
LatticeOrientation2D orientation;
public GenerateContext2D(LatticeOrientation2D orientation, double xFrequency, double yFrequency, double amplitude) {
public GenerateContext2D(LatticeOrientation2D orientation, double xFrequency, double yFrequency,
double amplitude) {
// These will be used by every call to generate
this.orientation = orientation;
@ -674,19 +774,18 @@ public class OpenSimplex2S {
double preciseScaledRadiusY = Math.sqrt(2.0 / 3.0) * yFrequencyInverse;
// 0.25 because we offset center by 0.5
this.scaledRadiusX = (int)Math.ceil(preciseScaledRadiusX + 0.25);
this.scaledRadiusY = (int)Math.ceil(preciseScaledRadiusY + 0.25);
this.scaledRadiusX = (int) Math.ceil(preciseScaledRadiusX + 0.25);
this.scaledRadiusY = (int) Math.ceil(preciseScaledRadiusY + 0.25);
// So will these
kernel = new double[scaledRadiusY/* * 2*/][];
kernel = new double[scaledRadiusY/* * 2 */][];
kernelBounds = new int[scaledRadiusY * 2];
for (int yy = 0; yy < scaledRadiusY * 2; yy++) {
// Pre-generate boundary of circle
kernelBounds[yy] = (int)Math.ceil(
Math.sqrt(1.0
- (yy + 0.5 - scaledRadiusY) * (yy + 0.5 - scaledRadiusY) / (scaledRadiusY * scaledRadiusY)
) * scaledRadiusX);
kernelBounds[yy] = (int) Math.ceil(Math.sqrt(
1.0 - (yy + 0.5 - scaledRadiusY) * (yy + 0.5 - scaledRadiusY) / (scaledRadiusY * scaledRadiusY))
* scaledRadiusX);
if (yy < scaledRadiusY) {
kernel[yy] = new double[scaledRadiusX * 2];
@ -703,7 +802,7 @@ public class OpenSimplex2S {
kernel[yy][xx] = 0.0;
}
}
} /* else kernel[yy] = kernel[2 * scaledRadiusY - yy - 1];*/
} /* else kernel[yy] = kernel[2 * scaledRadiusY - yy - 1]; */
}
}
}
@ -724,7 +823,8 @@ public class OpenSimplex2S {
int[][] kernelBoundsX;
LatticeOrientation3D orientation;
public GenerateContext3D(LatticeOrientation3D orientation, double xFrequency, double yFrequency, double zFrequency, double amplitude) {
public GenerateContext3D(LatticeOrientation3D orientation, double xFrequency, double yFrequency,
double zFrequency, double amplitude) {
// These will be used by every call to generate
this.orientation = orientation;
@ -740,9 +840,9 @@ public class OpenSimplex2S {
double preciseScaledRadiusZ = Math.sqrt(0.75) * zFrequencyInverse;
// 0.25 because we offset center by 0.5
this.scaledRadiusX = (int)Math.ceil(preciseScaledRadiusX + 0.25);
this.scaledRadiusY = (int)Math.ceil(preciseScaledRadiusY + 0.25);
this.scaledRadiusZ = (int)Math.ceil(preciseScaledRadiusZ + 0.25);
this.scaledRadiusX = (int) Math.ceil(preciseScaledRadiusX + 0.25);
this.scaledRadiusY = (int) Math.ceil(preciseScaledRadiusY + 0.25);
this.scaledRadiusZ = (int) Math.ceil(preciseScaledRadiusZ + 0.25);
// So will these
kernel = new double[scaledRadiusZ * 2][][];
@ -751,9 +851,9 @@ public class OpenSimplex2S {
for (int zz = 0; zz < scaledRadiusZ * 2; zz++) {
// Pre-generate boundary of sphere
kernelBoundsY[zz] = (int)Math.ceil(
Math.sqrt(1.0 - (zz + 0.5 - scaledRadiusZ) * (zz + 0.5 - scaledRadiusZ)
/ (scaledRadiusZ * scaledRadiusZ)) * scaledRadiusY);
kernelBoundsY[zz] = (int) Math.ceil(Math.sqrt(
1.0 - (zz + 0.5 - scaledRadiusZ) * (zz + 0.5 - scaledRadiusZ) / (scaledRadiusZ * scaledRadiusZ))
* scaledRadiusY);
if (zz < scaledRadiusZ) {
kernel[zz] = new double[scaledRadiusY * 2][];
@ -767,11 +867,12 @@ public class OpenSimplex2S {
for (int yy = 0; yy < scaledRadiusY * 2; yy++) {
// Pre-generate boundary of sphere
kernelBoundsX[zz][yy] = (int)Math.ceil(
Math.sqrt(1.0
- (yy + 0.5 - scaledRadiusY) * (yy + 0.5 - scaledRadiusY) / (scaledRadiusY * scaledRadiusY)
- (zz + 0.5 - scaledRadiusZ) * (zz + 0.5 - scaledRadiusZ) / (scaledRadiusZ * scaledRadiusZ)
) * scaledRadiusX);
kernelBoundsX[zz][yy] = (int) Math.ceil(Math.sqrt(1.0
- (yy + 0.5 - scaledRadiusY) * (yy + 0.5 - scaledRadiusY)
/ (scaledRadiusY * scaledRadiusY)
- (zz + 0.5 - scaledRadiusZ) * (zz + 0.5 - scaledRadiusZ)
/ (scaledRadiusZ * scaledRadiusZ))
* scaledRadiusX);
if (yy < scaledRadiusY) {
kernel[zz][yy] = new double[scaledRadiusX * 2];
@ -790,7 +891,8 @@ public class OpenSimplex2S {
}
}
} else kernel[zz][yy] = kernel[zz][2 * scaledRadiusY - yy - 1];
} else
kernel[zz][yy] = kernel[zz][2 * scaledRadiusY - yy - 1];
}
}
}
@ -798,40 +900,50 @@ public class OpenSimplex2S {
}
public enum LatticeOrientation2D {
// Simplex skew transforms have always been shorthand for the matrices they represent.
// But when we bake the rotation into the skew transform, we need to use the general form.
Standard(GRADIENTS_2D,
1.366025403784439, 0.366025403784439, 0.366025403784439, 1.366025403784439,
0.788675134594813, -0.211324865405187, -0.211324865405187, 0.788675134594813),
XBeforeY(GRADIENTS_2D_X_BEFORE_Y,
0.7071067811865476, 1.224744871380249, -0.7071067811865476, 1.224744871380249,
0.7071067811865476, -0.7071067811865476, 0.40824829046764305, 0.40824829046764305);
// Simplex skew transforms have always been shorthand for the matrices
// they represent.
// But when we bake the rotation into the skew transform, we need to use
// the general form.
Standard(GRADIENTS_2D, 1.366025403784439, 0.366025403784439, 0.366025403784439, 1.366025403784439,
0.788675134594813, -0.211324865405187, -0.211324865405187,
0.788675134594813), XBeforeY(GRADIENTS_2D_X_BEFORE_Y, 0.7071067811865476, 1.224744871380249,
-0.7071067811865476, 1.224744871380249, 0.7071067811865476, -0.7071067811865476,
0.40824829046764305, 0.40824829046764305);
Grad2[] gradients;
double s00, s01, s10, s11;
double t00, t01, t10, t11;
private LatticeOrientation2D(Grad2[] gradients,
double s00, double s01, double s10, double s11,
double t00, double t01, double t10, double t11) {
private LatticeOrientation2D(Grad2[] gradients, double s00, double s01, double s10, double s11, double t00,
double t01, double t10, double t11) {
this.gradients = gradients;
this.s00 = s00; this.s01 = s01; this.s10 = s10; this.s11 = s11;
this.t00 = t00; this.t01 = t01; this.t10 = t10; this.t11 = t11;
this.s00 = s00;
this.s01 = s01;
this.s10 = s10;
this.s11 = s11;
this.t00 = t00;
this.t01 = t01;
this.t10 = t10;
this.t11 = t11;
}
}
public enum LatticeOrientation3D {
// Quaternions for 3D. Could use matrices, but I already wrote this code before I moved them into here.
Classic(GRADIENTS_3D_CLASSIC, 0.577350269189626, 0.577350269189626, 0.577350269189626, 0),
XYBeforeZ(GRADIENTS_3D_XY_BEFORE_Z, 0.3250575836718682, -0.3250575836718682, 0, 0.8880738339771154),
XZBeforeY(GRADIENTS_3D_XZ_BEFORE_Y, -0.3250575836718682, 0, 0.3250575836718682, 0.8880738339771154);
// Quaternions for 3D. Could use matrices, but I already wrote this code
// before I moved them into here.
Classic(GRADIENTS_3D_CLASSIC, 0.577350269189626, 0.577350269189626, 0.577350269189626, 0), XYBeforeZ(
GRADIENTS_3D_XY_BEFORE_Z, 0.3250575836718682, -0.3250575836718682, 0, 0.8880738339771154), XZBeforeY(
GRADIENTS_3D_XZ_BEFORE_Y, -0.3250575836718682, 0, 0.3250575836718682, 0.8880738339771154);
Grad3[] gradients;
double qx, qy, qz, qw;
private LatticeOrientation3D(Grad3[] gradients, double qx, double qy, double qz, double qw) {
this.gradients = gradients;
this.qx = qx; this.qy = qy; this.qz = qz; this.qw = qw;
this.qx = qx;
this.qy = qy;
this.qz = qz;
this.qw = qw;
}
}
@ -841,15 +953,20 @@ public class OpenSimplex2S {
public static class Grad2 {
double dx, dy;
public Grad2(double dx, double dy) {
this.dx = dx; this.dy = dy;
this.dx = dx;
this.dy = dy;
}
}
public static class Grad3 {
double dx, dy, dz;
public Grad3(double dx, double dy, double dz) {
this.dx = dx; this.dy = dy; this.dz = dz;
this.dx = dx;
this.dy = dy;
this.dz = dz;
}
}
@ -861,35 +978,23 @@ public class OpenSimplex2S {
GRADIENTS_2D = new Grad2[PSIZE];
GRADIENTS_2D_X_BEFORE_Y = new Grad2[PSIZE];
Grad2[] grad2 = {
new Grad2( 0.130526192220052, 0.99144486137381),
new Grad2( 0.38268343236509, 0.923879532511287),
new Grad2( 0.608761429008721, 0.793353340291235),
new Grad2( 0.793353340291235, 0.608761429008721),
new Grad2( 0.923879532511287, 0.38268343236509),
new Grad2( 0.99144486137381, 0.130526192220051),
new Grad2( 0.99144486137381, -0.130526192220051),
new Grad2( 0.923879532511287, -0.38268343236509),
new Grad2( 0.793353340291235, -0.60876142900872),
new Grad2( 0.608761429008721, -0.793353340291235),
new Grad2( 0.38268343236509, -0.923879532511287),
new Grad2( 0.130526192220052, -0.99144486137381),
new Grad2(-0.130526192220052, -0.99144486137381),
new Grad2(-0.38268343236509, -0.923879532511287),
new Grad2(-0.608761429008721, -0.793353340291235),
new Grad2(-0.793353340291235, -0.608761429008721),
new Grad2(-0.923879532511287, -0.38268343236509),
new Grad2(-0.99144486137381, -0.130526192220052),
new Grad2(-0.99144486137381, 0.130526192220051),
new Grad2(-0.923879532511287, 0.38268343236509),
new Grad2(-0.793353340291235, 0.608761429008721),
new Grad2(-0.608761429008721, 0.793353340291235),
new Grad2(-0.38268343236509, 0.923879532511287),
new Grad2(-0.130526192220052, 0.99144486137381)
};
Grad2[] grad2 = { new Grad2(0.130526192220052, 0.99144486137381),
new Grad2(0.38268343236509, 0.923879532511287), new Grad2(0.608761429008721, 0.793353340291235),
new Grad2(0.793353340291235, 0.608761429008721), new Grad2(0.923879532511287, 0.38268343236509),
new Grad2(0.99144486137381, 0.130526192220051), new Grad2(0.99144486137381, -0.130526192220051),
new Grad2(0.923879532511287, -0.38268343236509), new Grad2(0.793353340291235, -0.60876142900872),
new Grad2(0.608761429008721, -0.793353340291235), new Grad2(0.38268343236509, -0.923879532511287),
new Grad2(0.130526192220052, -0.99144486137381), new Grad2(-0.130526192220052, -0.99144486137381),
new Grad2(-0.38268343236509, -0.923879532511287), new Grad2(-0.608761429008721, -0.793353340291235),
new Grad2(-0.793353340291235, -0.608761429008721), new Grad2(-0.923879532511287, -0.38268343236509),
new Grad2(-0.99144486137381, -0.130526192220052), new Grad2(-0.99144486137381, 0.130526192220051),
new Grad2(-0.923879532511287, 0.38268343236509), new Grad2(-0.793353340291235, 0.608761429008721),
new Grad2(-0.608761429008721, 0.793353340291235), new Grad2(-0.38268343236509, 0.923879532511287),
new Grad2(-0.130526192220052, 0.99144486137381) };
Grad2[] grad2XBeforeY = new Grad2[grad2.length];
for (int i = 0; i < grad2.length; i++) {
grad2[i].dx /= N2; grad2[i].dy /= N2;
grad2[i].dx /= N2;
grad2[i].dy /= N2;
// Unrotated gradients for XBeforeY 2D
double xx = grad2[i].dx * 0.7071067811865476;
@ -905,77 +1010,59 @@ public class OpenSimplex2S {
GRADIENTS_3D_CLASSIC = new Grad3[PSIZE];
GRADIENTS_3D_XY_BEFORE_Z = new Grad3[PSIZE];
GRADIENTS_3D_XZ_BEFORE_Y = new Grad3[PSIZE];
Grad3[] grad3 = {
new Grad3(-2.22474487139, -2.22474487139, -1.0),
Grad3[] grad3 = { new Grad3(-2.22474487139, -2.22474487139, -1.0),
new Grad3(-2.22474487139, -2.22474487139, 1.0),
new Grad3(-3.0862664687972017, -1.1721513422464978, 0.0),
new Grad3(-1.1721513422464978, -3.0862664687972017, 0.0),
new Grad3(-2.22474487139, -1.0, -2.22474487139),
new Grad3(-2.22474487139, 1.0, -2.22474487139),
new Grad3(-2.22474487139, -1.0, -2.22474487139), new Grad3(-2.22474487139, 1.0, -2.22474487139),
new Grad3(-1.1721513422464978, 0.0, -3.0862664687972017),
new Grad3(-3.0862664687972017, 0.0, -1.1721513422464978),
new Grad3(-2.22474487139, -1.0, 2.22474487139),
new Grad3(-2.22474487139, 1.0, 2.22474487139),
new Grad3(-2.22474487139, -1.0, 2.22474487139), new Grad3(-2.22474487139, 1.0, 2.22474487139),
new Grad3(-3.0862664687972017, 0.0, 1.1721513422464978),
new Grad3(-1.1721513422464978, 0.0, 3.0862664687972017),
new Grad3(-2.22474487139, 2.22474487139, -1.0),
new Grad3(-2.22474487139, 2.22474487139, 1.0),
new Grad3(-1.1721513422464978, 3.0862664687972017, 0.0),
new Grad3(-1.1721513422464978, 0.0, 3.0862664687972017), new Grad3(-2.22474487139, 2.22474487139, -1.0),
new Grad3(-2.22474487139, 2.22474487139, 1.0), new Grad3(-1.1721513422464978, 3.0862664687972017, 0.0),
new Grad3(-3.0862664687972017, 1.1721513422464978, 0.0),
new Grad3(-1.0, -2.22474487139, -2.22474487139),
new Grad3( 1.0, -2.22474487139, -2.22474487139),
new Grad3( 0.0, -3.0862664687972017, -1.1721513422464978),
new Grad3( 0.0, -1.1721513422464978, -3.0862664687972017),
new Grad3(-1.0, -2.22474487139, 2.22474487139),
new Grad3( 1.0, -2.22474487139, 2.22474487139),
new Grad3( 0.0, -1.1721513422464978, 3.0862664687972017),
new Grad3( 0.0, -3.0862664687972017, 1.1721513422464978),
new Grad3(-1.0, 2.22474487139, -2.22474487139),
new Grad3( 1.0, 2.22474487139, -2.22474487139),
new Grad3( 0.0, 1.1721513422464978, -3.0862664687972017),
new Grad3( 0.0, 3.0862664687972017, -1.1721513422464978),
new Grad3(-1.0, 2.22474487139, 2.22474487139),
new Grad3( 1.0, 2.22474487139, 2.22474487139),
new Grad3( 0.0, 3.0862664687972017, 1.1721513422464978),
new Grad3( 0.0, 1.1721513422464978, 3.0862664687972017),
new Grad3( 2.22474487139, -2.22474487139, -1.0),
new Grad3( 2.22474487139, -2.22474487139, 1.0),
new Grad3( 1.1721513422464978, -3.0862664687972017, 0.0),
new Grad3( 3.0862664687972017, -1.1721513422464978, 0.0),
new Grad3( 2.22474487139, -1.0, -2.22474487139),
new Grad3( 2.22474487139, 1.0, -2.22474487139),
new Grad3( 3.0862664687972017, 0.0, -1.1721513422464978),
new Grad3( 1.1721513422464978, 0.0, -3.0862664687972017),
new Grad3( 2.22474487139, -1.0, 2.22474487139),
new Grad3( 2.22474487139, 1.0, 2.22474487139),
new Grad3( 1.1721513422464978, 0.0, 3.0862664687972017),
new Grad3( 3.0862664687972017, 0.0, 1.1721513422464978),
new Grad3( 2.22474487139, 2.22474487139, -1.0),
new Grad3( 2.22474487139, 2.22474487139, 1.0),
new Grad3( 3.0862664687972017, 1.1721513422464978, 0.0),
new Grad3( 1.1721513422464978, 3.0862664687972017, 0.0)
};
new Grad3(-1.0, -2.22474487139, -2.22474487139), new Grad3(1.0, -2.22474487139, -2.22474487139),
new Grad3(0.0, -3.0862664687972017, -1.1721513422464978),
new Grad3(0.0, -1.1721513422464978, -3.0862664687972017),
new Grad3(-1.0, -2.22474487139, 2.22474487139), new Grad3(1.0, -2.22474487139, 2.22474487139),
new Grad3(0.0, -1.1721513422464978, 3.0862664687972017),
new Grad3(0.0, -3.0862664687972017, 1.1721513422464978), new Grad3(-1.0, 2.22474487139, -2.22474487139),
new Grad3(1.0, 2.22474487139, -2.22474487139), new Grad3(0.0, 1.1721513422464978, -3.0862664687972017),
new Grad3(0.0, 3.0862664687972017, -1.1721513422464978), new Grad3(-1.0, 2.22474487139, 2.22474487139),
new Grad3(1.0, 2.22474487139, 2.22474487139), new Grad3(0.0, 3.0862664687972017, 1.1721513422464978),
new Grad3(0.0, 1.1721513422464978, 3.0862664687972017), new Grad3(2.22474487139, -2.22474487139, -1.0),
new Grad3(2.22474487139, -2.22474487139, 1.0), new Grad3(1.1721513422464978, -3.0862664687972017, 0.0),
new Grad3(3.0862664687972017, -1.1721513422464978, 0.0), new Grad3(2.22474487139, -1.0, -2.22474487139),
new Grad3(2.22474487139, 1.0, -2.22474487139), new Grad3(3.0862664687972017, 0.0, -1.1721513422464978),
new Grad3(1.1721513422464978, 0.0, -3.0862664687972017), new Grad3(2.22474487139, -1.0, 2.22474487139),
new Grad3(2.22474487139, 1.0, 2.22474487139), new Grad3(1.1721513422464978, 0.0, 3.0862664687972017),
new Grad3(3.0862664687972017, 0.0, 1.1721513422464978), new Grad3(2.22474487139, 2.22474487139, -1.0),
new Grad3(2.22474487139, 2.22474487139, 1.0), new Grad3(3.0862664687972017, 1.1721513422464978, 0.0),
new Grad3(1.1721513422464978, 3.0862664687972017, 0.0) };
Grad3[] grad3Classic = new Grad3[grad3.length];
Grad3[] grad3XYBeforeZ = new Grad3[grad3.length];
Grad3[] grad3XZBeforeY = new Grad3[grad3.length];
for (int i = 0; i < grad3.length; i++) {
grad3[i].dx /= N3; grad3[i].dy /= N3; grad3[i].dz /= N3;
grad3[i].dx /= N3;
grad3[i].dy /= N3;
grad3[i].dz /= N3;
double gxr = grad3[i].dx, gyr = grad3[i].dy, gzr = grad3[i].dz;
// Unrotated gradients for classic 3D
double grr = (2.0 / 3.0) * (gxr + gyr + gzr);
// double dx = grr - gxr, dy = grr - gyr, dz = grr - gzr;
grad3Classic[i] = new Grad3( grr - gxr, grr - gyr, grr - gzr );
// double dx = grr - gxr, dy = grr - gyr, dz = grr - gzr;
grad3Classic[i] = new Grad3(grr - gxr, grr - gyr, grr - gzr);
// Unrotated gradients for XYBeforeZ 3D
double s2 = (gxr + gyr) * -0.211324865405187;
double zz = gzr * 0.577350269189626;
grad3XYBeforeZ[i] = new Grad3( gxr + s2 + zz, gyr + s2 + zz, (gzr - gxr - gyr) * 0.577350269189626 );
grad3XYBeforeZ[i] = new Grad3(gxr + s2 + zz, gyr + s2 + zz, (gzr - gxr - gyr) * 0.577350269189626);
// Unrotated gradients for plane-first 3D
s2 = (gxr + gzr) * -0.211324865405187;
double yy = gyr * 0.577350269189626;
grad3XZBeforeY[i] = new Grad3( gxr + s2 + yy, (gyr - gxr - gzr) * 0.577350269189626, gzr + s2 + yy );
grad3XZBeforeY[i] = new Grad3(gxr + s2 + yy, (gyr - gxr - gzr) * 0.577350269189626, gzr + s2 + yy);
}
for (int i = 0; i < PSIZE; i++) {
GRADIENTS_3D[i] = grad3[i % grad3.length];

View File

@ -611,8 +611,7 @@ public class ArrayUtil {
int end = offset + length;
if (end > arrayLength || offset < 0)
throw new IllegalArgumentException(
"Array contains [0; " + arrayLength + "), requested [" + offset + "; " + end + ")"
);
"Array contains [0; " + arrayLength + "), requested [" + offset + "; " + end + ")");
return length;
}
@ -628,8 +627,7 @@ public class ArrayUtil {
if (end > arrayLength || start < 0)
throw new IllegalArgumentException(
"Array contains [0; " + arrayLength + "), requested [" + start + "; " + end + ")"
);
"Array contains [0; " + arrayLength + "), requested [" + start + "; " + end + ")");
return end;
}

View File

@ -30,18 +30,8 @@ public class PrimitiveUtil {
private static final Map<Class<?>, Object> PRIMITIVE_TO_NULL = new HashMap<>();
static {
for (
Class<?> boxed : new Class<?>[] {
Boolean.class,
Byte.class,
Short.class,
Character.class,
Integer.class,
Long.class,
Float.class,
Double.class
}
) {
for (Class<?> boxed : new Class<?>[] { Boolean.class, Byte.class, Short.class, Character.class, Integer.class,
Long.class, Float.class, Double.class }) {
try {
PRIMITIVE_TO_BOXED.put((Class<?>) boxed.getField("TYPE").get(null), boxed);
} catch (Exception e) {

View File

@ -40,8 +40,7 @@ import java.util.stream.Stream;
/**
* Contains static methods to create {@link Stream Streams} that synchronize
* their
* <a href=
* their <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
* terminal operations</a> on a given monitor.
*
@ -1070,21 +1069,18 @@ public class SyncStreams {
}
/**
* Wraps the given {@link Stream} to make all
* <a href=
* Wraps the given {@link Stream} to make all <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
* terminal operations</a> acquire the provided monitor's lock before
* execution. Intermediate operations
* return streams that are also synchronized on the same object. The created
* stream will behave identically
* to the provided stream in all other aspects. Use this to synchronize
* access to stream's source.
* execution. Intermediate operations return streams that are also
* synchronized on the same object. The created stream will behave
* identically to the provided stream in all other aspects. Use this to
* synchronize access to stream's source.
* <p>
* <i>The returned {@code Stream}'s {@link Stream#iterator() iterator()} and
* {@link Stream#spliterator()
* spliterator()} methods return regular non-synchronized iterators and
* spliterators respectively</i>. It
* is the user's responsibility to avoid concurrency issues:
* {@link Stream#spliterator() spliterator()} methods return regular
* non-synchronized iterators and spliterators respectively</i>. It is the
* user's responsibility to avoid concurrency issues:
*
* <pre>
* synchronized (stream.getMonitor()) {
@ -1103,14 +1099,17 @@ public class SyncStreams {
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
* </pre>
*
* @param <T> the class of objects in the Stream
* @param stream the stream to wrap.
* @param monitor the object that the stream will use for synchronization.
* When {@code null}, the stream
* will synchronize on itself.
* @param <T>
* the class of objects in the Stream
* @param stream
* the stream to wrap.
* @param monitor
* the object that the stream will use for synchronization. When
* {@code null}, the stream will synchronize on itself.
* @return a {@link SyncStream SyncStream&lt;T&gt;} synchronized on
* {@code monitor} and backed by {@code stream}.
* @throws NullPointerException if {@code stream == null}.
* @throws NullPointerException
* if {@code stream == null}.
*/
public static <T> SyncStream<T> synchronizedStream(Stream<T> stream, Object monitor) {
Objects.requireNonNull(stream, "stream cannot be null");
@ -1118,22 +1117,19 @@ public class SyncStreams {
}
/**
* Wraps the given {@link IntStream} to make all
* <a href=
* Wraps the given {@link IntStream} to make all <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
* terminal operations</a> acquire the provided monitor's lock before
* execution. Intermediate operations
* return streams that are also synchronized on the same object. The created
* stream will behave identically
* to the provided stream in all other aspects. Use this to synchronize
* access to stream's source.
* execution. Intermediate operations return streams that are also
* synchronized on the same object. The created stream will behave
* identically to the provided stream in all other aspects. Use this to
* synchronize access to stream's source.
* <p>
* <i>The returned {@code IntStream}'s {@link IntStream#iterator()
* iterator()} and
* {@link IntStream#spliterator() spliterator()} methods return regular
* non-synchronized iterators and
* spliterators respectively</i>. It is the user's responsibility to avoid
* concurrency issues:
* iterator()} and {@link IntStream#spliterator() spliterator()} methods
* return regular non-synchronized iterators and spliterators
* respectively</i>. It is the user's responsibility to avoid concurrency
* issues:
*
* <pre>
* synchronized (stream.getMonitor()) {
@ -1152,13 +1148,15 @@ public class SyncStreams {
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
* </pre>
*
* @param stream the stream to wrap.
* @param monitor the object that the stream will use for synchronization.
* When {@code null}, the stream
* will synchronize on itself.
* @param stream
* the stream to wrap.
* @param monitor
* the object that the stream will use for synchronization. When
* {@code null}, the stream will synchronize on itself.
* @return a {@link SyncIntStream} synchronized on {@code monitor} and
* backed by {@code stream}.
* @throws NullPointerException if {@code stream == null}.
* @throws NullPointerException
* if {@code stream == null}.
*/
public static SyncIntStream synchronizedStream(IntStream stream, Object monitor) {
Objects.requireNonNull(stream, "stream cannot be null");
@ -1166,22 +1164,19 @@ public class SyncStreams {
}
/**
* Wraps the given {@link LongStream} to make all
* <a href=
* Wraps the given {@link LongStream} to make all <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
* terminal operations</a> acquire the provided monitor's lock before
* execution. Intermediate operations
* return streams that are also synchronized on the same object. The created
* stream will behave identically
* to the provided stream in all other aspects. Use this to synchronize
* access to stream's source.
* execution. Intermediate operations return streams that are also
* synchronized on the same object. The created stream will behave
* identically to the provided stream in all other aspects. Use this to
* synchronize access to stream's source.
* <p>
* <i>The returned {@code LongStream}'s {@link LongStream#iterator()
* iterator()} and
* {@link LongStream#spliterator() spliterator()} methods return regular
* non-synchronized iterators and
* spliterators respectively</i>. It is the user's responsibility to avoid
* concurrency issues:
* iterator()} and {@link LongStream#spliterator() spliterator()} methods
* return regular non-synchronized iterators and spliterators
* respectively</i>. It is the user's responsibility to avoid concurrency
* issues:
*
* <pre>
* synchronized (stream.getMonitor()) {
@ -1200,13 +1195,15 @@ public class SyncStreams {
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
* </pre>
*
* @param stream the stream to wrap.
* @param monitor the object that the stream will use for synchronization.
* When {@code null}, the stream
* will synchronize on itself.
* @param stream
* the stream to wrap.
* @param monitor
* the object that the stream will use for synchronization. When
* {@code null}, the stream will synchronize on itself.
* @return a {@link SyncLongStream} synchronized on {@code monitor} and
* backed by {@code stream}.
* @throws NullPointerException if {@code stream == null}.
* @throws NullPointerException
* if {@code stream == null}.
*/
public static SyncLongStream synchronizedStream(LongStream stream, Object monitor) {
Objects.requireNonNull(stream, "stream cannot be null");
@ -1214,22 +1211,19 @@ public class SyncStreams {
}
/**
* Wraps the given {@link DoubleStream} to make all
* <a href=
* Wraps the given {@link DoubleStream} to make all <a href=
* "https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#StreamOps">
* terminal operations</a> acquire the provided monitor's lock before
* execution. Intermediate operations
* return streams that are also synchronized on the same object. The created
* stream will behave identically
* to the provided stream in all other aspects. Use this to synchronize
* access to stream's source.
* execution. Intermediate operations return streams that are also
* synchronized on the same object. The created stream will behave
* identically to the provided stream in all other aspects. Use this to
* synchronize access to stream's source.
* <p>
* <i>The returned {@code DoubleStream}'s {@link DoubleStream#iterator()
* iterator()} and
* {@link DoubleStream#spliterator() spliterator()} methods return regular
* non-synchronized iterators and
* spliterators respectively</i>. It is the user's responsibility to avoid
* concurrency issues:
* iterator()} and {@link DoubleStream#spliterator() spliterator()} methods
* return regular non-synchronized iterators and spliterators
* respectively</i>. It is the user's responsibility to avoid concurrency
* issues:
*
* <pre>
* synchronized (stream.getMonitor()) {
@ -1248,13 +1242,15 @@ public class SyncStreams {
* stream.forEach(System.out::println); // Should never throw a ConcurrentModificationException
* </pre>
*
* @param stream the stream to wrap.
* @param monitor the object that the stream will use for synchronization.
* When {@code null}, the stream
* will synchronize on itself.
* @param stream
* the stream to wrap.
* @param monitor
* the object that the stream will use for synchronization. When
* {@code null}, the stream will synchronize on itself.
* @return a {@link SyncDoubleStream} synchronized on {@code monitor} and
* backed by {@code stream}.
* @throws NullPointerException if {@code stream == null}.
* @throws NullPointerException
* if {@code stream == null}.
*/
public static SyncDoubleStream synchronizedStream(DoubleStream stream, Object monitor) {
Objects.requireNonNull(stream, "stream cannot be null");

View File

@ -108,7 +108,7 @@ public class CharArrayIterator implements CharacterIterator {
return pos;
}
// @SuppressWarnings("all") Just STFU, this _is_ terrific
// @SuppressWarnings("all") Just STFU, this _is_ terrific
// SonarLint: "clone" should not be overridden (java:S2975)
// And I wouldn't have done that if only CharacterIterator had not required

View File

@ -103,14 +103,8 @@ public class Escaper {
}
public static final Escaper JAVA = new Escaper(
'\\',
'u',
"tbnrf'\"".toCharArray(),
"\t\b\n\r\f\'\"".toCharArray(),
true,
true
);
public static final Escaper JAVA = new Escaper('\\', 'u', "tbnrf'\"".toCharArray(), "\t\b\n\r\f\'\"".toCharArray(),
true, true);
private final char escapeChar;
private final char unicodeEscapeChar;
@ -120,14 +114,8 @@ public class Escaper {
private final boolean preferUnicode;
private final boolean strict;
protected Escaper(
char escapeChar,
char unicodeEscapeChar,
char[] safes,
char[] unsafes,
boolean preferUnicode,
boolean strict
) {
protected Escaper(char escapeChar, char unicodeEscapeChar, char[] safes, char[] unsafes, boolean preferUnicode,
boolean strict) {
this.escapeChar = escapeChar;
this.unicodeEscapeChar = unicodeEscapeChar;
this.safes = safes;
@ -152,8 +140,7 @@ public class Escaper {
for (char c : unsafes) {
if (c == escapeChar)
throw new IllegalArgumentException(
"Unsafe characters contain escape chatacter (escape character is escaped automatically)"
);
"Unsafe characters contain escape chatacter (escape character is escaped automatically)");
if (c == unicodeEscapeChar)
throw new IllegalArgumentException("Unsafe characters contain Unicode escape chatacter");
}
@ -173,11 +160,7 @@ public class Escaper {
end = Integer.MAX_VALUE;
else
end = src.getPosition() + length;
while (
src.has() &&
src.getPosition() < end &&
(until == null || !until.test(src.current()))
)
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current())))
escape(src.consume(), output);
}
@ -225,11 +208,7 @@ public class Escaper {
int result = 0;
while (
src.has() &&
src.getPosition() < end &&
(until == null || !until.test(src.current()))
) {
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current()))) {
result += getEscapedLength(src.consume());
}
@ -257,11 +236,7 @@ public class Escaper {
end = Integer.MAX_VALUE;
else
end = src.getPosition() + length;
while (
src.has() &&
src.getPosition() < end &&
(until == null || !until.test(src.current()))
) {
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current()))) {
output.accept(unescapeOneSequence(src));
}
}
@ -282,10 +257,8 @@ public class Escaper {
if (src.current() == unicodeEscapeChar) {
src.next();
return (char) (hexValue(src.consume()) << (4 * 3) |
hexValue(src.consume()) << (4 * 2) |
hexValue(src.consume()) << (4 * 1) |
hexValue(src.consume()) << (4 * 0));
return (char) (hexValue(src.consume()) << (4 * 3) | hexValue(src.consume()) << (4 * 2)
| hexValue(src.consume()) << (4 * 1) | hexValue(src.consume()) << (4 * 0));
}
int index = ArrayUtil.firstIndexOf(safes, src.current());
@ -315,11 +288,7 @@ public class Escaper {
int result = 0;
while (
src.has() &&
src.getPosition() < end &&
(until == null || !until.test(src.current()))
) {
while (src.has() && src.getPosition() < end && (until == null || !until.test(src.current()))) {
skipOneSequence(src);
result++;
}
@ -328,11 +297,7 @@ public class Escaper {
}
public void skipOneSequence(CharReader src) {
if (
src.current() == escapeChar
&&
src.next() == unicodeEscapeChar
) {
if (src.current() == escapeChar && src.next() == unicodeEscapeChar) {
src.advance(4);
}
src.next();

View File

@ -86,7 +86,7 @@ public class FancyCharacterIterator implements CharacterIterator {
return sb.toString();
}
// @SuppressWarnings("all") Just STFU, this _is_ terrific
// @SuppressWarnings("all") Just STFU, this _is_ terrific
// SonarLint: "clone" should not be overridden (java:S2975)
// And I wouldn't have done that if only CharacterIterator had not required

View File

@ -41,13 +41,8 @@ public class StringUtil {
private static final String EMPTY_PLACEHOLDER = "[empty]";
private static final String DEFAULT_SEPARATOR = "; ";
public static <T> String arrayToString(
T[] array,
String separator,
String empty,
String nullPlaceholder,
String nullArray
) {
public static <T> String arrayToString(T[] array, String separator, String empty, String nullPlaceholder,
String nullArray) {
if (separator == null) {
throw new IllegalArgumentException(new NullPointerException());
@ -79,13 +74,8 @@ public class StringUtil {
return arrayToString(array, DEFAULT_SEPARATOR);
}
public static String iteratorToString(
Iterator<?> iterator,
String separator,
String empty,
String nullPlaceholder,
String nullIterator
) {
public static String iteratorToString(Iterator<?> iterator, String separator, String empty, String nullPlaceholder,
String nullIterator) {
if (separator == null) {
throw new IllegalArgumentException(new NullPointerException());
@ -119,13 +109,8 @@ public class StringUtil {
return iteratorToString(iterator, DEFAULT_SEPARATOR);
}
public static String iterableToString(
Iterable<?> iterable,
String separator,
String empty,
String nullPlaceholder,
String nullIterable
) {
public static String iterableToString(Iterable<?> iterable, String separator, String empty, String nullPlaceholder,
String nullIterable) {
if (separator == null) {
throw new IllegalArgumentException(new NullPointerException());
@ -146,14 +131,8 @@ public class StringUtil {
return iterableToString(iterable, DEFAULT_SEPARATOR);
}
public static <T> String supplierToString(
IntFunction<T> supplier,
int length,
String separator,
String empty,
String nullPlaceholder,
String nullSupplier
) {
public static <T> String supplierToString(IntFunction<T> supplier, int length, String separator, String empty,
String nullPlaceholder, String nullSupplier) {
if (separator == null)
throw new IllegalArgumentException(new NullPointerException());
@ -163,28 +142,15 @@ public class StringUtil {
return empty;
if (length > 0) {
return supplierToStringExactly(
supplier,
length,
separator,
nullPlaceholder
);
return supplierToStringExactly(supplier, length, separator, nullPlaceholder);
} else {
return supplierToStringUntilNull(
supplier,
separator,
empty
);
return supplierToStringUntilNull(supplier, separator, empty);
}
}
private static <T> String supplierToStringExactly(
IntFunction<T> supplier,
int length,
String separator,
String nullPlaceholder
) {
private static <T> String supplierToStringExactly(IntFunction<T> supplier, int length, String separator,
String nullPlaceholder) {
T element = supplier.apply(0);
StringBuilder sb = new StringBuilder(element == null ? nullPlaceholder : element.toString());
@ -198,11 +164,7 @@ public class StringUtil {
return sb.toString();
}
private static <T> String supplierToStringUntilNull(
IntFunction<T> supplier,
String separator,
String empty
) {
private static <T> String supplierToStringUntilNull(IntFunction<T> supplier, String separator, String empty) {
T element = supplier.apply(0);
if (element == null) {
@ -366,11 +328,7 @@ public class StringUtil {
StringBuilder sb = new StringBuilder();
charLoop: for (char c : src.toCharArray()) {
if (
(resultIndex + 1) < arrayLength
&&
test.test(c)
) {
if ((resultIndex + 1) < arrayLength && test.test(c)) {
result[resultIndex] = resetStringBuilder(sb);
++resultIndex;
continue charLoop;
@ -389,17 +347,17 @@ public class StringUtil {
* index.
* <p>
* Indices {@code 0} and {@code src.length() - 1} produce {@code str}
* excluding
* the specified character and {@code ""}.
* excluding the specified character and {@code ""}.
* <p>
*
* @param src the String to split
* @param at index to split at
* @throws IllegalArgumentException if the index is out of bounds for
* {@code src}
* @param src
* the String to split
* @param at
* index to split at
* @throws IllegalArgumentException
* if the index is out of bounds for {@code src}
* @return an array containing the substrings, in order of encounter in
* {@code src}.
* Its length is always 2.
* {@code src}. Its length is always 2.
*/
public static String[] splitAt(String src, int at) {
Objects.requireNonNull(src, "src");
@ -416,10 +374,7 @@ public class StringUtil {
return new String[] { src.substring(0, src.length() - 1), "" };
}
return new String[] {
src.substring(0, at),
src.substring(at + 1)
};
return new String[] { src.substring(0, at), src.substring(at + 1) };
}
/**
@ -427,8 +382,7 @@ public class StringUtil {
* indices.
* <p>
* Indices {@code 0} and {@code src.length() - 1} produce extra zero-length
* outputs.
* Duplicate indices produce extra zero-length outputs.
* outputs. Duplicate indices produce extra zero-length outputs.
* <p>
* Examples:
*
@ -439,13 +393,14 @@ public class StringUtil {
* splitAt("a.b", 1, 1, 1) -> {"a", "", "", "b"}
* </pre>
*
* @param src the String to split
* @param at indices to split at, in any order
* @throws IllegalArgumentException if some index is out of bounds for
* {@code src}
* @param src
* the String to split
* @param at
* indices to split at, in any order
* @throws IllegalArgumentException
* if some index is out of bounds for {@code src}
* @return an array containing the substrings, in order of encounter in
* {@code src}.
* Its length is always {@code at.length + 1}.
* {@code src}. Its length is always {@code at.length + 1}.
*/
public static String[] splitAt(String src, int... at) {
Objects.requireNonNull(src, "src");
@ -553,10 +508,8 @@ public class StringUtil {
}
if (endPos < beginPos) {
throw new IllegalArgumentException(
"endPos must be greater than or equal to beginPos (endPos="
+ endPos + ", beginPos=" + beginPos + ")"
);
throw new IllegalArgumentException("endPos must be greater than or equal to beginPos (endPos=" + endPos
+ ", beginPos=" + beginPos + ")");
}
if (endPos >= Math.min(a.length, b.length)) {
@ -592,8 +545,7 @@ public class StringUtil {
/**
* Finds and returns the index of the specified appearance of the specified
* character
* in the given array. The search starts at index 0.
* character in the given array. The search starts at index 0.
* <p>
* Examples:
* <p>
@ -630,10 +582,12 @@ public class StringUtil {
* </tr>
* </table>
*
* @param src - the array to search in.
* @param target - the character to search for.
* @param skip - the amount of <code>target</code> characters to be
* skipped.
* @param src
* - the array to search in.
* @param target
* - the character to search for.
* @param skip
* - the amount of <code>target</code> characters to be skipped.
* @return The index of the <code>skip+1</code>th <code>target</code>
* character or -1, if none found.
* @see StringUtil#indexFromEnd(char[], char, int)
@ -653,8 +607,7 @@ public class StringUtil {
/**
* Finds and returns the index of the specified appearance of the specified
* character
* in the given array. The search starts at index
* character in the given array. The search starts at index
* <code>src.length - 1</code>.
* <p>
* Examples:
@ -692,13 +645,15 @@ public class StringUtil {
* </tr>
* </table>
*
* @param src - the array to search in.
* @param target - the character to search for.
* @param skip - the amount of <code>target</code> characters to be
* skipped.
* @param src
* - the array to search in.
* @param target
* - the character to search for.
* @param skip
* - the amount of <code>target</code> characters to be skipped.
* @return The index of the <code>skip+1</code>th
* <code>target</code>character
* from the end of the array or -1, if none found.
* <code>target</code>character from the end of the array or -1, if
* none found.
* @see StringUtil#indexFromBeginning(char[], char, int)
*/
public static int indexFromEnd(char[] src, char target, int skip) {
@ -873,12 +828,8 @@ public class StringUtil {
return result;
}
private static void buildCombinations(
StringBuilder sb,
Collection<String> result,
Iterable<String>[] parts,
int index
) {
private static void buildCombinations(StringBuilder sb, Collection<String> result, Iterable<String>[] parts,
int index) {
if (index >= parts.length) {
result.add(sb.toString());
} else {
@ -904,13 +855,8 @@ public class StringUtil {
return result;
}
private static void buildCombinations(
StringBuilder sb,
String[] result,
int[] resultIndex,
String[][] parts,
int index
) {
private static void buildCombinations(StringBuilder sb, String[] result, int[] resultIndex, String[][] parts,
int index) {
if (index >= parts.length) {
result[resultIndex[0]++] = sb.toString();
} else {
@ -985,10 +931,7 @@ public class StringUtil {
}
private static char hexDigit(long value, int digit) {
return hexDigit(
(int) (value >>> (4 * digit))
& 0xF
);
return hexDigit((int) (value >>> (4 * digit)) & 0xF);
}
public static char hexDigit(int value) {

View File

@ -27,10 +27,9 @@ public abstract class AbstractCharReader implements CharReader {
/**
* Current position of this CharReader. The reader maps its input to
* positions starting from 0.
* Positions that are negative or lower than 0 are invalid.
* {@link #current()}
* will throw an exception if position is invalid.
* positions starting from 0. Positions that are negative or lower than 0
* are invalid. {@link #current()} will throw an exception if position is
* invalid.
*/
protected int position = 0;

View File

@ -51,9 +51,12 @@ public abstract class BufferedCharReader extends AbstractCharReader {
/**
* Acquires next characters and stores them in the array.
*
* @param buffer the output array
* @param offset index of the first character
* @param length maximum amount of characters to be pulled
* @param buffer
* the output array
* @param offset
* index of the first character
* @param length
* maximum amount of characters to be pulled
* @return the amount of characters actually pulled
*/
protected int pullChars(char[] buffer, int offset, int length) {

View File

@ -179,8 +179,7 @@ public interface CharReader {
/**
* Skips to the end of the current line. Both <code>"\n"</code>,
* <code>"\r"</code>
* and <code>"\r\n"</code> are considered line separators.
* <code>"\r"</code> and <code>"\r\n"</code> are considered line separators.
*
* @return the amount of characters in the skipped line
*/

View File

@ -38,8 +38,7 @@ public class StringCharReader extends AbstractCharReader {
int end = offset + length;
if (end > str.length() || offset < 0)
throw new IllegalArgumentException(
"String contains [0; " + str.length() + "), requested [" + offset + "; " + end + ")"
);
"String contains [0; " + str.length() + "), requested [" + offset + "; " + end + ")");
this.offset = offset;
this.length = length;

View File

@ -45,8 +45,15 @@ public interface ThrowingBiConsumer<T, U, E extends Exception> {
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(
ThrowingBiConsumer<? super T, ? super U, ? extends E> first,
ThrowingBiConsumer<? super T, ? super U, ? extends E> second
) {
ThrowingBiConsumer<? super T, ? super U, ? extends E> second) {
return (t, u) -> {
first.accept(t, u);
second.accept(t, u);
};
}
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(BiConsumer<? super T, ? super U> first,
ThrowingBiConsumer<? super T, ? super U, E> second) {
return (t, u) -> {
first.accept(t, u);
second.accept(t, u);
@ -54,19 +61,7 @@ public interface ThrowingBiConsumer<T, U, E extends Exception> {
}
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(
BiConsumer<? super T, ? super U> first,
ThrowingBiConsumer<? super T, ? super U, E> second
) {
return (t, u) -> {
first.accept(t, u);
second.accept(t, u);
};
}
public static <T, U, E extends Exception> ThrowingBiConsumer<T, U, E> concat(
ThrowingBiConsumer<? super T, ? super U, E> first,
BiConsumer<? super T, ? super U> second
) {
ThrowingBiConsumer<? super T, ? super U, E> first, BiConsumer<? super T, ? super U> second) {
return (t, u) -> {
first.accept(t, u);
second.accept(t, u);

View File

@ -39,30 +39,24 @@ public interface ThrowingConsumer<T, E extends Exception> {
};
}
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(
ThrowingConsumer<? super T, ? extends E> first,
ThrowingConsumer<? super T, ? extends E> second
) {
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(ThrowingConsumer<? super T, ? extends E> first,
ThrowingConsumer<? super T, ? extends E> second) {
return t -> {
first.accept(t);
second.accept(t);
};
}
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(
Consumer<? super T> first,
ThrowingConsumer<? super T, ? extends E> second
) {
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(Consumer<? super T> first,
ThrowingConsumer<? super T, ? extends E> second) {
return t -> {
first.accept(t);
second.accept(t);
};
}
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(
ThrowingConsumer<? super T, ? extends E> first,
Consumer<? super T> second
) {
public static <T, E extends Exception> ThrowingConsumer<T, E> concat(ThrowingConsumer<? super T, ? extends E> first,
Consumer<? super T> second) {
return t -> {
first.accept(t);
second.accept(t);

View File

@ -28,10 +28,8 @@ public interface ThrowingFunction<T, R, E extends Exception> {
R apply(T t) throws E;
@SuppressWarnings("unchecked")
default Function<T, R> withHandler(
BiConsumer<? super T, ? super E> handler,
Function<? super T, ? extends R> value
) {
default Function<T, R> withHandler(BiConsumer<? super T, ? super E> handler,
Function<? super T, ? extends R> value) {
return t -> {
try {
return apply(t);
@ -59,22 +57,17 @@ public interface ThrowingFunction<T, R, E extends Exception> {
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(
ThrowingFunction<? super T, I, ? extends E> first,
ThrowingFunction<? super I, ? extends R, ? extends E> second
) {
ThrowingFunction<? super I, ? extends R, ? extends E> second) {
return t -> second.apply(first.apply(t));
}
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(Function<? super T, I> first,
ThrowingFunction<? super I, ? extends R, E> second) {
return t -> second.apply(first.apply(t));
}
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(
Function<? super T, I> first,
ThrowingFunction<? super I, ? extends R, E> second
) {
return t -> second.apply(first.apply(t));
}
public static <T, R, I, E extends Exception> ThrowingFunction<T, R, E> compose(
ThrowingFunction<? super T, I, E> first,
Function<? super I, ? extends R> second
) {
ThrowingFunction<? super T, I, E> first, Function<? super I, ? extends R> second) {
return t -> second.apply(first.apply(t));
}

View File

@ -38,10 +38,8 @@ public interface ThrowingRunnable<E extends Exception> {
};
}
public static <E extends Exception> ThrowingRunnable<E> concat(
ThrowingRunnable<? extends E> first,
ThrowingRunnable<? extends E> second
) {
public static <E extends Exception> ThrowingRunnable<E> concat(ThrowingRunnable<? extends E> first,
ThrowingRunnable<? extends E> second) {
return () -> {
first.run();
second.run();

View File

@ -49,10 +49,8 @@ public class RangeIterator<E> implements Iterator<E> {
public E next() {
update();
if (nextIndex >= from + amount) {
throw new NoSuchElementException(
"RangeIterator about to retrieve element " + nextIndex
+ " which exceeds upper boundary " + (from + amount)
);
throw new NoSuchElementException("RangeIterator about to retrieve element " + nextIndex
+ " which exceeds upper boundary " + (from + amount));
}
E result = parent.next();

View File

@ -69,11 +69,7 @@ public class Client {
return;
}
getCamera().setAnchor(
new EntityAnchor(
getWorld().getEntityRenderable(entity)
)
);
getCamera().setAnchor(new EntityAnchor(getWorld().getEntityRenderable(entity)));
}
}

View File

@ -42,10 +42,8 @@ public class ClientProxy implements Proxy {
try {
RenderTaskQueue.waitAndInvoke(FlatRenderProgram::init);
RenderTaskQueue.waitAndInvoke(WorldRenderProgram::init);
RenderTaskQueue.waitAndInvoke(
() -> Typefaces
.setDefault(GNUUnifontLoader.load(ResourceManager.getResource("assets/unifont-13.0.03.hex.gz")))
);
RenderTaskQueue.waitAndInvoke(() -> Typefaces
.setDefault(GNUUnifontLoader.load(ResourceManager.getResource("assets/unifont-13.0.03.hex.gz"))));
} catch (InterruptedException e) {
throw CrashReports.report(e, "ClientProxy failed");
}

View File

@ -43,9 +43,7 @@ public class ClientState {
WorldData world = new WorldData();
LocalServerCommsChannel channel = new LocalServerCommsChannel(
ServerState.getInstance()
);
LocalServerCommsChannel channel = new LocalServerCommsChannel(ServerState.getInstance());
Client client = new Client(world, channel);

View File

@ -43,10 +43,7 @@ public class AudioManager {
private static Speaker musicSpeaker;
public static void initAL() {
String defaultDeviceName = alcGetString(
0,
ALC_DEFAULT_DEVICE_SPECIFIER
);
String defaultDeviceName = alcGetString(0, ALC_DEFAULT_DEVICE_SPECIFIER);
device = alcOpenDevice(defaultDeviceName);
@ -75,10 +72,7 @@ public class AudioManager {
lastSoundIndex = 0;
}
speaker = soundSpeakers.get(lastSoundIndex);
} while (
speaker.getState()
.equals(Speaker.State.PLAYING_LOOP)
);
} while (speaker.getState().equals(Speaker.State.PLAYING_LOOP));
return speaker;
}

View File

@ -29,10 +29,7 @@ public class AudioSystem {
}
static void loadAudioData() {
AudioManager.loadSound(
ResourceManager.getResource("assets/sounds/block_destroy_clap.ogg"),
"Progressia:BlockDestroy",
AudioFormat.MONO
);
AudioManager.loadSound(ResourceManager.getResource("assets/sounds/block_destroy_clap.ogg"),
"Progressia:BlockDestroy", AudioFormat.MONO);
}
}

View File

@ -22,10 +22,7 @@ import glm.vec._3.Vec3;
import ru.windcorp.progressia.client.audio.backend.SoundType;
import ru.windcorp.progressia.client.audio.backend.Speaker;
public class Music
extends Sound {
public class Music extends Sound {
public Music(SoundType soundType, int timeLength, float pitch, float gain) {
super(soundType, timeLength, new Vec3(), new Vec3(), pitch, gain);

View File

@ -40,14 +40,7 @@ public class Sound {
this(AudioRegistry.getInstance().get(id));
}
public Sound(
String id,
int timeLength,
Vec3 position,
Vec3 velocity,
float pitch,
float gain
) {
public Sound(String id, int timeLength, Vec3 position, Vec3 velocity, float pitch, float gain) {
this(id);
this.position = position;
this.velocity = velocity;
@ -55,14 +48,7 @@ public class Sound {
this.gain = gain;
}
public Sound(
SoundType soundType,
int timeLength,
Vec3 position,
Vec3 velocity,
float pitch,
float gain
) {
public Sound(SoundType soundType, int timeLength, Vec3 position, Vec3 velocity, float pitch, float gain) {
this(soundType);
this.position = position;
this.velocity = velocity;

View File

@ -39,12 +39,7 @@ public class AudioReader {
ShortBuffer rawAudio = decodeVorbis(resource, channelBuffer, rateBuffer);
return new SoundType(
id,
rawAudio,
format,
rateBuffer.get(0)
);
return new SoundType(id, rawAudio, format, rateBuffer.get(0));
}
public static SoundType readAsMono(Resource resource, String id) {
@ -55,15 +50,7 @@ public class AudioReader {
return readAsSpecified(resource, id, AL_FORMAT_STEREO16);
}
private static ShortBuffer decodeVorbis(
Resource dataToDecode,
IntBuffer channelsBuffer,
IntBuffer rateBuffer
) {
return stb_vorbis_decode_memory(
dataToDecode.readAsBytes(),
channelsBuffer,
rateBuffer
);
private static ShortBuffer decodeVorbis(Resource dataToDecode, IntBuffer channelsBuffer, IntBuffer rateBuffer) {
return stb_vorbis_decode_memory(dataToDecode.readAsBytes(), channelsBuffer, rateBuffer);
}
}

View File

@ -55,9 +55,8 @@ public class Listener {
if (isInWorld) {
if (wasInWorld) {
velocity.set(camera.getLastAnchorPosition()).sub(position).div(
(float) GraphicsInterface.getFrameLength()
);
velocity.set(camera.getLastAnchorPosition()).sub(position)
.div((float) GraphicsInterface.getFrameLength());
} else {
// If !wasInWorld, previous position is nonsence. Assume 0.
velocity.set(0);
@ -72,9 +71,9 @@ public class Listener {
}
/*
* Only apply if there is a chance that params changed.
* This can only happen if we are in world now (isInWorld) or we just
* left world (wasInWorld, then we need to reset).
* Only apply if there is a chance that params changed. This can only
* happen if we are in world now (isInWorld) or we just left world
* (wasInWorld, then we need to reset).
*/
if (isInWorld || wasInWorld) {
applyParams();
@ -91,17 +90,7 @@ public class Listener {
private void applyParams() {
alListener3f(AL_POSITION, position.x, position.y, position.z);
alListener3f(AL_VELOCITY, velocity.x, velocity.y, velocity.z);
alListenerfv(
AL_ORIENTATION,
new float[] {
oriAt.x,
oriAt.y,
oriAt.z,
oriUp.x,
oriUp.y,
oriUp.z
}
);
alListenerfv(AL_ORIENTATION, new float[] { oriAt.x, oriAt.y, oriAt.z, oriUp.x, oriUp.y, oriUp.z });
}
}

View File

@ -34,12 +34,7 @@ public class SoundType extends Namespaced {
private int audioBuffer;
private double duration;
public SoundType(
String id,
ShortBuffer rawAudio,
int format,
int sampleRate
) {
public SoundType(String id, ShortBuffer rawAudio, int format, int sampleRate) {
super(id);
this.rawAudio = rawAudio;
this.sampleRate = sampleRate;

View File

@ -24,9 +24,7 @@ import static org.lwjgl.openal.AL11.*;
public class Speaker {
public enum State {
NOT_PLAYING,
PLAYING,
PLAYING_LOOP
NOT_PLAYING, PLAYING, PLAYING_LOOP
}
// Buffers
@ -49,13 +47,7 @@ public class Speaker {
setAudioData(audioData);
}
public Speaker(
int audioData,
Vec3 position,
Vec3 velocity,
float pitch,
float gain
) {
public Speaker(int audioData, Vec3 position, Vec3 velocity, float pitch, float gain) {
setAudioData(audioData);
setPosition(position);
setVelocity(velocity);
@ -63,12 +55,7 @@ public class Speaker {
setGain(gain);
}
public Speaker(
Vec3 position,
Vec3 velocity,
float pitch,
float gain
) {
public Speaker(Vec3 position, Vec3 velocity, float pitch, float gain) {
setPosition(position);
setVelocity(velocity);
setPitch(pitch);

View File

@ -39,9 +39,7 @@ public class DefaultClientCommsListener implements CommsListener {
@Override
public void onPacketReceived(Packet packet) {
if (packet instanceof PacketAffectWorld) {
((PacketAffectWorld) packet).apply(
getClient().getWorld().getData()
);
((PacketAffectWorld) packet).apply(getClient().getWorld().getData());
} else if (packet instanceof PacketSetLocalPlayer) {
setLocalPlayer((PacketSetLocalPlayer) packet);
}

View File

@ -33,17 +33,12 @@ public class ControlTriggerLambda extends ControlTriggerInputBased {
private final Predicate<InputEvent> predicate;
private final BiConsumer<InputEvent, ControlData> dataWriter;
public ControlTriggerLambda(
String id,
Predicate<InputEvent> predicate,
BiConsumer<InputEvent, ControlData> dataWriter
) {
public ControlTriggerLambda(String id, Predicate<InputEvent> predicate,
BiConsumer<InputEvent, ControlData> dataWriter) {
super(id);
this.packetId = NamespacedUtil.getId(
NamespacedUtil.getNamespace(id),
"ControlKeyPress" + NamespacedUtil.getName(id)
);
this.packetId = NamespacedUtil.getId(NamespacedUtil.getNamespace(id),
"ControlKeyPress" + NamespacedUtil.getName(id));
this.predicate = predicate;
this.dataWriter = dataWriter;
@ -54,10 +49,7 @@ public class ControlTriggerLambda extends ControlTriggerInputBased {
if (!predicate.test(event))
return null;
PacketControl packet = new PacketControl(
packetId,
ControlDataRegistry.getInstance().create(getId())
);
PacketControl packet = new PacketControl(packetId, ControlDataRegistry.getInstance().create(getId()));
dataWriter.accept(event, packet.getControl());

View File

@ -29,11 +29,7 @@ public class ControlTriggerLocalLambda extends ControlTriggerInputBased {
private final Predicate<InputEvent> predicate;
private final Consumer<InputEvent> action;
public ControlTriggerLocalLambda(
String id,
Predicate<InputEvent> predicate,
Consumer<InputEvent> action
) {
public ControlTriggerLocalLambda(String id, Predicate<InputEvent> predicate, Consumer<InputEvent> action) {
super(id);
this.predicate = predicate;

View File

@ -27,120 +27,57 @@ import ru.windcorp.progressia.common.comms.controls.ControlData;
public class ControlTriggers {
public static ControlTriggerInputBased of(
String id,
BiConsumer<InputEvent, ControlData> dataWriter,
Predicate<InputEvent> predicate
) {
public static ControlTriggerInputBased of(String id, BiConsumer<InputEvent, ControlData> dataWriter,
Predicate<InputEvent> predicate) {
return new ControlTriggerLambda(id, predicate, dataWriter);
}
public static ControlTriggerInputBased of(
String id,
Consumer<ControlData> dataWriter,
Predicate<InputEvent> predicate
) {
return of(
id,
(input, control) -> dataWriter.accept(control),
predicate
);
public static ControlTriggerInputBased of(String id, Consumer<ControlData> dataWriter,
Predicate<InputEvent> predicate) {
return of(id, (input, control) -> dataWriter.accept(control), predicate);
}
public static ControlTriggerInputBased of(
String id,
Predicate<InputEvent> predicate
) {
return of(
id,
(input, control) -> {
},
predicate
);
public static ControlTriggerInputBased of(String id, Predicate<InputEvent> predicate) {
return of(id, (input, control) -> {
}, predicate);
}
@SafeVarargs
public static <I extends InputEvent> ControlTriggerInputBased of(
String id,
Class<I> inputType,
BiConsumer<I, ControlData> dataWriter,
Predicate<I>... predicates
) {
return of(
id,
createCheckedDataWriter(inputType, dataWriter),
createCheckedCompoundPredicate(inputType, predicates)
);
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Class<I> inputType,
BiConsumer<I, ControlData> dataWriter, Predicate<I>... predicates) {
return of(id, createCheckedDataWriter(inputType, dataWriter),
createCheckedCompoundPredicate(inputType, predicates));
}
@SafeVarargs
public static <I extends InputEvent> ControlTriggerInputBased of(
String id,
Class<I> inputType,
Consumer<ControlData> dataWriter,
Predicate<I>... predicates
) {
return of(
id,
inputType,
(input, control) -> dataWriter.accept(control),
predicates
);
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Class<I> inputType,
Consumer<ControlData> dataWriter, Predicate<I>... predicates) {
return of(id, inputType, (input, control) -> dataWriter.accept(control), predicates);
}
@SafeVarargs
public static <I extends InputEvent> ControlTriggerInputBased of(
String id,
Class<I> inputType,
Predicate<I>... predicates
) {
return of(
id,
(input, control) -> {
},
createCheckedCompoundPredicate(inputType, predicates)
);
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Class<I> inputType,
Predicate<I>... predicates) {
return of(id, (input, control) -> {
}, createCheckedCompoundPredicate(inputType, predicates));
}
@SafeVarargs
public static ControlTriggerInputBased of(
String id,
BiConsumer<InputEvent, ControlData> dataWriter,
Predicate<InputEvent>... predicates
) {
return of(
id,
InputEvent.class,
dataWriter,
predicates
);
public static ControlTriggerInputBased of(String id, BiConsumer<InputEvent, ControlData> dataWriter,
Predicate<InputEvent>... predicates) {
return of(id, InputEvent.class, dataWriter, predicates);
}
@SafeVarargs
public static <I extends InputEvent> ControlTriggerInputBased of(
String id,
Consumer<ControlData> dataWriter,
Predicate<InputEvent>... predicates
) {
return of(
id,
(input, control) -> dataWriter.accept(control),
predicates
);
public static <I extends InputEvent> ControlTriggerInputBased of(String id, Consumer<ControlData> dataWriter,
Predicate<InputEvent>... predicates) {
return of(id, (input, control) -> dataWriter.accept(control), predicates);
}
@SafeVarargs
public static ControlTriggerInputBased of(
String id,
Predicate<InputEvent>... predicates
) {
return of(
id,
InputEvent.class,
(input, control) -> {
},
predicates
);
public static ControlTriggerInputBased of(String id, Predicate<InputEvent>... predicates) {
return of(id, InputEvent.class, (input, control) -> {
}, predicates);
}
//
@ -157,100 +94,52 @@ public class ControlTriggers {
//
//
public static ControlTriggerInputBased localOf(
String id,
Consumer<InputEvent> action,
Predicate<InputEvent> predicate
) {
public static ControlTriggerInputBased localOf(String id, Consumer<InputEvent> action,
Predicate<InputEvent> predicate) {
return new ControlTriggerLocalLambda(id, predicate, action);
}
public static ControlTriggerInputBased localOf(
String id,
Runnable action,
Predicate<InputEvent> predicate
) {
return localOf(
id,
input -> action.run(),
predicate
);
public static ControlTriggerInputBased localOf(String id, Runnable action, Predicate<InputEvent> predicate) {
return localOf(id, input -> action.run(), predicate);
}
@SafeVarargs
public static <I extends InputEvent> ControlTriggerInputBased localOf(
String id,
Class<I> inputType,
Consumer<I> action,
Predicate<I>... predicates
) {
return localOf(
id,
createCheckedAction(inputType, action),
createCheckedCompoundPredicate(inputType, predicates)
);
public static <I extends InputEvent> ControlTriggerInputBased localOf(String id, Class<I> inputType,
Consumer<I> action, Predicate<I>... predicates) {
return localOf(id, createCheckedAction(inputType, action),
createCheckedCompoundPredicate(inputType, predicates));
}
@SafeVarargs
public static <I extends InputEvent> ControlTriggerInputBased localOf(
String id,
Class<I> inputType,
Runnable action,
Predicate<I>... predicates
) {
return localOf(
id,
inputType,
input -> action.run(),
predicates
);
public static <I extends InputEvent> ControlTriggerInputBased localOf(String id, Class<I> inputType,
Runnable action, Predicate<I>... predicates) {
return localOf(id, inputType, input -> action.run(), predicates);
}
@SafeVarargs
public static ControlTriggerInputBased localOf(
String id,
Consumer<InputEvent> action,
Predicate<InputEvent>... predicates
) {
return localOf(
id,
InputEvent.class,
action,
predicates
);
public static ControlTriggerInputBased localOf(String id, Consumer<InputEvent> action,
Predicate<InputEvent>... predicates) {
return localOf(id, InputEvent.class, action, predicates);
}
@SafeVarargs
public static <I extends InputEvent> ControlTriggerInputBased localOf(
String id,
Runnable action,
Predicate<InputEvent>... predicates
) {
return of(
id,
input -> action.run(),
predicates
);
public static <I extends InputEvent> ControlTriggerInputBased localOf(String id, Runnable action,
Predicate<InputEvent>... predicates) {
return of(id, input -> action.run(), predicates);
}
private static <I extends InputEvent> BiConsumer<InputEvent, ControlData> createCheckedDataWriter(
Class<I> inputType,
BiConsumer<I, ControlData> dataWriter
) {
Class<I> inputType, BiConsumer<I, ControlData> dataWriter) {
return (inputEvent, control) -> dataWriter.accept(inputType.cast(inputEvent), control);
}
private static <I extends InputEvent> Consumer<InputEvent> createCheckedAction(
Class<I> inputType,
Consumer<I> action
) {
private static <I extends InputEvent> Consumer<InputEvent> createCheckedAction(Class<I> inputType,
Consumer<I> action) {
return inputEvent -> action.accept(inputType.cast(inputEvent));
}
private static <I extends InputEvent> Predicate<InputEvent> createCheckedCompoundPredicate(
Class<I> inputType,
Predicate<I>[] predicates
) {
private static <I extends InputEvent> Predicate<InputEvent> createCheckedCompoundPredicate(Class<I> inputType,
Predicate<I>[] predicates) {
return new CompoundCastPredicate<>(inputType, predicates);
}

View File

@ -32,8 +32,7 @@ public class InputBasedControls {
this.client = client;
this.controls = ControlTriggerRegistry.getInstance().values().stream()
.filter(ControlTriggerInputBased.class::isInstance)
.toArray(ControlTriggerInputBased[]::new);
.filter(ControlTriggerInputBased.class::isInstance).toArray(ControlTriggerInputBased[]::new);
}
public void handleInput(Input input) {

View File

@ -34,11 +34,7 @@ public class LocalServerCommsChannel extends ServerCommsChannel {
public void connect(String login) {
setState(State.CONNECTED);
this.localClient = new LocalClient(
server.getClientManager().grabClientId(),
login,
this
);
this.localClient = new LocalClient(server.getClientManager().grabClientId(), login, this);
server.getClientManager().addClient(localClient);
}

View File

@ -22,18 +22,12 @@ import glm.vec._4.Vec4;
public class Colors {
public static final Vec4 WHITE = toVector(0xFFFFFFFF),
BLACK = toVector(0xFF000000),
public static final Vec4 WHITE = toVector(0xFFFFFFFF), BLACK = toVector(0xFF000000),
GRAY_4 = toVector(0xFF444444),
GRAY = toVector(0xFF888888),
GRAY_A = toVector(0xFFAAAAAA),
GRAY_4 = toVector(0xFF444444), GRAY = toVector(0xFF888888), GRAY_A = toVector(0xFFAAAAAA),
DEBUG_RED = toVector(0xFFFF0000),
DEBUG_GREEN = toVector(0xFF00FF00),
DEBUG_BLUE = toVector(0xFF0000FF),
DEBUG_CYAN = toVector(0xFF00FFFF),
DEBUG_MAGENTA = toVector(0xFFFF00FF),
DEBUG_RED = toVector(0xFFFF0000), DEBUG_GREEN = toVector(0xFF00FF00), DEBUG_BLUE = toVector(0xFF0000FF),
DEBUG_CYAN = toVector(0xFF00FFFF), DEBUG_MAGENTA = toVector(0xFFFF00FF),
DEBUG_YELLOW = toVector(0xFFFFFF00);
public static Vec4 toVector(int argb) {

View File

@ -159,27 +159,14 @@ public class GraphicsBackend {
public static void setFullscreen() {
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowMonitor(
getWindowHandle(),
glfwGetPrimaryMonitor(),
0,
0,
vidmode.width(),
vidmode.height(),
0);
glfwSetWindowMonitor(getWindowHandle(), glfwGetPrimaryMonitor(), 0, 0, vidmode.width(), vidmode.height(), 0);
isFullscreen = true;
}
public static void setWindowed() {
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowMonitor(
getWindowHandle(),
0,
(vidmode.width() - getFrameWidth()) / 2,
(vidmode.height() - getFrameHeight()) / 2,
getFrameWidth(),
getFrameHeight(),
0);
glfwSetWindowMonitor(getWindowHandle(), 0, (vidmode.width() - getFrameWidth()) / 2,
(vidmode.height() - getFrameHeight()) / 2, getFrameWidth(), getFrameHeight(), 0);
isFullscreen = false;
}

View File

@ -49,13 +49,7 @@ public class InputHandler {
private static final ModifiableKeyEvent THE_KEY_EVENT = new ModifiableKeyEvent();
static void handleKeyInput(
long window,
int key,
int scancode,
int action,
int mods
) {
static void handleKeyInput(long window, int key, int scancode, int action, int mods) {
if (GraphicsBackend.getWindowHandle() != window)
return;
THE_KEY_EVENT.initialize(key, scancode, action, mods);
@ -71,12 +65,7 @@ public class InputHandler {
}
}
static void handleMouseButtonInput(
long window,
int key,
int action,
int mods
) {
static void handleMouseButtonInput(long window, int key, int action, int mods) {
handleKeyInput(window, key, Integer.MAX_VALUE - key, action, mods);
}
@ -97,11 +86,7 @@ public class InputHandler {
private static final ModifiableCursorMoveEvent THE_CURSOR_MOVE_EVENT = new ModifiableCursorMoveEvent();
static void handleMouseMoveInput(
long window,
double x,
double y
) {
static void handleMouseMoveInput(long window, double x, double y) {
if (GraphicsBackend.getWindowHandle() != window)
return;
y = GraphicsInterface.getFrameHeight() - y; // Flip y axis
@ -131,11 +116,7 @@ public class InputHandler {
private static final ModifiableWheelScrollEvent THE_WHEEL_SCROLL_EVENT = new ModifiableWheelScrollEvent();
static void handleWheelScroll(
long window,
double xoffset,
double yoffset
) {
static void handleWheelScroll(long window, double xoffset, double yoffset) {
if (GraphicsBackend.getWindowHandle() != window)
return;
THE_WHEEL_SCROLL_EVENT.initialize(xoffset, yoffset);
@ -162,10 +143,7 @@ public class InputHandler {
/*
* NB: this is NOT a GLFW callback, the raw callback is in GraphicsBackend
*/
static void handleFrameResize(
int width,
int height
) {
static void handleFrameResize(int width, int height) {
THE_FRAME_RESIZE_EVENT.initialize(width, height);
dispatch(THE_FRAME_RESIZE_EVENT);
}

View File

@ -24,10 +24,7 @@ import gnu.trove.set.hash.TIntHashSet;
public class InputTracker {
private static final Vec2d CURSOR_POSITION = new Vec2d(
Double.NaN,
Double.NaN
);
private static final Vec2d CURSOR_POSITION = new Vec2d(Double.NaN, Double.NaN);
private static final TIntSet PRESSED_KEYS = new TIntHashSet(256);

View File

@ -94,16 +94,10 @@ class LWJGLInitializer {
private static void setupWindowCallbacks() {
long handle = GraphicsBackend.getWindowHandle();
glfwSetFramebufferSizeCallback(
handle,
GraphicsBackend::onFrameResized
);
glfwSetFramebufferSizeCallback(handle, GraphicsBackend::onFrameResized);
glfwSetKeyCallback(handle, InputHandler::handleKeyInput);
glfwSetMouseButtonCallback(
handle,
InputHandler::handleMouseButtonInput
);
glfwSetMouseButtonCallback(handle, InputHandler::handleMouseButtonInput);
glfwSetCursorPosCallback(handle, InputHandler::handleMouseMoveInput);

View File

@ -34,19 +34,13 @@ public class OpenGLObjectTracker {
private static final ReferenceQueue<OpenGLDeletable> DELETE_QUEUE = new ReferenceQueue<>();
public synchronized static void register(OpenGLDeletable object, IntConsumer glDeleter) {
GLPhantomReference<OpenGLDeletable> glRef = new GLPhantomReference<>(
object,
DELETE_QUEUE,
object.getHandle(),
glDeleter
);
GLPhantomReference<OpenGLDeletable> glRef = new GLPhantomReference<>(object, DELETE_QUEUE, object.getHandle(),
glDeleter);
TO_DELETE.add(glRef);
}
public static void deleteAllObjects() {
for (
GLPhantomReference<OpenGLDeletable> glRef : TO_DELETE
) {
for (GLPhantomReference<OpenGLDeletable> glRef : TO_DELETE) {
glRef.clear();
}
}
@ -75,20 +69,16 @@ public class OpenGLObjectTracker {
* It is possible to create a phantom reference with a {@code null}
* queue, but such a reference is completely useless: Its {@code get}
* method will always return {@code null} and, since it does not have a
* queue,
* it will never be enqueued.
* queue, it will never be enqueued.
*
* @param referent the object the new phantom reference will refer to
* @param q the queue with which the reference is to be
* registered,
* or {@code null} if registration is not required
* @param referent
* the object the new phantom reference will refer to
* @param q
* the queue with which the reference is to be registered, or
* {@code null} if registration is not required
*/
public GLPhantomReference(
T referent,
ReferenceQueue<? super T> q,
int referentGLhandle,
IntConsumer GLDeleter
) {
public GLPhantomReference(T referent, ReferenceQueue<? super T> q, int referentGLhandle,
IntConsumer GLDeleter) {
super(referent, q);
this.referentGLhandle = referentGLhandle;
this.GLDeleter = GLDeleter;

View File

@ -41,11 +41,7 @@ public class RenderTaskQueue {
HANDLER.invokeNow(task);
}
public static <E extends Exception> void waitAndInvoke(
ThrowingRunnable<E> task
)
throws InterruptedException,
E {
public static <E extends Exception> void waitAndInvoke(ThrowingRunnable<E> task) throws InterruptedException, E {
HANDLER.waitAndInvoke(task);
}

View File

@ -23,9 +23,7 @@ import static org.lwjgl.opengl.GL15.GL_STATIC_DRAW;
import static org.lwjgl.opengl.GL15.GL_STREAM_DRAW;
public enum Usage { // TODO add _COPY and _READ, pref. as another enum
STATIC(GL_STATIC_DRAW),
DYNAMIC(GL_DYNAMIC_DRAW),
STREAM(GL_STREAM_DRAW);
STATIC(GL_STATIC_DRAW), DYNAMIC(GL_DYNAMIC_DRAW), STREAM(GL_STREAM_DRAW);
private final int glCode;

View File

@ -28,8 +28,7 @@ import ru.windcorp.progressia.client.graphics.backend.OpenGLObjectTracker.OpenGL
public class VertexBufferObject implements OpenGLDeletable {
public static enum BindTarget {
ARRAY(GL_ARRAY_BUFFER),
ELEMENT_ARRAY(GL_ELEMENT_ARRAY_BUFFER);
ARRAY(GL_ARRAY_BUFFER), ELEMENT_ARRAY(GL_ELEMENT_ARRAY_BUFFER);
private final int glCode;

View File

@ -32,12 +32,7 @@ public class CombinedShader extends Shader {
for (int i = 1; i < resources.length; ++i) {
if (ShaderType.guessByResourceName(resources[i]) != first) {
throw new IllegalArgumentException(
"Deduced shader types of "
+ resources[0]
+ " and "
+ resources[i]
+ " differ"
);
"Deduced shader types of " + resources[0] + " and " + resources[i] + " differ");
}
}
@ -71,19 +66,8 @@ public class CombinedShader extends Shader {
if (contents.codePointAt(versionIndex) == '#') {
final String versionAnnotation = "#version ";
if (
contents.regionMatches(
versionIndex,
versionAnnotation,
0,
versionAnnotation.length()
)
) {
contents = contents.substring(
versionIndex
+ versionAnnotation.length()
+ "120".length()
);
if (contents.regionMatches(versionIndex, versionAnnotation, 0, versionAnnotation.length())) {
contents = contents.substring(versionIndex + versionAnnotation.length() + "120".length());
}
}

View File

@ -57,10 +57,7 @@ public class Shader implements OpenGLDeletable {
if (resource.contains("fsh"))
return FRAGMENT;
throw new IllegalArgumentException(
"Cannot deduce shader type from resource name \"" +
resource + "\""
);
throw new IllegalArgumentException("Cannot deduce shader type from resource name \"" + resource + "\"");
}
}
@ -90,10 +87,7 @@ public class Shader implements OpenGLDeletable {
}
public Shader(String resource) {
this(
ShaderType.guessByResourceName(resource),
getShaderResource(resource).readAsString()
);
this(ShaderType.guessByResourceName(resource), getShaderResource(resource).readAsString());
}
@Override

View File

@ -51,104 +51,29 @@ public class AttributeVertexArray extends Attribute {
}
}
public void set(
int size,
boolean normalized,
int stride,
ByteBuffer pointer
) {
glVertexAttribPointer(
handle,
size,
GL_BYTE,
normalized,
stride,
pointer
);
public void set(int size, boolean normalized, int stride, ByteBuffer pointer) {
glVertexAttribPointer(handle, size, GL_BYTE, normalized, stride, pointer);
}
public void set(
int size,
boolean normalized,
int stride,
FloatBuffer pointer
) {
glVertexAttribPointer(
handle,
size,
GL_FLOAT,
normalized,
stride,
pointer
);
public void set(int size, boolean normalized, int stride, FloatBuffer pointer) {
glVertexAttribPointer(handle, size, GL_FLOAT, normalized, stride, pointer);
}
public void set(
int size,
boolean normalized,
int stride,
IntBuffer pointer
) {
glVertexAttribPointer(
handle,
size,
GL_INT,
normalized,
stride,
pointer
);
public void set(int size, boolean normalized, int stride, IntBuffer pointer) {
glVertexAttribPointer(handle, size, GL_INT, normalized, stride, pointer);
}
public void set(
int size,
boolean normalized,
int stride,
ShortBuffer pointer
) {
glVertexAttribPointer(
handle,
size,
GL_SHORT,
normalized,
stride,
pointer
);
public void set(int size, boolean normalized, int stride, ShortBuffer pointer) {
glVertexAttribPointer(handle, size, GL_SHORT, normalized, stride, pointer);
}
public void set(
int size,
int type,
boolean normalized,
int stride,
long pointer
) {
glVertexAttribPointer(
handle,
size,
type,
normalized,
stride,
pointer
);
public void set(int size, int type, boolean normalized, int stride, long pointer) {
glVertexAttribPointer(handle, size, type, normalized, stride, pointer);
}
public void set(
int size,
int type,
boolean normalized,
int stride,
VertexBufferObject vbo,
long offset
) {
public void set(int size, int type, boolean normalized, int stride, VertexBufferObject vbo, long offset) {
glBindBuffer(GL_ARRAY_BUFFER, vbo.getHandle());
glVertexAttribPointer(
handle,
size,
type,
normalized,
stride,
offset
);
glVertexAttribPointer(handle, size, type, normalized, stride, offset);
}
}

View File

@ -37,8 +37,7 @@ public abstract class FlatRenderHelper extends ShapeRenderHelper {
float width = GraphicsInterface.getFrameWidth();
float height = GraphicsInterface.getFrameHeight();
return finalTransform.identity().translate(-1, -1, 0)
.scale(2 / width, 2 / height, 1 / MAX_DEPTH)
return finalTransform.identity().translate(-1, -1, 0).scale(2 / width, 2 / height, 1 / MAX_DEPTH)
.mul(getTransform());
}

View File

@ -33,10 +33,8 @@ public class FlatRenderProgram extends ShapeRenderProgram {
private static FlatRenderProgram def = null;
public static void init() {
def = new FlatRenderProgram(
new String[] { "FlatDefault.vertex.glsl" },
new String[] { "FlatDefault.fragment.glsl" }
);
def = new FlatRenderProgram(new String[] { "FlatDefault.vertex.glsl" },
new String[] { "FlatDefault.fragment.glsl" });
}
public static FlatRenderProgram getDefault() {
@ -48,20 +46,13 @@ public class FlatRenderProgram extends ShapeRenderProgram {
private static final String FLAT_VERTEX_SHADER_RESOURCE = "Flat.vertex.glsl";
private static final String FLAT_FRAGMENT_SHADER_RESOURCE = "Flat.fragment.glsl";
private static final String MASK_COUNT_UNIFORM_NAME = "maskCount",
MASKS_UNIFORM_NAME = "masks";
private static final String MASK_COUNT_UNIFORM_NAME = "maskCount", MASKS_UNIFORM_NAME = "masks";
private final Uniform1Int maskCountUniform;
private final Uniform2Float masksUniform;
public FlatRenderProgram(
String[] vertexShaderResources,
String[] fragmentShaderResources
) {
super(
attachVertexShader(vertexShaderResources),
attachFragmentShader(fragmentShaderResources)
);
public FlatRenderProgram(String[] vertexShaderResources, String[] fragmentShaderResources) {
super(attachVertexShader(vertexShaderResources), attachFragmentShader(fragmentShaderResources));
this.maskCountUniform = getUniform(MASK_COUNT_UNIFORM_NAME).as1Int();
this.masksUniform = getUniform(MASKS_UNIFORM_NAME).as2Float();

View File

@ -88,8 +88,7 @@ public class Mask {
@Override
public String toString() {
return "(" + getStartX() + "; " + getStartY() +
") -> (" + getEndX() + "; " + getEndY() + ")";
return "(" + getStartX() + "; " + getStartY() + ") -> (" + getEndX() + "; " + getEndY() + ")";
}
}

View File

@ -24,9 +24,8 @@ import org.lwjgl.BufferUtils;
public class MaskStack {
private final FloatBuffer buffer = BufferUtils.createFloatBuffer(
FlatRenderProgram.MASK_STACK_SIZE * TransformedMask.SIZE_IN_FLOATS
);
private final FloatBuffer buffer = BufferUtils
.createFloatBuffer(FlatRenderProgram.MASK_STACK_SIZE * TransformedMask.SIZE_IN_FLOATS);
public void pushMask(TransformedMask mask) {
mask.writeToBuffer(buffer);

View File

@ -45,11 +45,7 @@ public class RenderTarget {
private final Mat4 transform;
private final Renderable renderable;
public Clip(
Iterable<TransformedMask> masks,
Mat4 transform,
Renderable renderable
) {
public Clip(Iterable<TransformedMask> masks, Mat4 transform, Renderable renderable) {
for (TransformedMask mask : masks) {
this.masks.pushMask(mask);
}
@ -94,33 +90,19 @@ public class RenderTarget {
protected void assembleCurrentClipFromFaces() {
if (!currentClipFaces.isEmpty()) {
Face[] faces = currentClipFaces.toArray(
new Face[currentClipFaces.size()]
);
Face[] faces = currentClipFaces.toArray(new Face[currentClipFaces.size()]);
currentClipFaces.clear();
Shape shape = new Shape(
Usage.STATIC,
FlatRenderProgram.getDefault(),
faces
);
Shape shape = new Shape(Usage.STATIC, FlatRenderProgram.getDefault(), faces);
assembled.add(
new Clip(
maskStack,
getTransform(),
shape
)
);
assembled.add(new Clip(maskStack, getTransform(), shape));
}
}
public Clip[] assemble() {
assembleCurrentClipFromFaces();
Clip[] result = assembled.toArray(
new Clip[assembled.size()]
);
Clip[] result = assembled.toArray(new Clip[assembled.size()]);
reset();
@ -142,21 +124,11 @@ public class RenderTarget {
pushTransform(new Mat4().identity().translate(startX, startY, 0));
maskStack.push(
new TransformedMask(
new Mask(startX, startY, endX, endY),
getTransform()
)
);
maskStack.push(new TransformedMask(new Mask(startX, startY, endX, endY), getTransform()));
}
public void pushMask(Mask mask) {
pushMaskStartEnd(
mask.getStartX(),
mask.getStartY(),
mask.getEndX(),
mask.getEndY()
);
pushMaskStartEnd(mask.getStartX(), mask.getStartY(), mask.getEndX(), mask.getEndY());
}
public void pushMaskStartSize(int x, int y, int width, int height) {
@ -189,142 +161,58 @@ public class RenderTarget {
public void addCustomRenderer(Renderable renderable) {
assembleCurrentClipFromFaces();
assembled.add(
new Clip(
maskStack,
getTransform(),
renderable
)
);
assembled.add(new Clip(maskStack, getTransform(), renderable));
}
protected void addFaceToCurrentClip(Face face) {
currentClipFaces.add(face);
}
public void drawTexture(
int x,
int y,
int width,
int height,
Vec4 color,
Texture texture
) {
addFaceToCurrentClip(
createRectagleFace(x, y, width, height, color, texture)
);
public void drawTexture(int x, int y, int width, int height, Vec4 color, Texture texture) {
addFaceToCurrentClip(createRectagleFace(x, y, width, height, color, texture));
}
public void drawTexture(
int x,
int y,
int width,
int height,
int color,
Texture texture
) {
public void drawTexture(int x, int y, int width, int height, int color, Texture texture) {
drawTexture(x, y, width, height, Colors.toVector(color), texture);
}
public void drawTexture(
int x,
int y,
int width,
int height,
Texture texture
) {
public void drawTexture(int x, int y, int width, int height, Texture texture) {
drawTexture(x, y, width, height, Colors.WHITE, texture);
}
public void fill(
int x,
int y,
int width,
int height,
Vec4 color
) {
public void fill(int x, int y, int width, int height, Vec4 color) {
drawTexture(x, y, width, height, color, null);
}
public void fill(
int x,
int y,
int width,
int height,
int color
) {
public void fill(int x, int y, int width, int height, int color) {
fill(x, y, width, height, Colors.toVector(color));
}
public void fill(Vec4 color) {
fill(
Integer.MIN_VALUE / 2,
Integer.MIN_VALUE / 2,
Integer.MAX_VALUE,
Integer.MAX_VALUE,
color
);
fill(Integer.MIN_VALUE / 2, Integer.MIN_VALUE / 2, Integer.MAX_VALUE, Integer.MAX_VALUE, color);
}
public void fill(int color) {
fill(Colors.toVector(color));
}
public Face createRectagleFace(
int x,
int y,
int width,
int height,
Vec4 color,
Texture texture
) {
public Face createRectagleFace(int x, int y, int width, int height, Vec4 color, Texture texture) {
float depth = this.depth--;
return Faces.createRectangle(
FlatRenderProgram.getDefault(),
texture,
color,
new Vec3(x, y, depth),
new Vec3(width, 0, 0),
new Vec3(0, height, 0),
false
);
return Faces.createRectangle(FlatRenderProgram.getDefault(), texture, color, new Vec3(x, y, depth),
new Vec3(width, 0, 0), new Vec3(0, height, 0), false);
}
public Face createRectagleFace(
int x,
int y,
int width,
int height,
int color,
Texture texture
) {
public Face createRectagleFace(int x, int y, int width, int height, int color, Texture texture) {
return createRectagleFace(x, y, width, height, Colors.toVector(color), texture);
}
public Shape createRectagle(
int x,
int y,
int width,
int height,
Vec4 color,
Texture texture
) {
return new Shape(
Usage.STATIC,
FlatRenderProgram.getDefault(),
createRectagleFace(x, y, width, height, color, texture)
);
public Shape createRectagle(int x, int y, int width, int height, Vec4 color, Texture texture) {
return new Shape(Usage.STATIC, FlatRenderProgram.getDefault(),
createRectagleFace(x, y, width, height, color, texture));
}
public Shape createRectagle(
int x,
int y,
int width,
int height,
int color,
Texture texture
) {
public Shape createRectagle(int x, int y, int width, int height, int color, Texture texture) {
return createRectagle(x, y, width, height, Colors.toVector(color), texture);
}

View File

@ -42,14 +42,8 @@ public class TransformedMask {
private Vec4 endXstartY = null;
private Vec4 endXendY = null;
public TransformedMask(
Vec2 origin,
Vec2 width,
Vec2 height,
Vec2 counterOrigin,
Vec2 counterWidth,
Vec2 counterHeight
) {
public TransformedMask(Vec2 origin, Vec2 width, Vec2 height, Vec2 counterOrigin, Vec2 counterWidth,
Vec2 counterHeight) {
set(origin, width, height, counterOrigin, counterWidth, counterHeight);
}
@ -61,14 +55,8 @@ public class TransformedMask {
// Do nothing
}
public TransformedMask set(
Vec2 origin,
Vec2 width,
Vec2 height,
Vec2 counterOrigin,
Vec2 counterWidth,
Vec2 counterHeight
) {
public TransformedMask set(Vec2 origin, Vec2 width, Vec2 height, Vec2 counterOrigin, Vec2 counterWidth,
Vec2 counterHeight) {
this.origin.set(origin.x, origin.y);
this.width.set(width.x, width.y);
this.height.set(height.x, height.y);
@ -112,35 +100,17 @@ public class TransformedMask {
}
private void setFields() {
origin.set(
startXstartY.x,
startXstartY.y
);
origin.set(startXstartY.x, startXstartY.y);
width.set(
endXstartY.x - startXstartY.x,
endXstartY.y - startXstartY.y
);
width.set(endXstartY.x - startXstartY.x, endXstartY.y - startXstartY.y);
height.set(
startXendY.x - startXstartY.x,
startXendY.y - startXstartY.y
);
height.set(startXendY.x - startXstartY.x, startXendY.y - startXstartY.y);
counterOrigin.set(
endXendY.x,
endXendY.y
);
counterOrigin.set(endXendY.x, endXendY.y);
counterWidth.set(
startXendY.x - endXendY.x,
startXendY.y - endXendY.y
);
counterWidth.set(startXendY.x - endXendY.x, startXendY.y - endXendY.y);
counterHeight.set(
endXstartY.x - endXendY.x,
endXstartY.y - endXendY.y
);
counterHeight.set(endXstartY.x - endXendY.x, endXstartY.y - endXendY.y);
}
public void writeToBuffer(FloatBuffer output) {

View File

@ -68,17 +68,11 @@ public class Font {
return color;
}
public Renderable assemble(
CharSequence chars,
float maxWidth
) {
public Renderable assemble(CharSequence chars, float maxWidth) {
return typeface.assembleStatic(chars, style, align, maxWidth, color);
}
public Renderable assembleDynamic(
Supplier<CharSequence> supplier,
float maxWidth
) {
public Renderable assembleDynamic(Supplier<CharSequence> supplier, float maxWidth) {
return typeface.assembleDynamic(supplier, style, align, maxWidth, color);
}
@ -102,7 +96,8 @@ public class Font {
* Creates a new {@link Font} with the specified {@code style} exactly. This
* object's style is ignored.
*
* @param style the new style
* @param style
* the new style
* @return the new font
*/
public Font withStyle(int style) {

View File

@ -81,8 +81,7 @@ public class GNUUnifontLoader {
private static BufferedReader createReader(Resource resource) throws IOException {
return new BufferedReader(
new InputStreamReader(new GZIPInputStream(resource.getInputStream()), StandardCharsets.UTF_8)
);
new InputStreamReader(new GZIPInputStream(resource.getInputStream()), StandardCharsets.UTF_8));
}
private static Stream<String> createStream(BufferedReader reader) {
@ -97,13 +96,8 @@ public class GNUUnifontLoader {
char c = getChar(declar);
TextureDataEditor editor = new TextureDataEditor(
width,
GNUUnifont.HEIGHT,
width,
GNUUnifont.HEIGHT,
TEXTURE_SETTINGS
);
TextureDataEditor editor = new TextureDataEditor(width, GNUUnifont.HEIGHT, width, GNUUnifont.HEIGHT,
TEXTURE_SETTINGS);
for (int y = 0; y < GNUUnifont.HEIGHT; ++y) {
for (int x = 0; x < width; ++x) {
@ -165,8 +159,7 @@ public class GNUUnifontLoader {
if (!((c >= '0' && c <= '9') || (c >= 'A' && c <= 'F'))) {
throw new IOException(
"Illegal char in declar \"" + declar + "\" at index " + i + "; expected 0-9A-F"
);
"Illegal char in declar \"" + declar + "\" at index " + i + "; expected 0-9A-F");
}
}
}
@ -190,8 +183,7 @@ public class GNUUnifontLoader {
}
private static Collector<AtlasGlyph, ?, TCharObjectMap<Texture>> createMapper() {
return Collector.of(
TCharObjectHashMap<Texture>::new,
return Collector.of(TCharObjectHashMap<Texture>::new,
(map, glyph) -> map.put(glyph.c, glyph.texture),
@ -200,8 +192,7 @@ public class GNUUnifontLoader {
return a;
},
Characteristics.UNORDERED
);
Characteristics.UNORDERED);
}
private GNUUnifontLoader() {

View File

@ -105,13 +105,7 @@ public abstract class SpriteTypeface extends Typeface {
public abstract ShapeRenderProgram getProgram();
@Override
public Vec2i getSize(
CharSequence chars,
int style,
float align,
float maxWidth,
Vec2i output
) {
public Vec2i getSize(CharSequence chars, int style, float align, float maxWidth, Vec2i output) {
if (output == null)
output = new Vec2i();
@ -141,19 +135,8 @@ public abstract class SpriteTypeface extends Typeface {
}
private Shape createCharShape(char c) {
return new Shape(
Usage.STATIC,
getProgram(),
Faces.createRectangle(
getProgram(),
getTexture(c),
Colors.WHITE,
Vectors.ZERO_3,
new Vec3(getWidth(c), 0, 0),
new Vec3(0, getHeight(), 0),
false
)
);
return new Shape(Usage.STATIC, getProgram(), Faces.createRectangle(getProgram(), getTexture(c), Colors.WHITE,
Vectors.ZERO_3, new Vec3(getWidth(c), 0, 0), new Vec3(0, getHeight(), 0), false));
}
private class DynamicText implements Renderable, Drawer {
@ -164,19 +147,8 @@ public abstract class SpriteTypeface extends Typeface {
private final float maxWidth;
private final Vec4 color;
private final Renderable unitLine = new Shape(
Usage.STATIC,
getProgram(),
Faces.createRectangle(
getProgram(),
null,
Vectors.UNIT_4,
Vectors.ZERO_3,
new Vec3(1, 0, 0),
new Vec3(0, 1, 0),
false
)
);
private final Renderable unitLine = new Shape(Usage.STATIC, getProgram(), Faces.createRectangle(getProgram(),
null, Vectors.UNIT_4, Vectors.ZERO_3, new Vec3(1, 0, 0), new Vec3(0, 1, 0), false));
private class DynamicWorkspace extends Workspace {
private ShapeRenderHelper renderer;
@ -190,13 +162,7 @@ public abstract class SpriteTypeface extends Typeface {
private final DynamicWorkspace workspace = new DynamicWorkspace();
public DynamicText(
Supplier<CharSequence> supplier,
int style,
float align,
float maxWidth,
Vec4 color
) {
public DynamicText(Supplier<CharSequence> supplier, int style, float align, float maxWidth, Vec4 color) {
this.supplier = supplier;
this.style = style;
this.align = align;
@ -297,25 +263,12 @@ public abstract class SpriteTypeface extends Typeface {
workspace.width.sub(workspace.origin);
workspace.height.sub(workspace.origin);
workspace.faces.add(
Faces.createRectangle(
getProgram(),
texture,
color,
workspace.origin,
workspace.width,
workspace.height,
false
)
);
workspace.faces.add(Faces.createRectangle(getProgram(), texture, color, workspace.origin, workspace.width,
workspace.height, false));
}
public Renderable assemble() {
return new Shape(
Usage.STATIC,
getProgram(),
workspace.faces.toArray(new Face[workspace.faces.size()])
);
return new Shape(Usage.STATIC, getProgram(), workspace.faces.toArray(new Face[workspace.faces.size()]));
}
}
@ -328,13 +281,8 @@ public abstract class SpriteTypeface extends Typeface {
}
@Override
public Renderable assembleDynamic(
Supplier<CharSequence> supplier,
int style,
float align,
float maxWidth,
Vec4 color
) {
public Renderable assembleDynamic(Supplier<CharSequence> supplier, int style, float align, float maxWidth,
Vec4 color) {
return new DynamicText(supplier, style, align, maxWidth, color);
}
@ -424,15 +372,8 @@ public abstract class SpriteTypeface extends Typeface {
void drawRectangle(Vec2 size, Vec4 color, Mat4 transform);
}
protected void draw(
CharSequence text,
Drawer drawer,
Workspace workspace,
int style,
float align,
float maxWidth,
Vec4 color
) {
protected void draw(CharSequence text, Drawer drawer, Workspace workspace, int style, float align, float maxWidth,
Vec4 color) {
workspace.text = text;
workspace.toIndex = text.length();
workspace.align = align;
@ -489,12 +430,7 @@ public abstract class SpriteTypeface extends Typeface {
return w.align * (w.totalSize.x - w.currentWidth);
}
private static final float[][] OUTLINE_DIRECTIONS = new float[][] {
{ 0, 1 },
{ 1, 0 },
{ -1, 0 },
{ 0, -1 }
};
private static final float[][] OUTLINE_DIRECTIONS = new float[][] { { 0, 1 }, { 1, 0 }, { -1, 0 }, { 0, -1 } };
private void drawLine(Drawer drawer, Workspace workspace) {
int style = workspace.styles.peek();
@ -591,11 +527,8 @@ public abstract class SpriteTypeface extends Typeface {
workspace.styles.pop();
} else {
throw new IllegalArgumentException(
"Style contains unknown flags " + Integer.toBinaryString(
(style & ~(Style.BOLD | Style.ITALIC | Style.SHADOW | Style.STRIKETHRU | Style.UNDERLINED))
)
);
throw new IllegalArgumentException("Style contains unknown flags " + Integer.toBinaryString(
(style & ~(Style.BOLD | Style.ITALIC | Style.SHADOW | Style.STRIKETHRU | Style.UNDERLINED))));
}
}

View File

@ -29,12 +29,8 @@ import ru.windcorp.progressia.common.util.Vectors;
public abstract class Typeface extends Named {
public static class Style {
public static final int BOLD = 1 << 0,
ITALIC = 1 << 1,
UNDERLINED = 1 << 2,
STRIKETHRU = 1 << 3,
SHADOW = 1 << 4,
OUTLINED = 1 << 5;
public static final int BOLD = 1 << 0, ITALIC = 1 << 1, UNDERLINED = 1 << 2, STRIKETHRU = 1 << 3,
SHADOW = 1 << 4, OUTLINED = 1 << 5;
public static final int PLAIN = 0;
@ -71,40 +67,19 @@ public abstract class Typeface extends Named {
super(name);
}
public abstract Renderable assembleStatic(
CharSequence chars,
int style,
float align,
float maxWidth,
Vec4 color
);
public abstract Renderable assembleStatic(CharSequence chars, int style, float align, float maxWidth, Vec4 color);
public abstract Renderable assembleDynamic(
Supplier<CharSequence> supplier,
int style,
float align,
float maxWidth,
Vec4 color
);
public abstract Renderable assembleDynamic(Supplier<CharSequence> supplier, int style, float align, float maxWidth,
Vec4 color);
public int getWidth(
CharSequence chars,
int style,
float align,
float maxWidth
) {
public int getWidth(CharSequence chars, int style, float align, float maxWidth) {
Vec2i v = Vectors.grab2i();
v = getSize(chars, style, align, maxWidth, v);
Vectors.release(v);
return v.x;
}
public int getHeight(
CharSequence chars,
int style,
float align,
float maxWidth
) {
public int getHeight(CharSequence chars, int style, float align, float maxWidth) {
Vec2i v = Vectors.grab2i();
v = getSize(chars, style, align, maxWidth, v);
Vectors.release(v);
@ -113,13 +88,7 @@ public abstract class Typeface extends Named {
public abstract int getLineHeight();
public abstract Vec2i getSize(
CharSequence chars,
int style,
float align,
float maxWidth,
Vec2i result
);
public abstract Vec2i getSize(CharSequence chars, int style, float align, float maxWidth, Vec2i result);
public abstract boolean supports(char c);

View File

@ -475,11 +475,8 @@ public class Component extends Named {
eventBus.post(event);
}
public <T extends InputEvent> void addListener(
Class<? extends T> type,
boolean handlesConsumed,
InputListener<T> listener
) {
public <T extends InputEvent> void addListener(Class<? extends T> type, boolean handlesConsumed,
InputListener<T> listener) {
if (inputBus == null) {
inputBus = new InputBus();
}

View File

@ -95,13 +95,13 @@ public class Label extends Component {
protected void assembleSelf(RenderTarget target) {
float startX = getX() + font.getAlign() * (getWidth() - currentSize.x);
target.pushTransform(
new Mat4().identity().translate(startX, getY(), -1000) // TODO wtf
// is this
target.pushTransform(new Mat4().identity().translate(startX, getY(), -1000) // TODO
// wtf
// is
// this
// magic
// <---
.scale(2)
);
.scale(2));
target.addCustomRenderer(font.assemble(currentText, maxWidth));

View File

@ -56,13 +56,8 @@ public class LayoutAlign implements Layout {
size.x = min(size.x, cWidth);
size.y = min(size.y, cHeight);
child.setBounds(
c.getX() +
(int) ((cWidth - size.x) * alignX) + margin,
c.getY() +
(int) ((cHeight - size.y) * alignY) + margin,
size
);
child.setBounds(c.getX() + (int) ((cWidth - size.x) * alignX) + margin,
c.getY() + (int) ((cHeight - size.y) * alignY) + margin, size);
});
}
@ -71,9 +66,7 @@ public class LayoutAlign implements Layout {
public Vec2i calculatePreferredSize(Component c) {
Vec2i result = new Vec2i(0, 0);
c.getChildren().stream()
.map(child -> child.getPreferredSize())
.forEach(size -> {
c.getChildren().stream().map(child -> child.getPreferredSize()).forEach(size -> {
result.x = max(size.x, result.x);
result.y = max(size.y, result.y);
});

View File

@ -26,9 +26,7 @@ import ru.windcorp.progressia.client.graphics.gui.Layout;
public class LayoutBorderHorizontal implements Layout {
public static final String CENTER = "Center",
LEFT = "Left",
RIGHT = "Right";
public static final String CENTER = "Center", LEFT = "Left", RIGHT = "Right";
private final int margin;
@ -51,32 +49,17 @@ public class LayoutBorderHorizontal implements Layout {
if (child.getLayoutHint() == LEFT) {
childSize = child.getPreferredSize();
left = childSize.x + margin;
child.setBounds(
c.getX(),
c.getY(),
childSize.x,
c.getHeight()
);
child.setBounds(c.getX(), c.getY(), childSize.x, c.getHeight());
} else if (child.getLayoutHint() == RIGHT) {
childSize = child.getPreferredSize();
right = childSize.x + margin;
child.setBounds(
c.getX() + c.getWidth() - childSize.x,
c.getY(),
childSize.x,
c.getHeight()
);
child.setBounds(c.getX() + c.getWidth() - childSize.x, c.getY(), childSize.x, c.getHeight());
}
}
for (Component child : c.getChildren()) {
if (child.getLayoutHint() == CENTER) {
child.setBounds(
c.getX() + left,
c.getY(),
c.getWidth() - left - right,
c.getHeight()
);
child.setBounds(c.getX() + left, c.getY(), c.getWidth() - left - right, c.getHeight());
}
}

View File

@ -26,9 +26,7 @@ import ru.windcorp.progressia.client.graphics.gui.Layout;
public class LayoutBorderVertical implements Layout {
public static final String CENTER = "Center",
UP = "Up",
DOWN = "Down";
public static final String CENTER = "Center", UP = "Up", DOWN = "Down";
private final int margin;
@ -51,32 +49,17 @@ public class LayoutBorderVertical implements Layout {
if (child.getLayoutHint() == UP) {
childSize = child.getPreferredSize();
top = childSize.y + margin;
child.setBounds(
c.getX(),
c.getY(),
c.getWidth(),
childSize.y
);
child.setBounds(c.getX(), c.getY(), c.getWidth(), childSize.y);
} else if (child.getLayoutHint() == DOWN) {
childSize = child.getPreferredSize();
bottom = childSize.y + margin;
child.setBounds(
c.getX(),
c.getY() + c.getHeight() - childSize.y,
c.getWidth(),
childSize.y
);
child.setBounds(c.getX(), c.getY() + c.getHeight() - childSize.y, c.getWidth(), childSize.y);
}
}
for (Component child : c.getChildren()) {
if (child.getLayoutHint() == CENTER) {
child.setBounds(
c.getX(),
c.getY() + top,
c.getWidth(),
c.getHeight() - top - bottom
);
child.setBounds(c.getX(), c.getY() + top, c.getWidth(), c.getHeight() - top - bottom);
}
}

View File

@ -98,16 +98,13 @@ public class LayoutGrid implements Layout {
if (!isSummed)
throw new IllegalStateException("Not summed yet");
child.setBounds(
parent.getX() + columns[column],
parent.getY() + rows[row],
child.setBounds(parent.getX() + columns[column], parent.getY() + rows[row],
(column != (columns.length - 1) ? (columns[column + 1] - columns[column] - gap)
: (parent.getWidth() - margin - columns[column])),
(row != (rows.length - 1) ? (rows[row + 1] - rows[row] - gap)
: (parent.getHeight() - margin - rows[row]))
);
: (parent.getHeight() - margin - rows[row])));
}
}

View File

@ -43,8 +43,7 @@ public class LayoutHorizontal implements Layout {
@Override
public void layout(Component c) {
int x = c.getX() + margin,
y = c.getY() + margin;
int x = c.getX() + margin, y = c.getY() + margin;
int width;

View File

@ -43,8 +43,7 @@ public class LayoutVertical implements Layout {
@Override
public void layout(Component c) {
int x = c.getX() + margin,
y = c.getY() + c.getHeight();
int x = c.getX() + margin, y = c.getY() + c.getHeight();
synchronized (c.getChildren()) {
for (Component child : c.getChildren()) {

View File

@ -87,22 +87,14 @@ public class CursorMoveEvent extends CursorEvent {
@Override
public CursorMoveEvent snapshot() {
return new StaticMouseMoveEvent(
getPreviousPosition(),
getNewPosition(),
getTime()
);
return new StaticMouseMoveEvent(getPreviousPosition(), getNewPosition(), getTime());
}
private class StaticMouseMoveEvent extends CursorMoveEvent {
private final Vec2d previousPosition = new Vec2d();
public StaticMouseMoveEvent(
Vec2d previousPosition,
Vec2d newPosition,
double time
) {
public StaticMouseMoveEvent(Vec2d previousPosition, Vec2d newPosition, double time) {
super(newPosition, time);
this.previousPosition.set(previousPosition.x, previousPosition.y);
}

View File

@ -67,11 +67,7 @@ public class FrameResizeEvent extends InputEvent {
private final Vec2i previousSize;
public StaticFrameResizeEvent(
Vec2i newSize,
Vec2i previousSize,
double time
) {
public StaticFrameResizeEvent(Vec2i newSize, Vec2i previousSize, double time) {
super(newSize, time);
this.previousSize = previousSize;
}

View File

@ -27,13 +27,7 @@ public class KeyEvent extends InputEvent {
protected int action;
protected int mods;
protected KeyEvent(
int key,
int scancode,
int action,
int mods,
double time
) {
protected KeyEvent(int key, int scancode, int action, int mods, double time) {
super(time);
this.key = key;
this.scancode = scancode;

View File

@ -46,17 +46,12 @@ public class Keys {
private static final String MOUSE_BUTTON_PREFIX = "GLFW_MOUSE_BUTTON_";
private static final Set<String> IGNORE_FIELDS = new HashSet<>(
Arrays.asList(
"GLFW_KEY_UNKNOWN",
"GLFW_KEY_LAST",
"GLFW_MOUSE_BUTTON_LAST",
"GLFW_MOUSE_BUTTON_1", // Alias
Arrays.asList("GLFW_KEY_UNKNOWN", "GLFW_KEY_LAST", "GLFW_MOUSE_BUTTON_LAST", "GLFW_MOUSE_BUTTON_1", // Alias
// for
// LEFT
"GLFW_MOUSE_BUTTON_2", // Alias for RIGHT
"GLFW_MOUSE_BUTTON_3" // Alias for MIDDLE
)
);
));
static {
initializeDictionary();
@ -100,14 +95,8 @@ public class Keys {
}
if (CODES_TO_NAMES.containsKey(value)) {
throw CrashReports.report(
null,
"Duplicate keys: %s and %s both map to %d(0x%s)",
CODES_TO_NAMES.get(value),
name,
value,
Integer.toHexString(value)
);
throw CrashReports.report(null, "Duplicate keys: %s and %s both map to %d(0x%s)", CODES_TO_NAMES.get(value),
name, value, Integer.toHexString(value));
}
CODES_TO_NAMES.put(value, name);

View File

@ -31,28 +31,21 @@ public class InputBus {
private final boolean handleConsumed;
private final InputListener<?> listener;
public WrappedListener(
Class<?> type,
boolean handleConsumed,
InputListener<?> listener
) {
public WrappedListener(Class<?> type, boolean handleConsumed, InputListener<?> listener) {
this.type = type;
this.handleConsumed = handleConsumed;
this.listener = listener;
}
private boolean handles(Input input) {
return (!input.isConsumed() || handleConsumed) &&
type.isInstance(input.getEvent());
return (!input.isConsumed() || handleConsumed) && type.isInstance(input.getEvent());
}
@SuppressWarnings("unchecked")
public void handle(Input input) {
if (handles(input)) {
boolean consumed = ((InputListener<InputEvent>) listener)
.handle(
(InputEvent) type.cast(input.getEvent())
);
.handle((InputEvent) type.cast(input.getEvent()));
input.setConsumed(consumed);
}
@ -66,18 +59,12 @@ public class InputBus {
listeners.forEach(l -> l.handle(input));
}
public <T extends InputEvent> void register(
Class<? extends T> type,
boolean handlesConsumed,
InputListener<T> listener
) {
public <T extends InputEvent> void register(Class<? extends T> type, boolean handlesConsumed,
InputListener<T> listener) {
listeners.add(new WrappedListener(type, handlesConsumed, listener));
}
public <T extends InputEvent> void register(
Class<? extends T> type,
InputListener<T> listener
) {
public <T extends InputEvent> void register(Class<? extends T> type, InputListener<T> listener) {
register(type, false, listener);
}

View File

@ -38,60 +38,40 @@ class BlockFaceVectors {
Vec3 width = outer.getWidth(face);
Vec3 height = outer.getHeight(face);
originBuilder.put(
face,
new Vec3(outer.getOrigin(face))
);
originBuilder.put(face, new Vec3(outer.getOrigin(face)));
widthBuilder.put(face, new Vec3(width));
heightBuilder.put(face, new Vec3(height));
}
return new BlockFaceVectors(
originBuilder.build(),
widthBuilder.build(),
heightBuilder.build()
);
return new BlockFaceVectors(originBuilder.build(), widthBuilder.build(), heightBuilder.build());
}
private static final BlockFaceVectors OUTER;
private static final BlockFaceVectors INNER;
static {
OUTER = new BlockFaceVectors(
ImmutableMap.<BlockFace, Vec3>builder()
OUTER = new BlockFaceVectors(ImmutableMap.<BlockFace, Vec3>builder()
.put(TOP, new Vec3(-0.5f, +0.5f, +0.5f))
.put(BOTTOM, new Vec3(-0.5f, -0.5f, -0.5f))
.put(NORTH, new Vec3(+0.5f, -0.5f, -0.5f))
.put(SOUTH, new Vec3(-0.5f, +0.5f, -0.5f))
.put(WEST, new Vec3(+0.5f, +0.5f, -0.5f))
.put(EAST, new Vec3(-0.5f, -0.5f, -0.5f))
.put(TOP, new Vec3(-0.5f, +0.5f, +0.5f)).put(BOTTOM, new Vec3(-0.5f, -0.5f, -0.5f))
.put(NORTH, new Vec3(+0.5f, -0.5f, -0.5f)).put(SOUTH, new Vec3(-0.5f, +0.5f, -0.5f))
.put(WEST, new Vec3(+0.5f, +0.5f, -0.5f)).put(EAST, new Vec3(-0.5f, -0.5f, -0.5f))
.build(),
ImmutableMap.<BlockFace, Vec3>builder()
.put(TOP, new Vec3(0, -1, 0))
.put(BOTTOM, new Vec3(0, +1, 0))
.put(NORTH, new Vec3(0, +1, 0))
.put(SOUTH, new Vec3(0, -1, 0))
.put(WEST, new Vec3(-1, 0, 0))
.put(EAST, new Vec3(+1, 0, 0))
.put(TOP, new Vec3(0, -1, 0)).put(BOTTOM, new Vec3(0, +1, 0)).put(NORTH, new Vec3(0, +1, 0))
.put(SOUTH, new Vec3(0, -1, 0)).put(WEST, new Vec3(-1, 0, 0)).put(EAST, new Vec3(+1, 0, 0))
.build(),
ImmutableMap.<BlockFace, Vec3>builder()
.put(TOP, new Vec3(+1, 0, 0))
.put(BOTTOM, new Vec3(+1, 0, 0))
.put(NORTH, new Vec3(0, 0, +1))
.put(SOUTH, new Vec3(0, 0, +1))
.put(WEST, new Vec3(0, 0, +1))
.put(EAST, new Vec3(0, 0, +1))
.put(TOP, new Vec3(+1, 0, 0)).put(BOTTOM, new Vec3(+1, 0, 0)).put(NORTH, new Vec3(0, 0, +1))
.put(SOUTH, new Vec3(0, 0, +1)).put(WEST, new Vec3(0, 0, +1)).put(EAST, new Vec3(0, 0, +1))
.build()
);
.build());
INNER = createInner(OUTER);
}
@ -104,11 +84,8 @@ class BlockFaceVectors {
private final ImmutableMap<BlockFace, Vec3> widths;
private final ImmutableMap<BlockFace, Vec3> heights;
public BlockFaceVectors(
ImmutableMap<BlockFace, Vec3> origins,
ImmutableMap<BlockFace, Vec3> widths,
ImmutableMap<BlockFace, Vec3> heights
) {
public BlockFaceVectors(ImmutableMap<BlockFace, Vec3> origins, ImmutableMap<BlockFace, Vec3> widths,
ImmutableMap<BlockFace, Vec3> heights) {
this.origins = origins;
this.widths = widths;
this.heights = heights;

View File

@ -33,22 +33,14 @@ public abstract class DynamicModel extends Model {
private final Mat4[] transforms;
private final boolean[] dynamics;
public DynamicModel(
Renderable[] parts,
Mat4[] transforms,
boolean[] dynamic
) {
public DynamicModel(Renderable[] parts, Mat4[] transforms, boolean[] dynamic) {
super(parts);
this.transforms = transforms;
this.dynamics = dynamic;
}
public DynamicModel(Builder builder) {
this(
builder.getParts(),
builder.getTransforms(),
builder.getDynamics()
);
this(builder.getParts(), builder.getTransforms(), builder.getDynamics());
}
@Override
@ -78,11 +70,7 @@ public abstract class DynamicModel extends Model {
protected Builder() {
}
private Builder addPart(
Renderable part,
Mat4 transform,
boolean isDynamic
) {
private Builder addPart(Renderable part, Mat4 transform, boolean isDynamic) {
parts.add(Objects.requireNonNull(part, "part"));
transforms.add(Objects.requireNonNull(transform, "transform"));
dynamics.add(isDynamic);
@ -90,22 +78,15 @@ public abstract class DynamicModel extends Model {
return this;
}
public Builder addStaticPart(
Renderable part,
Mat4 transform
) {
public Builder addStaticPart(Renderable part, Mat4 transform) {
return addPart(part, new Mat4(transform), false);
}
public Builder addDynamicPart(
Renderable part
) {
public Builder addDynamicPart(Renderable part) {
return addPart(part, new Mat4(), true);
}
public Builder addStaticPart(
Renderable part
) {
public Builder addStaticPart(Renderable part) {
return addStaticPart(part, IDENTITY);
}

View File

@ -40,20 +40,13 @@ public class Face implements Comparable<Face> {
private ShortBuffer userIndices;
private boolean userIndicesUpdated = true;
public Face(
Texture texture,
ByteBuffer vertices,
ShortBuffer indices
) {
public Face(Texture texture, ByteBuffer vertices, ShortBuffer indices) {
setTexture(texture);
setVertices(vertices);
setIndices(indices);
}
public Face(
Texture texture,
ByteBuffer vertices
) {
public Face(Texture texture, ByteBuffer vertices) {
this(texture, vertices, null);
}
@ -66,22 +59,16 @@ public class Face implements Comparable<Face> {
private void checkVertices() {
if (vertices.remaining() % getBytesPerVertex() != 0) {
throw new IllegalArgumentException(
"Invalid vertex buffer: " +
(vertices.remaining() % getBytesPerVertex()) +
" extra bytes after last vertex"
);
throw new IllegalArgumentException("Invalid vertex buffer: " + (vertices.remaining() % getBytesPerVertex())
+ " extra bytes after last vertex");
}
}
private void checkIndices() {
if (userIndices != GENERATE_SUCCESSIVE_LATER) {
if (userIndices.remaining() % 3 != 0) {
throw new IllegalArgumentException(
"Invalid vertex indices: " +
(userIndices.remaining() % 3) +
" extra indices after last triangle"
);
throw new IllegalArgumentException("Invalid vertex indices: " + (userIndices.remaining() % 3)
+ " extra indices after last triangle");
}
userIndices.mark();
@ -91,21 +78,15 @@ public class Face implements Comparable<Face> {
short index = userIndices.get();
if (index < 0 || index >= vertexCount) {
throw new IllegalArgumentException(
"Invalid vertex index " + index +
" (" + vertexCount + " vertices available)"
);
"Invalid vertex index " + index + " (" + vertexCount + " vertices available)");
}
}
userIndices.reset();
} else {
if (getVertexCount() % 3 != 0) {
throw new IllegalArgumentException(
"Invalid vertices: " +
(getVertexCount() % 3) +
" extra indices after last triangle " +
"(indices are automatic)"
);
throw new IllegalArgumentException("Invalid vertices: " + (getVertexCount() % 3)
+ " extra indices after last triangle " + "(indices are automatic)");
}
}
}

View File

@ -38,8 +38,7 @@ public class FaceGroup {
for (int i = start; i < end; ++i) {
Face face = faces[i];
assert this.texture == null
? (face.getTexture() == null)
assert this.texture == null ? (face.getTexture() == null)
: (face.getTexture().getSprite().getPrimitive() == this.texture);
indexCount += face.getIndexCount();

View File

@ -32,86 +32,30 @@ public class Faces {
private Faces() {
}
public static Face createRectangle(
ShapeRenderProgram program,
Texture texture,
Vec4 colorMultiplier,
Vec3 origin,
Vec3 width,
Vec3 height,
boolean flip
) {
public static Face createRectangle(ShapeRenderProgram program, Texture texture, Vec4 colorMultiplier, Vec3 origin,
Vec3 width, Vec3 height, boolean flip) {
VertexBuilder builder = program.getVertexBuilder();
builder.addVertex(
origin,
colorMultiplier,
new Vec2(0, 0)
).addVertex(
origin.add_(height),
colorMultiplier,
new Vec2(0, 1)
).addVertex(
origin.add_(width),
colorMultiplier,
new Vec2(1, 0)
).addVertex(
origin.add_(width).add(height),
colorMultiplier,
new Vec2(1, 1)
);
builder.addVertex(origin, colorMultiplier, new Vec2(0, 0))
.addVertex(origin.add_(height), colorMultiplier, new Vec2(0, 1))
.addVertex(origin.add_(width), colorMultiplier, new Vec2(1, 0))
.addVertex(origin.add_(width).add(height), colorMultiplier, new Vec2(1, 1));
ShortBuffer buffer = flip ? ShortBuffer.wrap(
new short[] {
0,
1,
3,
0,
3,
2
}
)
: ShortBuffer.wrap(
new short[] {
3,
1,
0,
2,
3,
0
}
);
ShortBuffer buffer = flip ? ShortBuffer.wrap(new short[] { 0, 1, 3, 0, 3, 2 })
: ShortBuffer.wrap(new short[] { 3, 1, 0, 2, 3, 0 });
return new Face(
texture,
builder.assemble(),
buffer
);
return new Face(texture, builder.assemble(), buffer);
}
public static Face createBlockFace(
ShapeRenderProgram program,
Texture texture,
Vec4 colorMultiplier,
Vec3 blockCenter,
BlockFace face,
boolean inner
) {
public static Face createBlockFace(ShapeRenderProgram program, Texture texture, Vec4 colorMultiplier,
Vec3 blockCenter, BlockFace face, boolean inner) {
BlockFaceVectors vectors = BlockFaceVectors.get(inner);
Vec3 origin = blockCenter.add_(vectors.getOrigin(face));
Vec3 width = vectors.getWidth(face);
Vec3 height = vectors.getHeight(face);
return createRectangle(
program,
texture,
colorMultiplier,
origin,
width,
height,
inner
);
return createRectangle(program, texture, colorMultiplier, origin, width, height, inner);
}
}

View File

@ -37,23 +37,13 @@ public class LambdaModel extends DynamicModel {
private final TransformGetter[] getters;
public LambdaModel(
Renderable[] parts,
Mat4[] transforms,
boolean[] dynamic,
TransformGetter[] getters
) {
public LambdaModel(Renderable[] parts, Mat4[] transforms, boolean[] dynamic, TransformGetter[] getters) {
super(parts, transforms, dynamic);
this.getters = getters;
}
public LambdaModel(Builder builder) {
this(
builder.getParts(),
builder.getTransforms(),
builder.getDynamics(),
builder.getGetters()
);
this(builder.getParts(), builder.getTransforms(), builder.getDynamics(), builder.getGetters());
}
@Override
@ -75,11 +65,7 @@ public class LambdaModel extends DynamicModel {
protected Builder() {
}
private Builder addPart(
Renderable part,
Mat4 transform,
TransformGetter getter
) {
private Builder addPart(Renderable part, Mat4 transform, TransformGetter getter) {
parts.add(Objects.requireNonNull(part, "part"));
transforms.add(Objects.requireNonNull(transform, "transform"));
dynamics.add(getter != null);
@ -88,23 +74,15 @@ public class LambdaModel extends DynamicModel {
return this;
}
public Builder addStaticPart(
Renderable part,
Mat4 transform
) {
public Builder addStaticPart(Renderable part, Mat4 transform) {
return addPart(part, new Mat4(transform), null);
}
public Builder addDynamicPart(
Renderable part,
TransformGetter getter
) {
public Builder addDynamicPart(Renderable part, TransformGetter getter) {
return addPart(part, new Mat4(), getter);
}
public Builder addStaticPart(
Renderable part
) {
public Builder addStaticPart(Renderable part) {
return addStaticPart(part, IDENTITY);
}
@ -127,12 +105,8 @@ public class LambdaModel extends DynamicModel {
}
public static LambdaModel animate(Renderable model, TransformGetter transform) {
return new LambdaModel(
new Renderable[] { model },
new Mat4[] { new Mat4() },
new boolean[] { true },
new TransformGetter[] { transform }
);
return new LambdaModel(new Renderable[] { model }, new Mat4[] { new Mat4() }, new boolean[] { true },
new TransformGetter[] { transform });
}
}

View File

@ -28,15 +28,10 @@ public class ShapeRenderHelper {
protected static final int TRANSFORM_STACK_SIZE = 64;
protected static final int COLOR_MULTIPLIER_STACK_SIZE = TRANSFORM_STACK_SIZE;
protected final StashingStack<Mat4> transformStack = new StashingStack<>(
TRANSFORM_STACK_SIZE,
Mat4::new
);
protected final StashingStack<Mat4> transformStack = new StashingStack<>(TRANSFORM_STACK_SIZE, Mat4::new);
protected final StashingStack<Vec4> colorMultiplierStack = new StashingStack<>(
COLOR_MULTIPLIER_STACK_SIZE,
Vec4::new
);
protected final StashingStack<Vec4> colorMultiplierStack = new StashingStack<>(COLOR_MULTIPLIER_STACK_SIZE,
Vec4::new);
{
transformStack.push().identity();

View File

@ -53,8 +53,7 @@ public class ShapeRenderProgram extends Program {
POSITIONS_ATTRIBUTE_NAME = "inputPositions",
UNIFORM_COLOR_MULTIPLER_ATTRIBUTE_NAME = "uniformColorMultiplier",
ATTRIBUTE_COLOR_MULTIPLER_ATTRIBUTE_NAME = "inputColorMultiplier",
TEXTURE_COORDS_ATTRIBUTE_NAME = "inputTextureCoords",
USE_TEXTURE_UNIFORM_NAME = "useTexture",
TEXTURE_COORDS_ATTRIBUTE_NAME = "inputTextureCoords", USE_TEXTURE_UNIFORM_NAME = "useTexture",
TEXTURE_SLOT_UNIFORM_NAME = "textureSlot";
private final Uniform4Matrix finalTransformUniform;
@ -65,21 +64,11 @@ public class ShapeRenderProgram extends Program {
private final Uniform1Int useTextureUniform;
private final Uniform1Int textureSlotUniform;
public ShapeRenderProgram(
String[] vertexShaderResources,
String[] fragmentShaderResources
) {
super(
new CombinedShader(
attachVertexShader(vertexShaderResources)
),
new CombinedShader(
attachFragmentShader(fragmentShaderResources)
)
);
public ShapeRenderProgram(String[] vertexShaderResources, String[] fragmentShaderResources) {
super(new CombinedShader(attachVertexShader(vertexShaderResources)),
new CombinedShader(attachFragmentShader(fragmentShaderResources)));
this.finalTransformUniform = getUniform(FINAL_TRANSFORM_UNIFORM_NAME)
.as4Matrix();
this.finalTransformUniform = getUniform(FINAL_TRANSFORM_UNIFORM_NAME).as4Matrix();
this.positionsAttribute = getAttribute(POSITIONS_ATTRIBUTE_NAME).asVertexArray();
@ -89,11 +78,9 @@ public class ShapeRenderProgram extends Program {
this.textureCoordsAttribute = getAttribute(TEXTURE_COORDS_ATTRIBUTE_NAME).asVertexArray();
this.useTextureUniform = getUniform(USE_TEXTURE_UNIFORM_NAME)
.as1Int();
this.useTextureUniform = getUniform(USE_TEXTURE_UNIFORM_NAME).as1Int();
this.textureSlotUniform = getUniform(TEXTURE_SLOT_UNIFORM_NAME)
.as1Int();
this.textureSlotUniform = getUniform(TEXTURE_SLOT_UNIFORM_NAME).as1Int();
}
private static String[] attachVertexShader(String[] others) {
@ -104,10 +91,7 @@ public class ShapeRenderProgram extends Program {
return ObjectArrays.concat(SHAPE_FRAGMENT_SHADER_RESOURCE, others);
}
public void render(
ShapeRenderHelper helper,
Shape shape
) {
public void render(ShapeRenderHelper helper, Shape shape) {
use();
configure(helper);
@ -145,34 +129,13 @@ public class ShapeRenderProgram extends Program {
int vertexStride = getBytesPerVertex();
int offset = 0;
positionsAttribute.set(
3,
GL11.GL_FLOAT,
false,
vertexStride,
vertices,
offset
);
positionsAttribute.set(3, GL11.GL_FLOAT, false, vertexStride, vertices, offset);
offset += 3 * Float.BYTES;
colorsAttribute.set(
4,
GL11.GL_FLOAT,
false,
vertexStride,
vertices,
offset
);
colorsAttribute.set(4, GL11.GL_FLOAT, false, vertexStride, vertices, offset);
offset += 4 * Float.BYTES;
textureCoordsAttribute.set(
2,
GL11.GL_FLOAT,
false,
vertexStride,
vertices,
offset
);
textureCoordsAttribute.set(2, GL11.GL_FLOAT, false, vertexStride, vertices, offset);
offset += 2 * Float.BYTES;
return offset;
@ -193,12 +156,8 @@ public class ShapeRenderProgram extends Program {
useTextureUniform.set(0);
}
GL11.glDrawElements(
GL11.GL_TRIANGLES,
group.getIndexCount(),
GL11.GL_UNSIGNED_SHORT,
group.getByteOffsetOfIndices()
);
GL11.glDrawElements(GL11.GL_TRIANGLES, group.getIndexCount(), GL11.GL_UNSIGNED_SHORT,
group.getByteOffsetOfIndices());
}
public int getBytesPerVertex() {
@ -220,13 +179,9 @@ public class ShapeRenderProgram extends Program {
Sprite sprite = face.getTexture().getSprite();
for (int i = 0; i < face.getVertexCount(); i++) {
int offset = vertices.position() + i * getBytesPerVertex() + (3 * Float.BYTES +
4 * Float.BYTES);
int offset = vertices.position() + i * getBytesPerVertex() + (3 * Float.BYTES + 4 * Float.BYTES);
v.set(
vertices.getFloat(offset + 0 * Float.BYTES),
vertices.getFloat(offset + 1 * Float.BYTES)
);
v.set(vertices.getFloat(offset + 0 * Float.BYTES), vertices.getFloat(offset + 1 * Float.BYTES));
v.mul(sprite.getSize()).add(sprite.getStart());
@ -244,34 +199,11 @@ public class ShapeRenderProgram extends Program {
}
public static interface VertexBuilder {
VertexBuilder addVertex(
float x,
float y,
float z,
float r,
float g,
float b,
float tx,
float ty
);
VertexBuilder addVertex(float x, float y, float z, float r, float g, float b, float tx, float ty);
VertexBuilder addVertex(
float x,
float y,
float z,
float r,
float g,
float b,
float a,
float tx,
float ty
);
VertexBuilder addVertex(float x, float y, float z, float r, float g, float b, float a, float tx, float ty);
VertexBuilder addVertex(
Vec3 position,
Vec4 colorMultiplier,
Vec2 textureCoords
);
VertexBuilder addVertex(Vec3 position, Vec4 colorMultiplier, Vec2 textureCoords);
ByteBuffer assemble();
}
@ -293,84 +225,35 @@ public class ShapeRenderProgram extends Program {
private final List<Vertex> vertices = new ArrayList<>();
@Override
public VertexBuilder addVertex(
float x,
float y,
float z,
float r,
float g,
float b,
float a,
float tx,
float ty
) {
vertices.add(
new Vertex(
new Vec3(x, y, z),
new Vec4(r, g, b, a),
new Vec2(tx, ty)
)
);
public VertexBuilder addVertex(float x, float y, float z, float r, float g, float b, float a, float tx,
float ty) {
vertices.add(new Vertex(new Vec3(x, y, z), new Vec4(r, g, b, a), new Vec2(tx, ty)));
return this;
}
@Override
public VertexBuilder addVertex(
float x,
float y,
float z,
float r,
float g,
float b,
float tx,
float ty
) {
vertices.add(
new Vertex(
new Vec3(x, y, z),
new Vec4(r, g, b, 1f),
new Vec2(tx, ty)
)
);
public VertexBuilder addVertex(float x, float y, float z, float r, float g, float b, float tx, float ty) {
vertices.add(new Vertex(new Vec3(x, y, z), new Vec4(r, g, b, 1f), new Vec2(tx, ty)));
return this;
}
@Override
public VertexBuilder addVertex(
Vec3 position,
Vec4 colorMultiplier,
Vec2 textureCoords
) {
vertices.add(
new Vertex(
new Vec3(position),
new Vec4(colorMultiplier),
new Vec2(textureCoords)
)
);
public VertexBuilder addVertex(Vec3 position, Vec4 colorMultiplier, Vec2 textureCoords) {
vertices.add(new Vertex(new Vec3(position), new Vec4(colorMultiplier), new Vec2(textureCoords)));
return this;
}
@Override
public ByteBuffer assemble() {
ByteBuffer result = BufferUtils.createByteBuffer(
DEFAULT_BYTES_PER_VERTEX * vertices.size()
);
ByteBuffer result = BufferUtils.createByteBuffer(DEFAULT_BYTES_PER_VERTEX * vertices.size());
for (Vertex v : vertices) {
result
.putFloat(v.position.x)
.putFloat(v.position.y)
.putFloat(v.position.z)
.putFloat(v.colorMultiplier.x)
.putFloat(v.colorMultiplier.y)
.putFloat(v.colorMultiplier.z)
.putFloat(v.colorMultiplier.w)
.putFloat(v.textureCoords.x)
.putFloat(v.textureCoords.y);
result.putFloat(v.position.x).putFloat(v.position.y).putFloat(v.position.z)
.putFloat(v.colorMultiplier.x).putFloat(v.colorMultiplier.y).putFloat(v.colorMultiplier.z)
.putFloat(v.colorMultiplier.w).putFloat(v.textureCoords.x).putFloat(v.textureCoords.y);
}
result.flip();

View File

@ -34,92 +34,32 @@ public class Shapes {
Vec3 origin,
Vec3 width,
Vec3 height,
Vec3 depth,
Vec3 width, Vec3 height, Vec3 depth,
Vec4 colorMultiplier,
Texture topTexture,
Texture bottomTexture,
Texture northTexture,
Texture southTexture,
Texture eastTexture,
Texture topTexture, Texture bottomTexture, Texture northTexture, Texture southTexture, Texture eastTexture,
Texture westTexture,
boolean flip
) {
boolean flip) {
Face top = Faces.createRectangle(
program,
topTexture,
colorMultiplier,
origin.add_(height).add(width),
width.negate_(),
depth,
flip
);
Face top = Faces.createRectangle(program, topTexture, colorMultiplier, origin.add_(height).add(width),
width.negate_(), depth, flip);
Face bottom = Faces.createRectangle(
program,
bottomTexture,
colorMultiplier,
origin,
width,
depth,
flip
);
Face bottom = Faces.createRectangle(program, bottomTexture, colorMultiplier, origin, width, depth, flip);
Face north = Faces.createRectangle(
program,
northTexture,
colorMultiplier,
origin.add_(depth),
width,
height,
flip
);
Face north = Faces.createRectangle(program, northTexture, colorMultiplier, origin.add_(depth), width, height,
flip);
Face south = Faces.createRectangle(
program,
southTexture,
colorMultiplier,
origin.add_(width),
width.negate_(),
height,
flip
);
Face south = Faces.createRectangle(program, southTexture, colorMultiplier, origin.add_(width), width.negate_(),
height, flip);
Face east = Faces.createRectangle(
program,
eastTexture,
colorMultiplier,
origin,
depth,
height,
flip
);
Face east = Faces.createRectangle(program, eastTexture, colorMultiplier, origin, depth, height, flip);
Face west = Faces.createRectangle(
program,
westTexture,
colorMultiplier,
origin.add_(width).add(depth),
depth.negate_(),
height,
flip
);
Face west = Faces.createRectangle(program, westTexture, colorMultiplier, origin.add_(width).add(depth),
depth.negate_(), height, flip);
Shape result = new Shape(
Usage.STATIC,
program,
top,
bottom,
north,
south,
east,
west
);
Shape result = new Shape(Usage.STATIC, program, top, bottom, north, south, east, west);
return result;
}
@ -145,15 +85,8 @@ public class Shapes {
private boolean flip = false;
public PppBuilder(
ShapeRenderProgram program,
Texture top,
Texture bottom,
Texture north,
Texture south,
Texture east,
Texture west
) {
public PppBuilder(ShapeRenderProgram program, Texture top, Texture bottom, Texture north, Texture south,
Texture east, Texture west) {
this.program = program;
this.topTexture = top;
this.bottomTexture = bottom;
@ -163,19 +96,10 @@ public class Shapes {
this.westTexture = west;
}
public PppBuilder(
ShapeRenderProgram program,
Map<BlockFace, Texture> textureMap
) {
this(
program,
textureMap.get(BlockFace.TOP),
textureMap.get(BlockFace.BOTTOM),
textureMap.get(BlockFace.NORTH),
textureMap.get(BlockFace.SOUTH),
textureMap.get(BlockFace.EAST),
textureMap.get(BlockFace.WEST)
);
public PppBuilder(ShapeRenderProgram program, Map<BlockFace, Texture> textureMap) {
this(program, textureMap.get(BlockFace.TOP), textureMap.get(BlockFace.BOTTOM),
textureMap.get(BlockFace.NORTH), textureMap.get(BlockFace.SOUTH), textureMap.get(BlockFace.EAST),
textureMap.get(BlockFace.WEST));
}
public PppBuilder(ShapeRenderProgram program, Texture texture) {
@ -266,21 +190,8 @@ public class Shapes {
}
public Shape create() {
return createParallelepiped(
program,
origin,
width,
height,
depth,
colorMultiplier,
topTexture,
bottomTexture,
northTexture,
southTexture,
eastTexture,
westTexture,
flip
);
return createParallelepiped(program, origin, width, height, depth, colorMultiplier, topTexture,
bottomTexture, northTexture, southTexture, eastTexture, westTexture, flip);
}
}

View File

@ -30,10 +30,7 @@ public class StaticModel extends Model {
private final Mat4[] transforms;
public StaticModel(
Renderable[] parts,
Mat4[] transforms
) {
public StaticModel(Renderable[] parts, Mat4[] transforms) {
super(parts);
this.transforms = transforms;
}
@ -55,19 +52,14 @@ public class StaticModel extends Model {
protected Builder() {
}
public Builder addPart(
Renderable part,
Mat4 transform
) {
public Builder addPart(Renderable part, Mat4 transform) {
parts.add(Objects.requireNonNull(part, "part"));
transforms.add(Objects.requireNonNull(transform, "transform"));
return this;
}
public Builder addPart(
Renderable part
) {
public Builder addPart(Renderable part) {
return addPart(part, IDENTITY);
}

View File

@ -87,11 +87,8 @@ public class Atlases {
editor.draw(data, nextX, nextY);
Sprite result = new Sprite(
getPrimitive(),
toPrimitiveCoords(nextX, nextY),
toPrimitiveCoords(width, height)
);
Sprite result = new Sprite(getPrimitive(), toPrimitiveCoords(nextX, nextY),
toPrimitiveCoords(width, height));
nextX += width;

View File

@ -30,67 +30,27 @@ public class ComplexTexture {
private final float assumedWidth;
private final float assumedHeight;
public ComplexTexture(
TexturePrimitive primitive,
int abstractWidth,
int abstractHeight
) {
public ComplexTexture(TexturePrimitive primitive, int abstractWidth, int abstractHeight) {
this.primitive = primitive;
this.assumedWidth = abstractWidth
/ (float) primitive.getWidth() * primitive.getBufferWidth();
this.assumedWidth = abstractWidth / (float) primitive.getWidth() * primitive.getBufferWidth();
this.assumedHeight = abstractHeight
/ (float) primitive.getHeight() * primitive.getBufferHeight();
this.assumedHeight = abstractHeight / (float) primitive.getHeight() * primitive.getBufferHeight();
}
public Texture get(int x, int y, int width, int height) {
return new SimpleTexture(
new Sprite(
primitive,
new Vec2(x / assumedWidth, y / assumedHeight),
new Vec2(width / assumedWidth, height / assumedHeight)
)
);
return new SimpleTexture(new Sprite(primitive, new Vec2(x / assumedWidth, y / assumedHeight),
new Vec2(width / assumedWidth, height / assumedHeight)));
}
public Map<BlockFace, Texture> getCuboidTextures(
int x,
int y,
int width,
int height,
int depth
) {
return BlockFace.mapToFaces(
get(
x + depth + width,
y + height + depth,
-width,
-depth
),
get(
x + depth + width + width,
y + height + depth,
-width,
-depth
),
get(x + depth, y, width, height),
get(
x + depth + width + depth,
y,
width,
height
),
get(x, y, depth, height),
get(x + depth + width, y, depth, height)
);
public Map<BlockFace, Texture> getCuboidTextures(int x, int y, int width, int height, int depth) {
return BlockFace.mapToFaces(get(x + depth + width, y + height + depth, -width, -depth),
get(x + depth + width + width, y + height + depth, -width, -depth), get(x + depth, y, width, height),
get(x + depth + width + depth, y, width, height), get(x, y, depth, height),
get(x + depth + width, y, depth, height));
}
public Map<BlockFace, Texture> getCuboidTextures(
int x,
int y,
int size
) {
public Map<BlockFace, Texture> getCuboidTextures(int x, int y, int size) {
return getCuboidTextures(x, y, size, size, size);
}

View File

@ -44,9 +44,7 @@ public class SimpleTextures {
try {
TextureDataEditor data = TextureLoader.loadPixels(resource, SETTINGS);
return new SimpleTexture(
new Sprite(new TexturePrimitive(data.getData()))
);
return new SimpleTexture(new Sprite(new TexturePrimitive(data.getData())));
} catch (IOException e) {
throw CrashReports.report(e, "Could not load texture %s", resource);
}

View File

@ -38,14 +38,8 @@ public class Sprite {
}
public Sprite(TexturePrimitive primitive) {
this(
primitive,
ORIGIN,
new Vec2(
primitive.getWidth() / (float) primitive.getBufferWidth(),
primitive.getHeight() / (float) primitive.getBufferHeight()
)
);
this(primitive, ORIGIN, new Vec2(primitive.getWidth() / (float) primitive.getBufferWidth(),
primitive.getHeight() / (float) primitive.getBufferHeight()));
}
public TexturePrimitive getPrimitive() {

View File

@ -35,14 +35,8 @@ class TextureData {
private final int width;
private final int height;
public TextureData(
ByteBuffer data,
int bufferWidth,
int bufferHeight,
int width,
int height,
TextureSettings settings
) {
public TextureData(ByteBuffer data, int bufferWidth, int bufferHeight, int width, int height,
TextureSettings settings) {
this.data = data;
this.width = width;
this.height = height;
@ -66,8 +60,7 @@ class TextureData {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(
GL_TEXTURE_2D, // Load 2D image
glTexImage2D(GL_TEXTURE_2D, // Load 2D image
0, // Not mipmapped
GL_RGBA, // Use RGBA
bufferWidth, // Width

View File

@ -28,21 +28,10 @@ public class TextureDataEditor {
protected final TextureData data;
public TextureDataEditor(
int bufferWidth,
int bufferHeight,
int contentWidth,
int contentHeight,
TextureSettings settings
) {
this.data = new TextureData(
BufferUtils.createByteBuffer(bufferWidth * bufferHeight * 4),
bufferWidth,
bufferHeight,
contentWidth,
contentHeight,
settings
);
public TextureDataEditor(int bufferWidth, int bufferHeight, int contentWidth, int contentHeight,
TextureSettings settings) {
this.data = new TextureData(BufferUtils.createByteBuffer(bufferWidth * bufferHeight * 4), bufferWidth,
bufferHeight, contentWidth, contentHeight, settings);
}
public TextureDataEditor(TextureData data) {
@ -61,21 +50,13 @@ public class TextureDataEditor {
TextureData t = getData();
ByteBuffer fromBuffer = getBuffer();
ByteBuffer toBuffer = BufferUtils.createByteBuffer(
fromBuffer.capacity()
);
ByteBuffer toBuffer = BufferUtils.createByteBuffer(fromBuffer.capacity());
copy(fromBuffer, 0, fromBuffer.capacity(), toBuffer);
toBuffer.clear();
return new TextureData(
toBuffer,
t.getBufferWidth(),
t.getBufferHeight(),
t.getContentWidth(),
t.getContentHeight(),
t.getSettings()
);
return new TextureData(toBuffer, t.getBufferWidth(), t.getBufferHeight(), t.getContentWidth(),
t.getContentHeight(), t.getSettings());
}
public TextureData createSnapshot(TextureData output) {
@ -114,16 +95,7 @@ public class TextureDataEditor {
return getData().getSettings();
}
public void draw(
ByteBuffer src,
int srcWidth,
int srcX,
int srcY,
int dstX,
int dstY,
int width,
int height
) {
public void draw(ByteBuffer src, int srcWidth, int srcX, int srcY, int dstX, int dstY, int width, int height) {
ByteBuffer dst = getBuffer();
int position = src.position();
@ -148,77 +120,20 @@ public class TextureDataEditor {
}
}
public void draw(
TextureData source,
int srcX,
int srcY,
int dstX,
int dstY,
int width,
int height
) {
draw(
source.getData(),
source.getBufferWidth(),
srcX,
srcY,
dstX,
dstY,
width,
height
);
public void draw(TextureData source, int srcX, int srcY, int dstX, int dstY, int width, int height) {
draw(source.getData(), source.getBufferWidth(), srcX, srcY, dstX, dstY, width, height);
}
public void draw(
TextureData source,
int dstX,
int dstY
) {
draw(
source,
0,
0,
dstX,
dstY,
source.getContentWidth(),
source.getContentHeight()
);
public void draw(TextureData source, int dstX, int dstY) {
draw(source, 0, 0, dstX, dstY, source.getContentWidth(), source.getContentHeight());
}
public void draw(
TextureDataEditor source,
int srcX,
int srcY,
int dstX,
int dstY,
int width,
int height
) {
draw(
source.getData(),
srcX,
srcY,
dstX,
dstY,
width,
height
);
public void draw(TextureDataEditor source, int srcX, int srcY, int dstX, int dstY, int width, int height) {
draw(source.getData(), srcX, srcY, dstX, dstY, width, height);
}
public void draw(
TextureDataEditor source,
int dstX,
int dstY
) {
draw(
source,
0,
0,
dstX,
dstY,
source.getContentWidth(),
source.getContentHeight()
);
public void draw(TextureDataEditor source, int dstX, int dstY) {
draw(source, 0, 0, dstX, dstY, source.getContentWidth(), source.getContentHeight());
}
public void setPixel(int x, int y, int color) {
@ -237,12 +152,7 @@ public class TextureDataEditor {
buffer.limit(buffer.position() + length * BYTES_PER_PIXEL);
}
private static void copy(
ByteBuffer src,
int srcStart,
int srcEnd,
ByteBuffer dst
) {
private static void copy(ByteBuffer src, int srcStart, int srcEnd, ByteBuffer dst) {
int position = src.position();
int limit = src.limit();

View File

@ -31,11 +31,7 @@ import ru.windcorp.progressia.common.util.BinUtil;
public class TextureLoader {
public static TextureDataEditor loadPixels(
InputStream compressed,
TextureSettings settings
)
throws IOException {
public static TextureDataEditor loadPixels(InputStream compressed, TextureSettings settings) throws IOException {
BufferedImage readResult = ImageIO.read(compressed);
int width = readResult.getWidth();
@ -44,10 +40,7 @@ public class TextureLoader {
int bufferWidth = BinUtil.roundToGreaterPowerOf2(width);
int bufferHeight = BinUtil.roundToGreaterPowerOf2(height);
WritableRaster raster = TextureUtil.createRaster(
bufferWidth,
bufferHeight
);
WritableRaster raster = TextureUtil.createRaster(bufferWidth, bufferHeight);
BufferedImage canvas = TextureUtil.createCanvas(raster);
@ -56,49 +49,22 @@ public class TextureLoader {
try {
g.setColor(TextureUtil.CANVAS_BACKGROUND);
g.fillRect(0, 0, bufferWidth, bufferHeight);
g.drawImage(
readResult,
0,
0,
width,
height,
0,
height,
width,
0, // Flip the image
null
);
g.drawImage(readResult, 0, 0, width, height, 0, height, width, 0, // Flip
// the
// image
null);
} finally {
g.dispose();
}
TextureDataEditor result = new TextureDataEditor(
bufferWidth,
bufferHeight,
width,
height,
settings
);
TextureDataEditor result = new TextureDataEditor(bufferWidth, bufferHeight, width, height, settings);
result.draw(
TextureUtil.extractBytes(raster),
bufferWidth,
0,
0,
0,
0,
width,
height
);
result.draw(TextureUtil.extractBytes(raster), bufferWidth, 0, 0, 0, 0, width, height);
return result;
}
public static TextureDataEditor loadPixels(
Resource resource,
TextureSettings settings
)
throws IOException {
public static TextureDataEditor loadPixels(Resource resource, TextureSettings settings) throws IOException {
return loadPixels(resource.getInputStream(), settings);
}

View File

@ -39,8 +39,8 @@ public class TextureUtil {
public static final Color CANVAS_BACKGROUND = new Color(0, true);
public static final ColorModel COLOR_MODEL = new ComponentColorModel(
ColorSpace.getInstance(ColorSpace.CS_sRGB), // Use RGB
public static final ColorModel COLOR_MODEL = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), // Use
// RGB
null, // Use every bit
true, // Has alpha
false, // Not premultiplied
@ -50,12 +50,9 @@ public class TextureUtil {
private static final Hashtable<?, ?> BUFFERED_IMAGE_PROPERTIES = new Hashtable<>();
public static WritableRaster createRaster(
int bufferWidth,
int bufferHeight
) {
return Raster.createInterleavedRaster(
DataBuffer.TYPE_BYTE, // Storage model
public static WritableRaster createRaster(int bufferWidth, int bufferHeight) {
return Raster.createInterleavedRaster(DataBuffer.TYPE_BYTE, // Storage
// model
bufferWidth, // Buffer width
bufferHeight, // Buffer height
BYTES_PER_PIXEL, // ARGB
@ -63,11 +60,7 @@ public class TextureUtil {
);
}
public static WritableRaster createRaster(
ByteBuffer buffer,
int bufferWidth,
int bufferHeight
) {
public static WritableRaster createRaster(ByteBuffer buffer, int bufferWidth, int bufferHeight) {
final int bands = BYTES_PER_PIXEL;
byte[] bytes = new byte[bufferWidth * bufferHeight * bands];
@ -77,8 +70,7 @@ public class TextureUtil {
DataBufferByte dataBuffer = new DataBufferByte(bytes, bytes.length);
return Raster.createInterleavedRaster(
dataBuffer, // The buffer
return Raster.createInterleavedRaster(dataBuffer, // The buffer
bufferWidth, // Buffer width
bufferHeight, // Buffer height
bands * bufferWidth, // Scanline stride
@ -89,8 +81,7 @@ public class TextureUtil {
}
public static BufferedImage createCanvas(WritableRaster raster) {
return new BufferedImage(
COLOR_MODEL, // Color model
return new BufferedImage(COLOR_MODEL, // Color model
raster, // Backing raster
false, // Raster is not premultipied
BUFFERED_IMAGE_PROPERTIES // Properties
@ -107,10 +98,7 @@ public class TextureUtil {
return buffer;
}
public static ByteBuffer extractBytes(
WritableRaster raster,
ByteBuffer output
) {
public static ByteBuffer extractBytes(WritableRaster raster, ByteBuffer output) {
byte[] data = ((DataBufferByte) raster.getDataBuffer()).getData();
output.put(data);

View File

@ -42,10 +42,7 @@ public class Camera {
void applyCameraRotation(Mat4 output);
public static Mode of(
Consumer<Vec3> offsetGetter,
Consumer<Mat4> rotator
) {
public static Mode of(Consumer<Vec3> offsetGetter, Consumer<Mat4> rotator) {
return new Mode() {
@Override
public void getCameraOffset(Vec3 output) {
@ -121,13 +118,8 @@ public class Camera {
private void applyPerspective(WorldRenderHelper helper) {
Mat4 previous = helper.getViewTransform();
Glm.perspective(
computeFovY(),
GraphicsInterface.getAspectRatio(),
0.01f,
150.0f,
helper.pushViewTransform()
).mul(previous);
Glm.perspective(computeFovY(), GraphicsInterface.getAspectRatio(), 0.01f, 150.0f, helper.pushViewTransform())
.mul(previous);
}
private void rotateCoordinateSystem(WorldRenderHelper helper) {
@ -152,23 +144,14 @@ public class Camera {
float pitch = anchor.getCameraPitch();
float yaw = anchor.getCameraYaw();
helper.pushViewTransform()
.rotateY(-pitch)
.rotateZ(-yaw);
helper.pushViewTransform().rotateY(-pitch).rotateZ(-yaw);
this.lastAnchorYaw = yaw;
this.lastAnchorPitch = pitch;
this.lastAnchorLookingAt.set(
cos(pitch) * cos(yaw),
cos(pitch) * sin(yaw),
sin(pitch)
);
this.lastAnchorUp.set(
cos(pitch + PI_F / 2) * cos(yaw),
cos(pitch + PI_F / 2) * sin(yaw),
sin(pitch + PI_F / 2)
);
this.lastAnchorLookingAt.set(cos(pitch) * cos(yaw), cos(pitch) * sin(yaw), sin(pitch));
this.lastAnchorUp.set(cos(pitch + PI_F / 2) * cos(yaw), cos(pitch + PI_F / 2) * sin(yaw),
sin(pitch + PI_F / 2));
}
private void applyPosition(WorldRenderHelper helper) {
@ -194,11 +177,7 @@ public class Camera {
if (widthOverHeight >= 1) {
return fieldOfView;
} else {
return (float) (2 * atan(
1 / widthOverHeight
*
tan(fieldOfView / 2)
));
return (float) (2 * atan(1 / widthOverHeight * tan(fieldOfView / 2)));
}
}
@ -234,9 +213,7 @@ public class Camera {
if (modesCollection.isEmpty()) {
throw new IllegalArgumentException(
"Anchor " + anchor + " returned no camera modes,"
+ " at least one required"
);
"Anchor " + anchor + " returned no camera modes," + " at least one required");
}
this.anchor = anchor;
@ -250,24 +227,8 @@ public class Camera {
this.lastAnchorYaw = Float.NaN;
this.lastAnchorPitch = Float.NaN;
this.lastCameraMatrix.set(
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN,
Float.NaN
);
this.lastCameraMatrix.set(Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN,
Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN);
this.lastAnchorLookingAt.set(Float.NaN);
this.lastAnchorUp.set(Float.NaN);

View File

@ -44,18 +44,11 @@ public class EntityAnchor implements Anchor {
}),
// Third person, looking forward
Mode.of(
v -> v.set(-3.5f, +0.5f, 0),
m -> {
}
),
Mode.of(v -> v.set(-3.5f, +0.5f, 0), m -> {
}),
// Third person, looking back
Mode.of(
v -> v.set(-3.5f, 0, 0),
m -> m.rotateZ((float) Math.PI)
)
);
Mode.of(v -> v.set(-3.5f, 0, 0), m -> m.rotateZ((float) Math.PI)));
}
@Override

View File

@ -132,12 +132,8 @@ public class LayerWorld extends Layer {
tmp_collideableList.clear();
tmp_collideableList.addAll(this.client.getWorld().getData().getEntities());
Collider.performCollisions(
tmp_collideableList,
this.client.getWorld().getData(),
tickLength,
tmp_colliderWorkspace
);
Collider.performCollisions(tmp_collideableList, this.client.getWorld().getData(), tickLength,
tmp_colliderWorkspace);
}
private static final Renderable SELECTION_BOX = tmp_createSelectionBox();
@ -166,26 +162,14 @@ public class LayerWorld extends Layer {
for (float phi = 0; phi < 2 * FloatMathUtil.PI_F; phi += FloatMathUtil.PI_F / 2) {
Mat4 rot = new Mat4().identity().rotateZ(phi).scale(scale);
b.addPart(
new PppBuilder(p, (Texture) null).setOrigin(
new Vec3(-f - 0.5f, -f - 0.5f, -f - 0.5f)
).setSize(f, f, 2 * f + 1).setColorMultiplier(color).create(),
rot
);
b.addPart(new PppBuilder(p, (Texture) null).setOrigin(new Vec3(-f - 0.5f, -f - 0.5f, -f - 0.5f))
.setSize(f, f, 2 * f + 1).setColorMultiplier(color).create(), rot);
b.addPart(
new PppBuilder(p, (Texture) null).setOrigin(
new Vec3(-f - 0.5f, -0.5f, -f - 0.5f)
).setSize(f, 1, f).setColorMultiplier(color).create(),
rot
);
b.addPart(new PppBuilder(p, (Texture) null).setOrigin(new Vec3(-f - 0.5f, -0.5f, -f - 0.5f))
.setSize(f, 1, f).setColorMultiplier(color).create(), rot);
b.addPart(
new PppBuilder(p, (Texture) null).setOrigin(
new Vec3(-f - 0.5f, -0.5f, +0.5f)
).setSize(f, 1, f).setColorMultiplier(color).create(),
rot
);
b.addPart(new PppBuilder(p, (Texture) null).setOrigin(new Vec3(-f - 0.5f, -0.5f, +0.5f)).setSize(f, 1, f)
.setColorMultiplier(color).create(), rot);
}
return b.build();

View File

@ -24,10 +24,7 @@ import ru.windcorp.progressia.common.util.StashingStack;
public class WorldRenderHelper extends ShapeRenderHelper {
private final StashingStack<Mat4> viewTransformStack = new StashingStack<>(
TRANSFORM_STACK_SIZE,
Mat4::new
);
private final StashingStack<Mat4> viewTransformStack = new StashingStack<>(TRANSFORM_STACK_SIZE, Mat4::new);
{
viewTransformStack.push().identity();

View File

@ -44,10 +44,8 @@ public class WorldRenderProgram extends ShapeRenderProgram {
private static WorldRenderProgram def = null;
public static void init() {
def = new WorldRenderProgram(
new String[] { "WorldDefault.vertex.glsl" },
new String[] { "WorldDefault.fragment.glsl" }
);
def = new WorldRenderProgram(new String[] { "WorldDefault.vertex.glsl" },
new String[] { "WorldDefault.fragment.glsl" });
}
public static WorldRenderProgram getDefault() {
@ -68,20 +66,12 @@ public class WorldRenderProgram extends ShapeRenderProgram {
private final Uniform4Matrix worldTransformUniform;
private final AttributeVertexArray normalsAttribute;
public WorldRenderProgram(
String[] vertexShaderResources,
String[] fragmentShaderResources
) {
super(
attachVertexShader(vertexShaderResources),
attachFragmentShader(fragmentShaderResources)
);
public WorldRenderProgram(String[] vertexShaderResources, String[] fragmentShaderResources) {
super(attachVertexShader(vertexShaderResources), attachFragmentShader(fragmentShaderResources));
this.worldTransformUniform = getUniform(WORLD_TRANSFORM_UNIFORM_NAME)
.as4Matrix();
this.worldTransformUniform = getUniform(WORLD_TRANSFORM_UNIFORM_NAME).as4Matrix();
this.normalsAttribute = getAttribute(NORMALS_ATTRIBUTE_NAME)
.asVertexArray();
this.normalsAttribute = getAttribute(NORMALS_ATTRIBUTE_NAME).asVertexArray();
}
private static String[] attachVertexShader(String[] others) {
@ -103,14 +93,7 @@ public class WorldRenderProgram extends ShapeRenderProgram {
int vertexStride = getBytesPerVertex();
int offset = super.bindVertices(vertices);
normalsAttribute.set(
3,
GL11.GL_FLOAT,
false,
vertexStride,
vertices,
offset
);
normalsAttribute.set(3, GL11.GL_FLOAT, false, vertexStride, vertices, offset);
offset += 3 * Float.BYTES;
return offset;
@ -130,8 +113,7 @@ public class WorldRenderProgram extends ShapeRenderProgram {
@Override
public int getBytesPerVertex() {
return super.getBytesPerVertex() +
3 * Float.BYTES; // Normals
return super.getBytesPerVertex() + 3 * Float.BYTES; // Normals
}
@Override
@ -171,12 +153,7 @@ public class WorldRenderProgram extends ShapeRenderProgram {
Vectors.release(normal);
}
private void computeOneNormal(
Vec3 a,
Vec3 b,
Vec3 c,
Vec3 normal
) {
private void computeOneNormal(Vec3 a, Vec3 b, Vec3 c, Vec3 normal) {
b.sub(a);
c.sub(a);
b.cross(c, normal);
@ -187,18 +164,14 @@ public class WorldRenderProgram extends ShapeRenderProgram {
ByteBuffer vertices = face.getVertices();
int offset = vertices.position() + index * getBytesPerVertex();
result.set(
vertices.getFloat(offset + 0 * Float.BYTES),
vertices.getFloat(offset + 1 * Float.BYTES),
vertices.getFloat(offset + 2 * Float.BYTES)
);
result.set(vertices.getFloat(offset + 0 * Float.BYTES), vertices.getFloat(offset + 1 * Float.BYTES),
vertices.getFloat(offset + 2 * Float.BYTES));
}
private void saveVertexNormal(Face face, int index, Vec3 normal) {
ByteBuffer vertices = face.getVertices();
int offset = vertices.position() + index * getBytesPerVertex() + (3 * Float.BYTES +
4 * Float.BYTES +
2 * Float.BYTES);
int offset = vertices.position() + index * getBytesPerVertex()
+ (3 * Float.BYTES + 4 * Float.BYTES + 2 * Float.BYTES);
vertices.putFloat(offset + 0 * Float.BYTES, normal.x);
vertices.putFloat(offset + 1 * Float.BYTES, normal.y);
@ -231,87 +204,36 @@ public class WorldRenderProgram extends ShapeRenderProgram {
private final List<Vertex> vertices = new ArrayList<>();
@Override
public VertexBuilder addVertex(
float x,
float y,
float z,
float r,
float g,
float b,
float tx,
float ty
) {
vertices.add(
new Vertex(
new Vec3(x, y, z),
new Vec4(r, g, b, 1),
new Vec2(tx, ty)
)
);
public VertexBuilder addVertex(float x, float y, float z, float r, float g, float b, float tx, float ty) {
vertices.add(new Vertex(new Vec3(x, y, z), new Vec4(r, g, b, 1), new Vec2(tx, ty)));
return this;
}
@Override
public VertexBuilder addVertex(
float x,
float y,
float z,
float r,
float g,
float b,
float a,
float tx,
float ty
) {
vertices.add(
new Vertex(
new Vec3(x, y, z),
new Vec4(r, g, b, a),
new Vec2(tx, ty)
)
);
public VertexBuilder addVertex(float x, float y, float z, float r, float g, float b, float a, float tx,
float ty) {
vertices.add(new Vertex(new Vec3(x, y, z), new Vec4(r, g, b, a), new Vec2(tx, ty)));
return this;
}
@Override
public VertexBuilder addVertex(
Vec3 position,
Vec4 colorMultiplier,
Vec2 textureCoords
) {
vertices.add(
new Vertex(
new Vec3(position),
new Vec4(colorMultiplier),
new Vec2(textureCoords)
)
);
public VertexBuilder addVertex(Vec3 position, Vec4 colorMultiplier, Vec2 textureCoords) {
vertices.add(new Vertex(new Vec3(position), new Vec4(colorMultiplier), new Vec2(textureCoords)));
return this;
}
@Override
public ByteBuffer assemble() {
ByteBuffer result = BufferUtils.createByteBuffer(
DEFAULT_BYTES_PER_VERTEX * vertices.size()
);
ByteBuffer result = BufferUtils.createByteBuffer(DEFAULT_BYTES_PER_VERTEX * vertices.size());
for (Vertex v : vertices) {
result
.putFloat(v.position.x)
.putFloat(v.position.y)
.putFloat(v.position.z)
.putFloat(v.colorMultiplier.x)
.putFloat(v.colorMultiplier.y)
.putFloat(v.colorMultiplier.z)
.putFloat(v.colorMultiplier.w)
.putFloat(v.textureCoords.x)
.putFloat(v.textureCoords.y)
.putFloat(Float.NaN)
.putFloat(Float.NaN)
.putFloat(Float.NaN);
result.putFloat(v.position.x).putFloat(v.position.y).putFloat(v.position.z)
.putFloat(v.colorMultiplier.x).putFloat(v.colorMultiplier.y).putFloat(v.colorMultiplier.z)
.putFloat(v.colorMultiplier.w).putFloat(v.textureCoords.x).putFloat(v.textureCoords.y)
.putFloat(Float.NaN).putFloat(Float.NaN).putFloat(Float.NaN);
}
result.flip();

View File

@ -30,8 +30,7 @@ import java.util.Map;
public class Parser {
private String filePath;
static private final Escaper ESCAPER = new Escaper.EscaperBuilder()
.withChars("n", "\n").build();
static private final Escaper ESCAPER = new Escaper.EscaperBuilder().withChars("n", "\n").build();
public Parser(String filePath) {
this.filePath = filePath;
@ -43,11 +42,7 @@ public class Parser {
public Map<String, String> parse() {
Map<String, String> parsedData = new HashMap<>();
try (
Reader rawData = ResourceManager
.getResource(filePath)
.getReader()
) {
try (Reader rawData = ResourceManager.getResource(filePath).getReader()) {
int code;
char c;
StringBuilder stringBuilder = new StringBuilder();
@ -88,10 +83,7 @@ public class Parser {
stringBuilder.append(c);
}
}
parsedData.put(
ESCAPER.unescape(key),
ESCAPER.unescape(stringBuilder.toString())
);
parsedData.put(ESCAPER.unescape(key), ESCAPER.unescape(stringBuilder.toString()));
stringBuilder.setLength(0);
}
} else if (c == '\n') {

View File

@ -34,8 +34,7 @@ import ru.windcorp.progressia.common.world.block.BlockFace;
import ru.windcorp.progressia.common.world.generic.GenericChunk;
import ru.windcorp.progressia.common.world.tile.TileDataStack;
public class ChunkRender
implements GenericChunk<ChunkRender, BlockRender, TileRender, TileRenderStack> {
public class ChunkRender implements GenericChunk<ChunkRender, BlockRender, TileRender, TileRenderStack> {
private final WorldRender world;
private final ChunkData data;
@ -58,9 +57,7 @@ public class ChunkRender
@Override
public BlockRender getBlock(Vec3i posInChunk) {
return BlockRenderRegistry.getInstance().get(
getData().getBlock(posInChunk).getId()
);
return BlockRenderRegistry.getInstance().get(getData().getBlock(posInChunk).getId());
}
@Override
@ -74,10 +71,7 @@ public class ChunkRender
}
private TileRenderStack getTileStackWrapper(TileDataStack tileDataList) {
return tileRenderLists.computeIfAbsent(
tileDataList,
TileRenderStackImpl::new
);
return tileRenderLists.computeIfAbsent(tileDataList, TileRenderStackImpl::new);
}
public WorldRender getWorld() {

View File

@ -51,13 +51,11 @@ public class ChunkRenderModel implements Renderable {
@Override
public void render(ShapeRenderHelper renderer) {
if (model == null) return;
if (model == null)
return;
renderer.pushTransform().translate(
chunk.getX() * ChunkData.BLOCKS_PER_CHUNK,
chunk.getY() * ChunkData.BLOCKS_PER_CHUNK,
chunk.getZ() * ChunkData.BLOCKS_PER_CHUNK
);
renderer.pushTransform().translate(chunk.getX() * ChunkData.BLOCKS_PER_CHUNK,
chunk.getY() * ChunkData.BLOCKS_PER_CHUNK, chunk.getZ() * ChunkData.BLOCKS_PER_CHUNK);
model.render(renderer);
@ -112,10 +110,8 @@ public class ChunkRenderModel implements Renderable {
}
if (block.needsOwnRenderable()) {
sink.addPart(
block.createRenderable(chunk.getData(), blockInChunk),
new Mat4().identity().translate(blockInChunk.x, blockInChunk.y, blockInChunk.z)
);
sink.addPart(block.createRenderable(chunk.getData(), blockInChunk),
new Mat4().identity().translate(blockInChunk.x, blockInChunk.y, blockInChunk.z));
}
processBlockWithCROs(block, blockInChunk);
@ -143,10 +139,8 @@ public class ChunkRenderModel implements Renderable {
}
if (tile.needsOwnRenderable()) {
sink.addPart(
tile.createRenderable(chunk.getData(), blockInChunk, face),
new Mat4().identity().translate(blockInChunk.x, blockInChunk.y, blockInChunk.z)
);
sink.addPart(tile.createRenderable(chunk.getData(), blockInChunk, face),
new Mat4().identity().translate(blockInChunk.x, blockInChunk.y, blockInChunk.z));
}
processTileWithCROs(tile, blockInChunk, face);

View File

@ -56,13 +56,8 @@ class ChunkUpdateListener implements ChunkDataListener {
}
@Override
public void onChunkTilesChanged(
ChunkData chunk,
Vec3i blockInChunk,
BlockFace face,
TileData tile,
boolean wasAdded
) {
public void onChunkTilesChanged(ChunkData chunk, Vec3i blockInChunk, BlockFace face, TileData tile,
boolean wasAdded) {
onLocationChanged(chunk, blockInChunk);
}

View File

@ -207,15 +207,11 @@ public class WorldRender
}
public EntityRenderable getEntityRenderable(EntityData entity) {
return entityModels.computeIfAbsent(
entity,
WorldRender::createEntityRenderable
);
return entityModels.computeIfAbsent(entity, WorldRender::createEntityRenderable);
}
private static EntityRenderable createEntityRenderable(EntityData entity) {
return EntityRenderRegistry.getInstance().get(entity.getId())
.createRenderable(entity);
return EntityRenderRegistry.getInstance().get(entity.getId()).createRenderable(entity);
}
public void markChunkForUpdate(Vec3i chunkPos) {

View File

@ -32,9 +32,7 @@ public abstract class BlockRender extends Namespaced implements GenericBlock {
}
public void render(ShapeRenderHelper renderer) {
throw new UnsupportedOperationException(
"BlockRender.render() not implemented in " + this
);
throw new UnsupportedOperationException("BlockRender.render() not implemented in " + this);
}
public Renderable createRenderable(ChunkData chunk, Vec3i blockInChunk) {

View File

@ -23,36 +23,13 @@ import ru.windcorp.progressia.common.world.block.BlockFace;
public class BlockRenderOpaqueCube extends BlockRenderTexturedCube {
public BlockRenderOpaqueCube(
String id,
Texture topTexture,
Texture bottomTexture,
Texture northTexture,
Texture southTexture,
Texture eastTexture,
Texture westTexture
) {
super(
id,
topTexture,
bottomTexture,
northTexture,
southTexture,
eastTexture,
westTexture
);
public BlockRenderOpaqueCube(String id, Texture topTexture, Texture bottomTexture, Texture northTexture,
Texture southTexture, Texture eastTexture, Texture westTexture) {
super(id, topTexture, bottomTexture, northTexture, southTexture, eastTexture, westTexture);
}
public BlockRenderOpaqueCube(String id, Texture texture) {
this(
id,
texture,
texture,
texture,
texture,
texture,
texture
);
this(id, texture, texture, texture, texture, texture, texture);
}
@Override

View File

@ -37,11 +37,7 @@ public class BlockRenderRegistry extends NamespacedInstanceRegistry<BlockRender>
public static Texture getBlockTexture(String name) {
return new SimpleTexture(
Atlases.getSprite(
ResourceManager.getTextureResource("blocks/" + name),
BLOCKS_ATLAS_GROUP
)
);
Atlases.getSprite(ResourceManager.getTextureResource("blocks/" + name), BLOCKS_ATLAS_GROUP));
}
public static AtlasGroup getBlocksAtlasGroup() {

Some files were not shown because too many files have changed in this diff Show More