propane 3.8.0-java → 3.9.0-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -78,32 +78,6 @@ public interface Noise {
78
78
 
79
79
  void noiseMode(NoiseMode mode);
80
80
 
81
- /**
82
- * Adjusts the character and level of detail produced by the Perlin noise
83
- * function.Similar to harmonics in physics, noise is computed over several
84
- * octaves. Lower octaves contribute more to the output signal and as such
85
- * define the overal intensity of the noise, whereas higher octaves create
86
- * finer grained details in the noise sequence. By default, noise is
87
- * computed over 4 octaves with each octave contributing exactly half than
88
- * its predecessor, starting at 50% strength for the 1st octave. This
89
- * falloff amount can be changed by adding an additional function parameter.
90
- * Eg. a falloff factor of 0.75 means each octave will now have 75% impact
91
- * (25% less) of the previous lower octave. Any value between 0.0 and 1.0 is
92
- * valid, however note that values greater than 0.5 might result in greater
93
- * than 1.0 values returned by <b>noise()</b>.By changing these parameters,
94
- * the signal created by the <b>noise()</b>
95
- * function can be adapted to fit very specific needs and characteristics.
96
- *
97
- * @param lod
98
- */
99
- void noiseDetail(int lod);
100
-
101
- /**
102
- * @param lod
103
- * @param falloff falloff factor for each octave
104
- */
105
- void noiseDetail(int lod, float falloff);
106
-
107
81
  /**
108
82
  * Sets the seed value for <b>noise()</b>.By default, <b>noise()</b>
109
83
  * produces different results each time the program is run. Set the
@@ -13,24 +13,48 @@ public class NoiseGenerator implements Noise {
13
13
 
14
14
  private Noise implementation;
15
15
  private NoiseMode mode;
16
+ private Long seed;
16
17
 
17
18
  public NoiseGenerator() {
18
- this.implementation = new ValueNoise();
19
- this.mode = NoiseMode.PERLIN;
19
+ seed = System.currentTimeMillis();
20
+ this.implementation = new OpenSimplex2F(seed);
21
+ this.mode = NoiseMode.DEFAULT;
20
22
  }
21
23
 
24
+ @Override
22
25
  public void noiseMode(NoiseMode mode) {
23
- if (this.mode != mode && this.mode != NoiseMode.PERLIN) {
24
- this.implementation = new ValueNoise();
25
- this.mode = NoiseMode.PERLIN;
26
- }
27
- if (this.mode != mode && this.mode != NoiseMode.SIMPLEX) {
28
- this.implementation = new SimplexNoise();
29
- this.mode = NoiseMode.SIMPLEX;
26
+ switch (mode) {
27
+ case DEFAULT:
28
+ if (this.mode != NoiseMode.DEFAULT) {
29
+ this.implementation = new OpenSimplex2F(seed);
30
+ this.mode = NoiseMode.DEFAULT;
31
+ }
32
+ break;
33
+ case OPEN_SMOOTH:
34
+ if (this.mode != NoiseMode.OPEN_SMOOTH) {
35
+ this.implementation = new OpenSimplex2S(seed);
36
+ this.mode = NoiseMode.OPEN_SMOOTH;
37
+ break;
38
+ }
39
+ case SMOOTH_TERRAIN:
40
+ if (this.mode != NoiseMode.SMOOTH_TERRAIN) {
41
+ this.implementation = new SmoothTerrain(seed);
42
+ this.mode = NoiseMode.SMOOTH_TERRAIN;
43
+ }
44
+ break;
45
+ case FAST_TERRAIN:
46
+ if (this.mode != NoiseMode.FAST_TERRAIN) {
47
+ this.implementation = new FastTerrain(seed);
48
+ this.mode = NoiseMode.FAST_TERRAIN;
49
+ }
50
+ break;
51
+ default:
52
+ this.implementation = new OpenSimplex2F(seed);
53
+ this.mode = NoiseMode.DEFAULT;
30
54
  }
31
55
  }
32
56
 
33
- public NoiseMode noiseMode(){
57
+ public NoiseMode noiseMode() {
34
58
  return this.mode;
35
59
  }
36
60
 
@@ -41,23 +65,11 @@ public class NoiseGenerator implements Noise {
41
65
 
42
66
  @Override
43
67
  public float noise(float x, float y, float z, float w) {
44
- if (mode == NoiseMode.PERLIN) { return 0.5f;}
45
68
  return implementation.noise(x, y, z, w);
46
69
  }
47
70
 
48
- @Override
49
- public void noiseDetail(int lod) {
50
- implementation.noiseDetail(lod);
51
- }
52
-
53
- @Override
54
- public void noiseDetail(int lod, float falloff) {
55
- implementation.noiseDetail(lod, falloff);
56
- }
57
-
58
71
  @Override
59
72
  public void noiseSeed(long seed) {
60
- implementation.noiseSeed(seed);
73
+ this.seed = seed;
61
74
  }
62
-
63
75
  }
@@ -10,6 +10,19 @@ package monkstone.noise;
10
10
  * @author tux
11
11
  */
12
12
  public enum NoiseMode {
13
- SIMPLEX,
14
- PERLIN;
13
+ DEFAULT("Fast OpenSimplex2"),
14
+ FAST_TERRAIN("Fast Terrain"),
15
+ SMOOTH_TERRAIN("Smooth Terrain"),
16
+ OPEN_SMOOTH("Smooth OpenSimplex2");
17
+
18
+ private final String description;
19
+
20
+ NoiseMode(String description) {
21
+ this.description = description;
22
+ }
23
+
24
+ public String description() {
25
+ return description;
26
+ }
27
+
15
28
  }
@@ -0,0 +1,881 @@
1
+ package monkstone.noise;
2
+
3
+ /**
4
+ * K.jpg's OpenSimplex 2, faster variant
5
+ *
6
+ * - 2D is standard simplex implemented using a lookup table. - 3D is
7
+ * "Re-oriented 4-point BCC noise" which constructs a congruent BCC lattice in a
8
+ * much different way than usual. - 4D constructs the lattice as a union of five
9
+ * copies of its reciprocal. It successively finds the closest point on each.
10
+ *
11
+ * Multiple versions of each function are provided. See the documentation above
12
+ * each, for more info.
13
+ */
14
+ public class OpenSimplex2F implements Noise {
15
+
16
+ private static final int PSIZE = 2048;
17
+ private static final int PMASK = 2047;
18
+
19
+ private final short[] perm;
20
+ private final Grad2[] permGrad2;
21
+ private final Grad3[] permGrad3;
22
+ private final Grad4[] permGrad4;
23
+
24
+ public OpenSimplex2F(long seed) {
25
+ perm = new short[PSIZE];
26
+ permGrad2 = new Grad2[PSIZE];
27
+ permGrad3 = new Grad3[PSIZE];
28
+ permGrad4 = new Grad4[PSIZE];
29
+ short[] source = new short[PSIZE];
30
+ for (short i = 0; i < PSIZE; i++) {
31
+ source[i] = i;
32
+ }
33
+ for (int i = PSIZE - 1; i >= 0; i--) {
34
+ seed = seed * 6364136223846793005L + 1442695040888963407L;
35
+ int r = (int) ((seed + 31) % (i + 1));
36
+ if (r < 0) {
37
+ r += (i + 1);
38
+ }
39
+ perm[i] = source[r];
40
+ permGrad2[i] = GRADIENTS_2D[perm[i]];
41
+ permGrad3[i] = GRADIENTS_3D[perm[i]];
42
+ permGrad4[i] = GRADIENTS_4D[perm[i]];
43
+ source[r] = source[i];
44
+ }
45
+ }
46
+
47
+ /*
48
+ * Noise Evaluators
49
+ */
50
+ /**
51
+ * 2D Simplex noise, standard lattice orientation.
52
+ *
53
+ * @param x
54
+ * @param y
55
+ * @return
56
+ */
57
+ public double noise2(double x, double y) {
58
+
59
+ // Get points for A2* lattice
60
+ double s = 0.366025403784439 * (x + y);
61
+ double xs = x + s, ys = y + s;
62
+
63
+ return noise2_Base(xs, ys);
64
+ }
65
+
66
+ /**
67
+ * 2D Simplex noise, with Y pointing down the main diagonal.Might be better
68
+ * for a 2D sandbox style game, where Y is vertical.Probably slightly less
69
+ * optimal for heightmaps or continent maps.
70
+ *
71
+ * @param x
72
+ * @param y
73
+ * @return
74
+ */
75
+ public double noise2_XBeforeY(double x, double y) {
76
+
77
+ // Skew transform and rotation baked into one.
78
+ double xx = x * 0.7071067811865476;
79
+ double yy = y * 1.224744871380249;
80
+
81
+ return noise2_Base(yy + xx, yy - xx);
82
+ }
83
+
84
+ /**
85
+ * 2D Simplex noise base. Lookup table implementation inspired by
86
+ * DigitalShadow.
87
+ */
88
+ private double noise2_Base(double xs, double ys) {
89
+ double value = 0;
90
+
91
+ // Get base points and offsets
92
+ int xsb = fastFloor(xs), ysb = fastFloor(ys);
93
+ double xsi = xs - xsb, ysi = ys - ysb;
94
+
95
+ // Index to point list
96
+ int index = (int) ((ysi - xsi) / 2 + 1);
97
+
98
+ double ssi = (xsi + ysi) * -0.211324865405187;
99
+ double xi = xsi + ssi, yi = ysi + ssi;
100
+
101
+ // Point contributions
102
+ for (int i = 0; i < 3; i++) {
103
+ LatticePoint2D c = LOOKUP_2D[index + i];
104
+
105
+ double dx = xi + c.dx, dy = yi + c.dy;
106
+ double attn = 0.5 - dx * dx - dy * dy;
107
+ if (attn <= 0) {
108
+ continue;
109
+ }
110
+
111
+ int pxm = (xsb + c.xsv) & PMASK, pym = (ysb + c.ysv) & PMASK;
112
+ Grad2 grad = permGrad2[perm[pxm] ^ pym];
113
+ double extrapolation = grad.dx * dx + grad.dy * dy;
114
+
115
+ attn *= attn;
116
+ value += attn * attn * extrapolation;
117
+ }
118
+
119
+ return value;
120
+ }
121
+
122
+ /**
123
+ * 3D Re-oriented 4-point BCC noise, classic orientation.Proper substitute
124
+ * for 3D Simplex in light of Forbidden Formulae.Use noise3_XYBeforeZ or
125
+ * noise3_XZBeforeY instead, wherever appropriate.
126
+ *
127
+ * @param x
128
+ * @param y
129
+ * @param z
130
+ * @return
131
+ */
132
+ public double noise3_Classic(double x, double y, double z) {
133
+
134
+ // Re-orient the cubic lattices via rotation, to produce the expected look on cardinal planar slices.
135
+ // If texturing objects that don't tend to have cardinal plane faces, you could even remove this.
136
+ // Orthonormal rotation. Not a skew transform.
137
+ double r = (2.0 / 3.0) * (x + y + z);
138
+ double xr = r - x, yr = r - y, zr = r - z;
139
+
140
+ // Evaluate both lattices to form a BCC lattice.
141
+ return noise3_BCC(xr, yr, zr);
142
+ }
143
+
144
+ /**
145
+ * 3D Re-oriented 4-point BCC noise, with better visual isotropy in (X,
146
+ * Z).Recommended for 3D terrain and time-varied animations.The Y coordinate
147
+ * should always be the "different" coordinate in your use case.If Y is
148
+ * vertical in world coordinates, call noise3_XZBeforeY(x, Y, z).If Z is
149
+ * vertical in world coordinates, call noise3_XZBeforeY(x, Z, y) or use
150
+ * noise3_XYBeforeZ. For a time varied animation, call noise3_XZBeforeY(x,
151
+ * T, y) or use noise3_XYBeforeZ.
152
+ *
153
+ * @param x
154
+ * @param y
155
+ * @param z
156
+ * @return
157
+ */
158
+ public double noise3_XZBeforeY(double x, double y, double z) {
159
+
160
+ // Re-orient the cubic lattices without skewing, to make X and Z triangular like 2D.
161
+ // Orthonormal rotation. Not a skew transform.
162
+ double xz = x + z;
163
+ double s2 = xz * -0.211324865405187;
164
+ double yy = y * 0.577350269189626;
165
+ double xr = x + s2 - yy;
166
+ double zr = z + s2 - yy;
167
+ double yr = xz * 0.577350269189626 + yy;
168
+
169
+ // Evaluate both lattices to form a BCC lattice.
170
+ return noise3_BCC(xr, yr, zr);
171
+ }
172
+
173
+ /**
174
+ * Generate overlapping cubic lattices for 3D Re-oriented BCC noise. Lookup
175
+ * table implementation inspired by DigitalShadow. It was actually faster to
176
+ * narrow down the points in the loop itself, than to build up the index
177
+ * with enough info to isolate 4 points.
178
+ */
179
+ private double noise3_BCC(double xr, double yr, double zr) {
180
+
181
+ // Get base and offsets inside cube of first lattice.
182
+ int xrb = fastFloor(xr), yrb = fastFloor(yr), zrb = fastFloor(zr);
183
+ double xri = xr - xrb, yri = yr - yrb, zri = zr - zrb;
184
+
185
+ // Identify which octant of the cube we're in. This determines which cell
186
+ // in the other cubic lattice we're in, and also narrows down one point on each.
187
+ int xht = (int) (xri + 0.5), yht = (int) (yri + 0.5), zht = (int) (zri + 0.5);
188
+ int index = (xht) | (yht << 1) | (zht << 2);
189
+
190
+ // Point contributions
191
+ double value = 0;
192
+ LatticePoint3D c = LOOKUP_3D[index];
193
+ while (c != null) {
194
+ double dxr = xri + c.dxr, dyr = yri + c.dyr, dzr = zri + c.dzr;
195
+ double attn = 0.5 - dxr * dxr - dyr * dyr - dzr * dzr;
196
+ if (attn < 0) {
197
+ c = c.nextOnFailure;
198
+ } else {
199
+ int pxm = (xrb + c.xrv) & PMASK, pym = (yrb + c.yrv) & PMASK, pzm = (zrb + c.zrv) & PMASK;
200
+ Grad3 grad = permGrad3[perm[perm[pxm] ^ pym] ^ pzm];
201
+ double extrapolation = grad.dx * dxr + grad.dy * dyr + grad.dz * dzr;
202
+
203
+ attn *= attn;
204
+ value += attn * attn * extrapolation;
205
+ c = c.nextOnSuccess;
206
+ }
207
+ }
208
+ return value;
209
+ }
210
+
211
+ /**
212
+ * 4D OpenSimplex2F noise, classic lattice orientation.
213
+ *
214
+ * @param x
215
+ * @param y
216
+ * @param z
217
+ * @param w
218
+ * @return
219
+ */
220
+ public double noise4_Classic(double x, double y, double z, double w) {
221
+
222
+ // Get points for A4 lattice
223
+ double s = -0.138196601125011 * (x + y + z + w);
224
+ double xs = x + s, ys = y + s, zs = z + s, ws = w + s;
225
+
226
+ return noise4_Base(xs, ys, zs, ws);
227
+ }
228
+
229
+ /**
230
+ * 4D OpenSimplex2F noise, with XY and ZW forming orthogonal
231
+ * triangular-based planes.Recommended for 3D terrain, where X and Y (or Z
232
+ * and W) are horizontal.Recommended for noise(x, y, sin(time), cos(time))
233
+ * trick.
234
+ *
235
+ * @param x
236
+ * @param y
237
+ * @param z
238
+ * @param w
239
+ * @return
240
+ */
241
+ public double noise4_XYBeforeZW(double x, double y, double z, double w) {
242
+
243
+ double s2 = (x + y) * -0.178275657951399372 + (z + w) * 0.215623393288842828;
244
+ double t2 = (z + w) * -0.403949762580207112 + (x + y) * -0.375199083010075342;
245
+ double xs = x + s2, ys = y + s2, zs = z + t2, ws = w + t2;
246
+
247
+ return noise4_Base(xs, ys, zs, ws);
248
+ }
249
+
250
+ /**
251
+ * 4D OpenSimplex2F noise, with XYZ oriented like noise3_Classic, and W for
252
+ * an extra degree of freedom.W repeats eventually.Recommended for
253
+ * time-varied animations which texture a 3D object (W=time)
254
+ *
255
+ * @param x
256
+ * @param y
257
+ * @param z
258
+ * @param w
259
+ * @return
260
+ */
261
+ public double noise4_XYZBeforeW(double x, double y, double z, double w) {
262
+
263
+ double xyz = x + y + z;
264
+ double ww = w * 0.2236067977499788;
265
+ double s2 = xyz * -0.16666666666666666 + ww;
266
+ double xs = x + s2, ys = y + s2, zs = z + s2, ws = -0.5 * xyz + ww;
267
+
268
+ return noise4_Base(xs, ys, zs, ws);
269
+ }
270
+
271
+ /**
272
+ * 4D OpenSimplex2F noise base. Current implementation not fully optimized
273
+ * by lookup tables. But still comes out slightly ahead of Gustavson's
274
+ * Simplex in tests.
275
+ */
276
+ private double noise4_Base(double xs, double ys, double zs, double ws) {
277
+ double value = 0;
278
+
279
+ // Get base points and offsets
280
+ int xsb = fastFloor(xs), ysb = fastFloor(ys), zsb = fastFloor(zs), wsb = fastFloor(ws);
281
+ double xsi = xs - xsb, ysi = ys - ysb, zsi = zs - zsb, wsi = ws - wsb;
282
+
283
+ // If we're in the lower half, flip so we can repeat the code for the upper half. We'll flip back later.
284
+ double siSum = xsi + ysi + zsi + wsi;
285
+ double ssi = siSum * 0.309016994374947; // Prep for vertex contributions.
286
+ boolean inLowerHalf = (siSum < 2);
287
+ if (inLowerHalf) {
288
+ xsi = 1 - xsi;
289
+ ysi = 1 - ysi;
290
+ zsi = 1 - zsi;
291
+ wsi = 1 - wsi;
292
+ siSum = 4 - siSum;
293
+ }
294
+
295
+ // Consider opposing vertex pairs of the octahedron formed by the central cross-section of the stretched tesseract
296
+ double aabb = xsi + ysi - zsi - wsi, abab = xsi - ysi + zsi - wsi, abba = xsi - ysi - zsi + wsi;
297
+ double aabbScore = Math.abs(aabb), ababScore = Math.abs(abab), abbaScore = Math.abs(abba);
298
+
299
+ // Find the closest point on the stretched tesseract as if it were the upper half
300
+ int vertexIndex, via, vib;
301
+ double asi, bsi;
302
+ if (aabbScore > ababScore && aabbScore > abbaScore) {
303
+ if (aabb > 0) {
304
+ asi = zsi;
305
+ bsi = wsi;
306
+ vertexIndex = 0b0011;
307
+ via = 0b0111;
308
+ vib = 0b1011;
309
+ } else {
310
+ asi = xsi;
311
+ bsi = ysi;
312
+ vertexIndex = 0b1100;
313
+ via = 0b1101;
314
+ vib = 0b1110;
315
+ }
316
+ } else if (ababScore > abbaScore) {
317
+ if (abab > 0) {
318
+ asi = ysi;
319
+ bsi = wsi;
320
+ vertexIndex = 0b0101;
321
+ via = 0b0111;
322
+ vib = 0b1101;
323
+ } else {
324
+ asi = xsi;
325
+ bsi = zsi;
326
+ vertexIndex = 0b1010;
327
+ via = 0b1011;
328
+ vib = 0b1110;
329
+ }
330
+ } else {
331
+ if (abba > 0) {
332
+ asi = ysi;
333
+ bsi = zsi;
334
+ vertexIndex = 0b1001;
335
+ via = 0b1011;
336
+ vib = 0b1101;
337
+ } else {
338
+ asi = xsi;
339
+ bsi = wsi;
340
+ vertexIndex = 0b0110;
341
+ via = 0b0111;
342
+ vib = 0b1110;
343
+ }
344
+ }
345
+ if (bsi > asi) {
346
+ via = vib;
347
+ double temp = bsi;
348
+ bsi = asi;
349
+ asi = temp;
350
+ }
351
+ if (siSum + asi > 3) {
352
+ vertexIndex = via;
353
+ if (siSum + bsi > 4) {
354
+ vertexIndex = 0b1111;
355
+ }
356
+ }
357
+
358
+ // Now flip back if we're actually in the lower half.
359
+ if (inLowerHalf) {
360
+ xsi = 1 - xsi;
361
+ ysi = 1 - ysi;
362
+ zsi = 1 - zsi;
363
+ wsi = 1 - wsi;
364
+ vertexIndex ^= 0b1111;
365
+ }
366
+
367
+ // Five points to add, total, from five copies of the A4 lattice.
368
+ for (int i = 0; i < 5; i++) {
369
+
370
+ // Update xsb/etc. and add the lattice point's contribution.
371
+ LatticePoint4D c = VERTICES_4D[vertexIndex];
372
+ xsb += c.xsv;
373
+ ysb += c.ysv;
374
+ zsb += c.zsv;
375
+ wsb += c.wsv;
376
+ double xi = xsi + ssi, yi = ysi + ssi, zi = zsi + ssi, wi = wsi + ssi;
377
+ double dx = xi + c.dx, dy = yi + c.dy, dz = zi + c.dz, dw = wi + c.dw;
378
+ double attn = 0.5 - dx * dx - dy * dy - dz * dz - dw * dw;
379
+ if (attn > 0) {
380
+ int pxm = xsb & PMASK, pym = ysb & PMASK, pzm = zsb & PMASK, pwm = wsb & PMASK;
381
+ Grad4 grad = permGrad4[perm[perm[perm[pxm] ^ pym] ^ pzm] ^ pwm];
382
+ double ramped = grad.dx * dx + grad.dy * dy + grad.dz * dz + grad.dw * dw;
383
+
384
+ attn *= attn;
385
+ value += attn * attn * ramped;
386
+ }
387
+
388
+ // Maybe this helps the compiler/JVM/LLVM/etc. know we can end the loop here. Maybe not.
389
+ if (i == 4) {
390
+ break;
391
+ }
392
+
393
+ // Update the relative skewed coordinates to reference the vertex we just added.
394
+ // Rather, reference its counterpart on the lattice copy that is shifted down by
395
+ // the vector <-0.2, -0.2, -0.2, -0.2>
396
+ xsi += c.xsi;
397
+ ysi += c.ysi;
398
+ zsi += c.zsi;
399
+ wsi += c.wsi;
400
+ ssi += c.ssiDelta;
401
+
402
+ // Next point is the closest vertex on the 4-simplex whose base vertex is the aforementioned vertex.
403
+ double score0 = 1.0 + ssi * (-1.0 / 0.309016994374947); // Seems slightly faster than 1.0-xsi-ysi-zsi-wsi
404
+ vertexIndex = 0b0000;
405
+ if (xsi >= ysi && xsi >= zsi && xsi >= wsi && xsi >= score0) {
406
+ vertexIndex = 0b0001;
407
+ } else if (ysi > xsi && ysi >= zsi && ysi >= wsi && ysi >= score0) {
408
+ vertexIndex = 0b0010;
409
+ } else if (zsi > xsi && zsi > ysi && zsi >= wsi && zsi >= score0) {
410
+ vertexIndex = 0b0100;
411
+ } else if (wsi > xsi && wsi > ysi && wsi > zsi && wsi >= score0) {
412
+ vertexIndex = 0b1000;
413
+ }
414
+ }
415
+
416
+ return value;
417
+ }
418
+
419
+ /*
420
+ * Utility
421
+ */
422
+ private static int fastFloor(double x) {
423
+ int xi = (int) x;
424
+ return x < xi ? xi - 1 : xi;
425
+ }
426
+
427
+ /*
428
+ * Definitions
429
+ */
430
+ private static final LatticePoint2D[] LOOKUP_2D;
431
+ private static final LatticePoint3D[] LOOKUP_3D;
432
+ private static final LatticePoint4D[] VERTICES_4D;
433
+
434
+ static {
435
+ LOOKUP_2D = new LatticePoint2D[4];
436
+ LOOKUP_3D = new LatticePoint3D[8];
437
+ VERTICES_4D = new LatticePoint4D[16];
438
+
439
+ LOOKUP_2D[0] = new LatticePoint2D(1, 0);
440
+ LOOKUP_2D[1] = new LatticePoint2D(0, 0);
441
+ LOOKUP_2D[2] = new LatticePoint2D(1, 1);
442
+ LOOKUP_2D[3] = new LatticePoint2D(0, 1);
443
+
444
+ for (int i = 0; i < 8; i++) {
445
+ int i1, j1, k1, i2, j2, k2;
446
+ i1 = (i) & 1;
447
+ j1 = (i >> 1) & 1;
448
+ k1 = (i >> 2) & 1;
449
+ i2 = i1 ^ 1;
450
+ j2 = j1 ^ 1;
451
+ k2 = k1 ^ 1;
452
+
453
+ // The two points within this octant, one from each of the two cubic half-lattices.
454
+ LatticePoint3D c0 = new LatticePoint3D(i1, j1, k1, 0);
455
+ LatticePoint3D c1 = new LatticePoint3D(i1 + i2, j1 + j2, k1 + k2, 1);
456
+
457
+ // Each single step away on the first half-lattice.
458
+ LatticePoint3D c2 = new LatticePoint3D(i1 ^ 1, j1, k1, 0);
459
+ LatticePoint3D c3 = new LatticePoint3D(i1, j1 ^ 1, k1, 0);
460
+ LatticePoint3D c4 = new LatticePoint3D(i1, j1, k1 ^ 1, 0);
461
+
462
+ // Each single step away on the second half-lattice.
463
+ LatticePoint3D c5 = new LatticePoint3D(i1 + (i2 ^ 1), j1 + j2, k1 + k2, 1);
464
+ LatticePoint3D c6 = new LatticePoint3D(i1 + i2, j1 + (j2 ^ 1), k1 + k2, 1);
465
+ LatticePoint3D c7 = new LatticePoint3D(i1 + i2, j1 + j2, k1 + (k2 ^ 1), 1);
466
+
467
+ // First two are guaranteed.
468
+ c0.nextOnFailure = c0.nextOnSuccess = c1;
469
+ c1.nextOnFailure = c1.nextOnSuccess = c2;
470
+
471
+ // Once we find one on the first half-lattice, the rest are out.
472
+ // In addition, knowing c2 rules out c5.
473
+ c2.nextOnFailure = c3;
474
+ c2.nextOnSuccess = c6;
475
+ c3.nextOnFailure = c4;
476
+ c3.nextOnSuccess = c5;
477
+ c4.nextOnFailure = c4.nextOnSuccess = c5;
478
+
479
+ // Once we find one on the second half-lattice, the rest are out.
480
+ c5.nextOnFailure = c6;
481
+ c5.nextOnSuccess = null;
482
+ c6.nextOnFailure = c7;
483
+ c6.nextOnSuccess = null;
484
+ c7.nextOnFailure = c7.nextOnSuccess = null;
485
+
486
+ LOOKUP_3D[i] = c0;
487
+ }
488
+
489
+ for (int i = 0; i < 16; i++) {
490
+ VERTICES_4D[i] = new LatticePoint4D((i) & 1, (i >> 1) & 1, (i >> 2) & 1, (i >> 3) & 1);
491
+ }
492
+ }
493
+
494
+ @Override
495
+ public float noise(float x, float y, float z) {
496
+ return (float)noise3_Classic(x, y, z);
497
+ }
498
+
499
+ @Override
500
+ public float noise(float x, float y, float z, float w) {
501
+ return (float)noise4_Classic(x, y, z, w);
502
+ }
503
+
504
+ @Override
505
+ public void noiseMode(NoiseMode mode) {
506
+
507
+ }
508
+
509
+ @Override
510
+ public void noiseSeed(long seed) {
511
+ }
512
+
513
+ private static class LatticePoint2D {
514
+
515
+ int xsv, ysv;
516
+ double dx, dy;
517
+
518
+ public LatticePoint2D(int xsv, int ysv) {
519
+ this.xsv = xsv;
520
+ this.ysv = ysv;
521
+ double ssv = (xsv + ysv) * -0.211324865405187;
522
+ this.dx = -xsv - ssv;
523
+ this.dy = -ysv - ssv;
524
+ }
525
+ }
526
+
527
+ private static class LatticePoint3D {
528
+
529
+ public double dxr, dyr, dzr;
530
+ public int xrv, yrv, zrv;
531
+ LatticePoint3D nextOnFailure, nextOnSuccess;
532
+
533
+ public LatticePoint3D(int xrv, int yrv, int zrv, int lattice) {
534
+ this.dxr = -xrv + lattice * 0.5;
535
+ this.dyr = -yrv + lattice * 0.5;
536
+ this.dzr = -zrv + lattice * 0.5;
537
+ this.xrv = xrv + lattice * 1024;
538
+ this.yrv = yrv + lattice * 1024;
539
+ this.zrv = zrv + lattice * 1024;
540
+ }
541
+ }
542
+
543
+ private static class LatticePoint4D {
544
+
545
+ int xsv, ysv, zsv, wsv;
546
+ double dx, dy, dz, dw;
547
+ double xsi, ysi, zsi, wsi;
548
+ double ssiDelta;
549
+
550
+ public LatticePoint4D(int xsv, int ysv, int zsv, int wsv) {
551
+ this.xsv = xsv + 409;
552
+ this.ysv = ysv + 409;
553
+ this.zsv = zsv + 409;
554
+ this.wsv = wsv + 409;
555
+ double ssv = (xsv + ysv + zsv + wsv) * 0.309016994374947;
556
+ this.dx = -xsv - ssv;
557
+ this.dy = -ysv - ssv;
558
+ this.dz = -zsv - ssv;
559
+ this.dw = -wsv - ssv;
560
+ this.xsi = xsi = 0.2 - xsv;
561
+ this.ysi = ysi = 0.2 - ysv;
562
+ this.zsi = zsi = 0.2 - zsv;
563
+ this.wsi = wsi = 0.2 - wsv;
564
+ this.ssiDelta = (0.8 - xsv - ysv - zsv - wsv) * 0.309016994374947;
565
+ }
566
+ }
567
+
568
+ /*
569
+ * Gradients
570
+ */
571
+ private static class Grad2 {
572
+
573
+ double dx, dy;
574
+
575
+ public Grad2(double dx, double dy) {
576
+ this.dx = dx;
577
+ this.dy = dy;
578
+ }
579
+ }
580
+
581
+ private static class Grad3 {
582
+
583
+ double dx, dy, dz;
584
+
585
+ public Grad3(double dx, double dy, double dz) {
586
+ this.dx = dx;
587
+ this.dy = dy;
588
+ this.dz = dz;
589
+ }
590
+ }
591
+
592
+ private static class Grad4 {
593
+
594
+ double dx, dy, dz, dw;
595
+
596
+ public Grad4(double dx, double dy, double dz, double dw) {
597
+ this.dx = dx;
598
+ this.dy = dy;
599
+ this.dz = dz;
600
+ this.dw = dw;
601
+ }
602
+ }
603
+
604
+ private static final double N2 = 0.01001634121365712;
605
+ private static final double N3 = 0.030485933181293584;
606
+ private static final double N4 = 0.009202377986303158;
607
+ private static final Grad2[] GRADIENTS_2D;
608
+ private static final Grad3[] GRADIENTS_3D;
609
+ private static final Grad4[] GRADIENTS_4D;
610
+
611
+ static {
612
+
613
+ GRADIENTS_2D = new Grad2[PSIZE];
614
+ Grad2[] grad2 = {
615
+ new Grad2(0.130526192220052, 0.99144486137381),
616
+ new Grad2(0.38268343236509, 0.923879532511287),
617
+ new Grad2(0.608761429008721, 0.793353340291235),
618
+ new Grad2(0.793353340291235, 0.608761429008721),
619
+ new Grad2(0.923879532511287, 0.38268343236509),
620
+ new Grad2(0.99144486137381, 0.130526192220051),
621
+ new Grad2(0.99144486137381, -0.130526192220051),
622
+ new Grad2(0.923879532511287, -0.38268343236509),
623
+ new Grad2(0.793353340291235, -0.60876142900872),
624
+ new Grad2(0.608761429008721, -0.793353340291235),
625
+ new Grad2(0.38268343236509, -0.923879532511287),
626
+ new Grad2(0.130526192220052, -0.99144486137381),
627
+ new Grad2(-0.130526192220052, -0.99144486137381),
628
+ new Grad2(-0.38268343236509, -0.923879532511287),
629
+ new Grad2(-0.608761429008721, -0.793353340291235),
630
+ new Grad2(-0.793353340291235, -0.608761429008721),
631
+ new Grad2(-0.923879532511287, -0.38268343236509),
632
+ new Grad2(-0.99144486137381, -0.130526192220052),
633
+ new Grad2(-0.99144486137381, 0.130526192220051),
634
+ new Grad2(-0.923879532511287, 0.38268343236509),
635
+ new Grad2(-0.793353340291235, 0.608761429008721),
636
+ new Grad2(-0.608761429008721, 0.793353340291235),
637
+ new Grad2(-0.38268343236509, 0.923879532511287),
638
+ new Grad2(-0.130526192220052, 0.99144486137381)
639
+ };
640
+ for (Grad2 grad21 : grad2) {
641
+ grad21.dx /= N2;
642
+ grad21.dy /= N2;
643
+ }
644
+ for (int i = 0; i < PSIZE; i++) {
645
+ GRADIENTS_2D[i] = grad2[i % grad2.length];
646
+ }
647
+
648
+ GRADIENTS_3D = new Grad3[PSIZE];
649
+ Grad3[] grad3 = {
650
+ new Grad3(-2.22474487139, -2.22474487139, -1.0),
651
+ new Grad3(-2.22474487139, -2.22474487139, 1.0),
652
+ new Grad3(-3.0862664687972017, -1.1721513422464978, 0.0),
653
+ new Grad3(-1.1721513422464978, -3.0862664687972017, 0.0),
654
+ new Grad3(-2.22474487139, -1.0, -2.22474487139),
655
+ new Grad3(-2.22474487139, 1.0, -2.22474487139),
656
+ new Grad3(-1.1721513422464978, 0.0, -3.0862664687972017),
657
+ new Grad3(-3.0862664687972017, 0.0, -1.1721513422464978),
658
+ new Grad3(-2.22474487139, -1.0, 2.22474487139),
659
+ new Grad3(-2.22474487139, 1.0, 2.22474487139),
660
+ new Grad3(-3.0862664687972017, 0.0, 1.1721513422464978),
661
+ new Grad3(-1.1721513422464978, 0.0, 3.0862664687972017),
662
+ new Grad3(-2.22474487139, 2.22474487139, -1.0),
663
+ new Grad3(-2.22474487139, 2.22474487139, 1.0),
664
+ new Grad3(-1.1721513422464978, 3.0862664687972017, 0.0),
665
+ new Grad3(-3.0862664687972017, 1.1721513422464978, 0.0),
666
+ new Grad3(-1.0, -2.22474487139, -2.22474487139),
667
+ new Grad3(1.0, -2.22474487139, -2.22474487139),
668
+ new Grad3(0.0, -3.0862664687972017, -1.1721513422464978),
669
+ new Grad3(0.0, -1.1721513422464978, -3.0862664687972017),
670
+ new Grad3(-1.0, -2.22474487139, 2.22474487139),
671
+ new Grad3(1.0, -2.22474487139, 2.22474487139),
672
+ new Grad3(0.0, -1.1721513422464978, 3.0862664687972017),
673
+ new Grad3(0.0, -3.0862664687972017, 1.1721513422464978),
674
+ new Grad3(-1.0, 2.22474487139, -2.22474487139),
675
+ new Grad3(1.0, 2.22474487139, -2.22474487139),
676
+ new Grad3(0.0, 1.1721513422464978, -3.0862664687972017),
677
+ new Grad3(0.0, 3.0862664687972017, -1.1721513422464978),
678
+ new Grad3(-1.0, 2.22474487139, 2.22474487139),
679
+ new Grad3(1.0, 2.22474487139, 2.22474487139),
680
+ new Grad3(0.0, 3.0862664687972017, 1.1721513422464978),
681
+ new Grad3(0.0, 1.1721513422464978, 3.0862664687972017),
682
+ new Grad3(2.22474487139, -2.22474487139, -1.0),
683
+ new Grad3(2.22474487139, -2.22474487139, 1.0),
684
+ new Grad3(1.1721513422464978, -3.0862664687972017, 0.0),
685
+ new Grad3(3.0862664687972017, -1.1721513422464978, 0.0),
686
+ new Grad3(2.22474487139, -1.0, -2.22474487139),
687
+ new Grad3(2.22474487139, 1.0, -2.22474487139),
688
+ new Grad3(3.0862664687972017, 0.0, -1.1721513422464978),
689
+ new Grad3(1.1721513422464978, 0.0, -3.0862664687972017),
690
+ new Grad3(2.22474487139, -1.0, 2.22474487139),
691
+ new Grad3(2.22474487139, 1.0, 2.22474487139),
692
+ new Grad3(1.1721513422464978, 0.0, 3.0862664687972017),
693
+ new Grad3(3.0862664687972017, 0.0, 1.1721513422464978),
694
+ new Grad3(2.22474487139, 2.22474487139, -1.0),
695
+ new Grad3(2.22474487139, 2.22474487139, 1.0),
696
+ new Grad3(3.0862664687972017, 1.1721513422464978, 0.0),
697
+ new Grad3(1.1721513422464978, 3.0862664687972017, 0.0)
698
+ };
699
+ for (Grad3 grad31 : grad3) {
700
+ grad31.dx /= N3;
701
+ grad31.dy /= N3;
702
+ grad31.dz /= N3;
703
+ }
704
+ for (int i = 0; i < PSIZE; i++) {
705
+ GRADIENTS_3D[i] = grad3[i % grad3.length];
706
+ }
707
+
708
+ GRADIENTS_4D = new Grad4[PSIZE];
709
+ Grad4[] grad4 = {
710
+ new Grad4(-0.753341017856078, -0.37968289875261624, -0.37968289875261624, -0.37968289875261624),
711
+ new Grad4(-0.7821684431180708, -0.4321472685365301, -0.4321472685365301, 0.12128480194602098),
712
+ new Grad4(-0.7821684431180708, -0.4321472685365301, 0.12128480194602098, -0.4321472685365301),
713
+ new Grad4(-0.7821684431180708, 0.12128480194602098, -0.4321472685365301, -0.4321472685365301),
714
+ new Grad4(-0.8586508742123365, -0.508629699630796, 0.044802370851755174, 0.044802370851755174),
715
+ new Grad4(-0.8586508742123365, 0.044802370851755174, -0.508629699630796, 0.044802370851755174),
716
+ new Grad4(-0.8586508742123365, 0.044802370851755174, 0.044802370851755174, -0.508629699630796),
717
+ new Grad4(-0.9982828964265062, -0.03381941603233842, -0.03381941603233842, -0.03381941603233842),
718
+ new Grad4(-0.37968289875261624, -0.753341017856078, -0.37968289875261624, -0.37968289875261624),
719
+ new Grad4(-0.4321472685365301, -0.7821684431180708, -0.4321472685365301, 0.12128480194602098),
720
+ new Grad4(-0.4321472685365301, -0.7821684431180708, 0.12128480194602098, -0.4321472685365301),
721
+ new Grad4(0.12128480194602098, -0.7821684431180708, -0.4321472685365301, -0.4321472685365301),
722
+ new Grad4(-0.508629699630796, -0.8586508742123365, 0.044802370851755174, 0.044802370851755174),
723
+ new Grad4(0.044802370851755174, -0.8586508742123365, -0.508629699630796, 0.044802370851755174),
724
+ new Grad4(0.044802370851755174, -0.8586508742123365, 0.044802370851755174, -0.508629699630796),
725
+ new Grad4(-0.03381941603233842, -0.9982828964265062, -0.03381941603233842, -0.03381941603233842),
726
+ new Grad4(-0.37968289875261624, -0.37968289875261624, -0.753341017856078, -0.37968289875261624),
727
+ new Grad4(-0.4321472685365301, -0.4321472685365301, -0.7821684431180708, 0.12128480194602098),
728
+ new Grad4(-0.4321472685365301, 0.12128480194602098, -0.7821684431180708, -0.4321472685365301),
729
+ new Grad4(0.12128480194602098, -0.4321472685365301, -0.7821684431180708, -0.4321472685365301),
730
+ new Grad4(-0.508629699630796, 0.044802370851755174, -0.8586508742123365, 0.044802370851755174),
731
+ new Grad4(0.044802370851755174, -0.508629699630796, -0.8586508742123365, 0.044802370851755174),
732
+ new Grad4(0.044802370851755174, 0.044802370851755174, -0.8586508742123365, -0.508629699630796),
733
+ new Grad4(-0.03381941603233842, -0.03381941603233842, -0.9982828964265062, -0.03381941603233842),
734
+ new Grad4(-0.37968289875261624, -0.37968289875261624, -0.37968289875261624, -0.753341017856078),
735
+ new Grad4(-0.4321472685365301, -0.4321472685365301, 0.12128480194602098, -0.7821684431180708),
736
+ new Grad4(-0.4321472685365301, 0.12128480194602098, -0.4321472685365301, -0.7821684431180708),
737
+ new Grad4(0.12128480194602098, -0.4321472685365301, -0.4321472685365301, -0.7821684431180708),
738
+ new Grad4(-0.508629699630796, 0.044802370851755174, 0.044802370851755174, -0.8586508742123365),
739
+ new Grad4(0.044802370851755174, -0.508629699630796, 0.044802370851755174, -0.8586508742123365),
740
+ new Grad4(0.044802370851755174, 0.044802370851755174, -0.508629699630796, -0.8586508742123365),
741
+ new Grad4(-0.03381941603233842, -0.03381941603233842, -0.03381941603233842, -0.9982828964265062),
742
+ new Grad4(-0.6740059517812944, -0.3239847771997537, -0.3239847771997537, 0.5794684678643381),
743
+ new Grad4(-0.7504883828755602, -0.4004672082940195, 0.15296486218853164, 0.5029860367700724),
744
+ new Grad4(-0.7504883828755602, 0.15296486218853164, -0.4004672082940195, 0.5029860367700724),
745
+ new Grad4(-0.8828161875373585, 0.08164729285680945, 0.08164729285680945, 0.4553054119602712),
746
+ new Grad4(-0.4553054119602712, -0.08164729285680945, -0.08164729285680945, 0.8828161875373585),
747
+ new Grad4(-0.5029860367700724, -0.15296486218853164, 0.4004672082940195, 0.7504883828755602),
748
+ new Grad4(-0.5029860367700724, 0.4004672082940195, -0.15296486218853164, 0.7504883828755602),
749
+ new Grad4(-0.5794684678643381, 0.3239847771997537, 0.3239847771997537, 0.6740059517812944),
750
+ new Grad4(-0.3239847771997537, -0.6740059517812944, -0.3239847771997537, 0.5794684678643381),
751
+ new Grad4(-0.4004672082940195, -0.7504883828755602, 0.15296486218853164, 0.5029860367700724),
752
+ new Grad4(0.15296486218853164, -0.7504883828755602, -0.4004672082940195, 0.5029860367700724),
753
+ new Grad4(0.08164729285680945, -0.8828161875373585, 0.08164729285680945, 0.4553054119602712),
754
+ new Grad4(-0.08164729285680945, -0.4553054119602712, -0.08164729285680945, 0.8828161875373585),
755
+ new Grad4(-0.15296486218853164, -0.5029860367700724, 0.4004672082940195, 0.7504883828755602),
756
+ new Grad4(0.4004672082940195, -0.5029860367700724, -0.15296486218853164, 0.7504883828755602),
757
+ new Grad4(0.3239847771997537, -0.5794684678643381, 0.3239847771997537, 0.6740059517812944),
758
+ new Grad4(-0.3239847771997537, -0.3239847771997537, -0.6740059517812944, 0.5794684678643381),
759
+ new Grad4(-0.4004672082940195, 0.15296486218853164, -0.7504883828755602, 0.5029860367700724),
760
+ new Grad4(0.15296486218853164, -0.4004672082940195, -0.7504883828755602, 0.5029860367700724),
761
+ new Grad4(0.08164729285680945, 0.08164729285680945, -0.8828161875373585, 0.4553054119602712),
762
+ new Grad4(-0.08164729285680945, -0.08164729285680945, -0.4553054119602712, 0.8828161875373585),
763
+ new Grad4(-0.15296486218853164, 0.4004672082940195, -0.5029860367700724, 0.7504883828755602),
764
+ new Grad4(0.4004672082940195, -0.15296486218853164, -0.5029860367700724, 0.7504883828755602),
765
+ new Grad4(0.3239847771997537, 0.3239847771997537, -0.5794684678643381, 0.6740059517812944),
766
+ new Grad4(-0.6740059517812944, -0.3239847771997537, 0.5794684678643381, -0.3239847771997537),
767
+ new Grad4(-0.7504883828755602, -0.4004672082940195, 0.5029860367700724, 0.15296486218853164),
768
+ new Grad4(-0.7504883828755602, 0.15296486218853164, 0.5029860367700724, -0.4004672082940195),
769
+ new Grad4(-0.8828161875373585, 0.08164729285680945, 0.4553054119602712, 0.08164729285680945),
770
+ new Grad4(-0.4553054119602712, -0.08164729285680945, 0.8828161875373585, -0.08164729285680945),
771
+ new Grad4(-0.5029860367700724, -0.15296486218853164, 0.7504883828755602, 0.4004672082940195),
772
+ new Grad4(-0.5029860367700724, 0.4004672082940195, 0.7504883828755602, -0.15296486218853164),
773
+ new Grad4(-0.5794684678643381, 0.3239847771997537, 0.6740059517812944, 0.3239847771997537),
774
+ new Grad4(-0.3239847771997537, -0.6740059517812944, 0.5794684678643381, -0.3239847771997537),
775
+ new Grad4(-0.4004672082940195, -0.7504883828755602, 0.5029860367700724, 0.15296486218853164),
776
+ new Grad4(0.15296486218853164, -0.7504883828755602, 0.5029860367700724, -0.4004672082940195),
777
+ new Grad4(0.08164729285680945, -0.8828161875373585, 0.4553054119602712, 0.08164729285680945),
778
+ new Grad4(-0.08164729285680945, -0.4553054119602712, 0.8828161875373585, -0.08164729285680945),
779
+ new Grad4(-0.15296486218853164, -0.5029860367700724, 0.7504883828755602, 0.4004672082940195),
780
+ new Grad4(0.4004672082940195, -0.5029860367700724, 0.7504883828755602, -0.15296486218853164),
781
+ new Grad4(0.3239847771997537, -0.5794684678643381, 0.6740059517812944, 0.3239847771997537),
782
+ new Grad4(-0.3239847771997537, -0.3239847771997537, 0.5794684678643381, -0.6740059517812944),
783
+ new Grad4(-0.4004672082940195, 0.15296486218853164, 0.5029860367700724, -0.7504883828755602),
784
+ new Grad4(0.15296486218853164, -0.4004672082940195, 0.5029860367700724, -0.7504883828755602),
785
+ new Grad4(0.08164729285680945, 0.08164729285680945, 0.4553054119602712, -0.8828161875373585),
786
+ new Grad4(-0.08164729285680945, -0.08164729285680945, 0.8828161875373585, -0.4553054119602712),
787
+ new Grad4(-0.15296486218853164, 0.4004672082940195, 0.7504883828755602, -0.5029860367700724),
788
+ new Grad4(0.4004672082940195, -0.15296486218853164, 0.7504883828755602, -0.5029860367700724),
789
+ new Grad4(0.3239847771997537, 0.3239847771997537, 0.6740059517812944, -0.5794684678643381),
790
+ new Grad4(-0.6740059517812944, 0.5794684678643381, -0.3239847771997537, -0.3239847771997537),
791
+ new Grad4(-0.7504883828755602, 0.5029860367700724, -0.4004672082940195, 0.15296486218853164),
792
+ new Grad4(-0.7504883828755602, 0.5029860367700724, 0.15296486218853164, -0.4004672082940195),
793
+ new Grad4(-0.8828161875373585, 0.4553054119602712, 0.08164729285680945, 0.08164729285680945),
794
+ new Grad4(-0.4553054119602712, 0.8828161875373585, -0.08164729285680945, -0.08164729285680945),
795
+ new Grad4(-0.5029860367700724, 0.7504883828755602, -0.15296486218853164, 0.4004672082940195),
796
+ new Grad4(-0.5029860367700724, 0.7504883828755602, 0.4004672082940195, -0.15296486218853164),
797
+ new Grad4(-0.5794684678643381, 0.6740059517812944, 0.3239847771997537, 0.3239847771997537),
798
+ new Grad4(-0.3239847771997537, 0.5794684678643381, -0.6740059517812944, -0.3239847771997537),
799
+ new Grad4(-0.4004672082940195, 0.5029860367700724, -0.7504883828755602, 0.15296486218853164),
800
+ new Grad4(0.15296486218853164, 0.5029860367700724, -0.7504883828755602, -0.4004672082940195),
801
+ new Grad4(0.08164729285680945, 0.4553054119602712, -0.8828161875373585, 0.08164729285680945),
802
+ new Grad4(-0.08164729285680945, 0.8828161875373585, -0.4553054119602712, -0.08164729285680945),
803
+ new Grad4(-0.15296486218853164, 0.7504883828755602, -0.5029860367700724, 0.4004672082940195),
804
+ new Grad4(0.4004672082940195, 0.7504883828755602, -0.5029860367700724, -0.15296486218853164),
805
+ new Grad4(0.3239847771997537, 0.6740059517812944, -0.5794684678643381, 0.3239847771997537),
806
+ new Grad4(-0.3239847771997537, 0.5794684678643381, -0.3239847771997537, -0.6740059517812944),
807
+ new Grad4(-0.4004672082940195, 0.5029860367700724, 0.15296486218853164, -0.7504883828755602),
808
+ new Grad4(0.15296486218853164, 0.5029860367700724, -0.4004672082940195, -0.7504883828755602),
809
+ new Grad4(0.08164729285680945, 0.4553054119602712, 0.08164729285680945, -0.8828161875373585),
810
+ new Grad4(-0.08164729285680945, 0.8828161875373585, -0.08164729285680945, -0.4553054119602712),
811
+ new Grad4(-0.15296486218853164, 0.7504883828755602, 0.4004672082940195, -0.5029860367700724),
812
+ new Grad4(0.4004672082940195, 0.7504883828755602, -0.15296486218853164, -0.5029860367700724),
813
+ new Grad4(0.3239847771997537, 0.6740059517812944, 0.3239847771997537, -0.5794684678643381),
814
+ new Grad4(0.5794684678643381, -0.6740059517812944, -0.3239847771997537, -0.3239847771997537),
815
+ new Grad4(0.5029860367700724, -0.7504883828755602, -0.4004672082940195, 0.15296486218853164),
816
+ new Grad4(0.5029860367700724, -0.7504883828755602, 0.15296486218853164, -0.4004672082940195),
817
+ new Grad4(0.4553054119602712, -0.8828161875373585, 0.08164729285680945, 0.08164729285680945),
818
+ new Grad4(0.8828161875373585, -0.4553054119602712, -0.08164729285680945, -0.08164729285680945),
819
+ new Grad4(0.7504883828755602, -0.5029860367700724, -0.15296486218853164, 0.4004672082940195),
820
+ new Grad4(0.7504883828755602, -0.5029860367700724, 0.4004672082940195, -0.15296486218853164),
821
+ new Grad4(0.6740059517812944, -0.5794684678643381, 0.3239847771997537, 0.3239847771997537),
822
+ new Grad4(0.5794684678643381, -0.3239847771997537, -0.6740059517812944, -0.3239847771997537),
823
+ new Grad4(0.5029860367700724, -0.4004672082940195, -0.7504883828755602, 0.15296486218853164),
824
+ new Grad4(0.5029860367700724, 0.15296486218853164, -0.7504883828755602, -0.4004672082940195),
825
+ new Grad4(0.4553054119602712, 0.08164729285680945, -0.8828161875373585, 0.08164729285680945),
826
+ new Grad4(0.8828161875373585, -0.08164729285680945, -0.4553054119602712, -0.08164729285680945),
827
+ new Grad4(0.7504883828755602, -0.15296486218853164, -0.5029860367700724, 0.4004672082940195),
828
+ new Grad4(0.7504883828755602, 0.4004672082940195, -0.5029860367700724, -0.15296486218853164),
829
+ new Grad4(0.6740059517812944, 0.3239847771997537, -0.5794684678643381, 0.3239847771997537),
830
+ new Grad4(0.5794684678643381, -0.3239847771997537, -0.3239847771997537, -0.6740059517812944),
831
+ new Grad4(0.5029860367700724, -0.4004672082940195, 0.15296486218853164, -0.7504883828755602),
832
+ new Grad4(0.5029860367700724, 0.15296486218853164, -0.4004672082940195, -0.7504883828755602),
833
+ new Grad4(0.4553054119602712, 0.08164729285680945, 0.08164729285680945, -0.8828161875373585),
834
+ new Grad4(0.8828161875373585, -0.08164729285680945, -0.08164729285680945, -0.4553054119602712),
835
+ new Grad4(0.7504883828755602, -0.15296486218853164, 0.4004672082940195, -0.5029860367700724),
836
+ new Grad4(0.7504883828755602, 0.4004672082940195, -0.15296486218853164, -0.5029860367700724),
837
+ new Grad4(0.6740059517812944, 0.3239847771997537, 0.3239847771997537, -0.5794684678643381),
838
+ new Grad4(0.03381941603233842, 0.03381941603233842, 0.03381941603233842, 0.9982828964265062),
839
+ new Grad4(-0.044802370851755174, -0.044802370851755174, 0.508629699630796, 0.8586508742123365),
840
+ new Grad4(-0.044802370851755174, 0.508629699630796, -0.044802370851755174, 0.8586508742123365),
841
+ new Grad4(-0.12128480194602098, 0.4321472685365301, 0.4321472685365301, 0.7821684431180708),
842
+ new Grad4(0.508629699630796, -0.044802370851755174, -0.044802370851755174, 0.8586508742123365),
843
+ new Grad4(0.4321472685365301, -0.12128480194602098, 0.4321472685365301, 0.7821684431180708),
844
+ new Grad4(0.4321472685365301, 0.4321472685365301, -0.12128480194602098, 0.7821684431180708),
845
+ new Grad4(0.37968289875261624, 0.37968289875261624, 0.37968289875261624, 0.753341017856078),
846
+ new Grad4(0.03381941603233842, 0.03381941603233842, 0.9982828964265062, 0.03381941603233842),
847
+ new Grad4(-0.044802370851755174, 0.044802370851755174, 0.8586508742123365, 0.508629699630796),
848
+ new Grad4(-0.044802370851755174, 0.508629699630796, 0.8586508742123365, -0.044802370851755174),
849
+ new Grad4(-0.12128480194602098, 0.4321472685365301, 0.7821684431180708, 0.4321472685365301),
850
+ new Grad4(0.508629699630796, -0.044802370851755174, 0.8586508742123365, -0.044802370851755174),
851
+ new Grad4(0.4321472685365301, -0.12128480194602098, 0.7821684431180708, 0.4321472685365301),
852
+ new Grad4(0.4321472685365301, 0.4321472685365301, 0.7821684431180708, -0.12128480194602098),
853
+ new Grad4(0.37968289875261624, 0.37968289875261624, 0.753341017856078, 0.37968289875261624),
854
+ new Grad4(0.03381941603233842, 0.9982828964265062, 0.03381941603233842, 0.03381941603233842),
855
+ new Grad4(-0.044802370851755174, 0.8586508742123365, -0.044802370851755174, 0.508629699630796),
856
+ new Grad4(-0.044802370851755174, 0.8586508742123365, 0.508629699630796, -0.044802370851755174),
857
+ new Grad4(-0.12128480194602098, 0.7821684431180708, 0.4321472685365301, 0.4321472685365301),
858
+ new Grad4(0.508629699630796, 0.8586508742123365, -0.044802370851755174, -0.044802370851755174),
859
+ new Grad4(0.4321472685365301, 0.7821684431180708, -0.12128480194602098, 0.4321472685365301),
860
+ new Grad4(0.4321472685365301, 0.7821684431180708, 0.4321472685365301, -0.12128480194602098),
861
+ new Grad4(0.37968289875261624, 0.753341017856078, 0.37968289875261624, 0.37968289875261624),
862
+ new Grad4(0.9982828964265062, 0.03381941603233842, 0.03381941603233842, 0.03381941603233842),
863
+ new Grad4(0.8586508742123365, -0.044802370851755174, -0.044802370851755174, 0.508629699630796),
864
+ new Grad4(0.8586508742123365, -0.044802370851755174, 0.508629699630796, -0.044802370851755174),
865
+ new Grad4(0.7821684431180708, -0.12128480194602098, 0.4321472685365301, 0.4321472685365301),
866
+ new Grad4(0.8586508742123365, 0.508629699630796, -0.044802370851755174, -0.044802370851755174),
867
+ new Grad4(0.7821684431180708, 0.4321472685365301, -0.12128480194602098, 0.4321472685365301),
868
+ new Grad4(0.7821684431180708, 0.4321472685365301, 0.4321472685365301, -0.12128480194602098),
869
+ new Grad4(0.753341017856078, 0.37968289875261624, 0.37968289875261624, 0.37968289875261624)
870
+ };
871
+ for (Grad4 grad41 : grad4) {
872
+ grad41.dx /= N4;
873
+ grad41.dy /= N4;
874
+ grad41.dz /= N4;
875
+ grad41.dw /= N4;
876
+ }
877
+ for (int i = 0; i < PSIZE; i++) {
878
+ GRADIENTS_4D[i] = grad4[i % grad4.length];
879
+ }
880
+ }
881
+ }