propane 3.7.1-java → 3.8.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,63 @@
1
+ /*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+ package monkstone.noise;
7
+
8
+ /**
9
+ *
10
+ * @author Martin Prout
11
+ */
12
+ public class NoiseGenerator implements Noise {
13
+
14
+ private Noise implementation;
15
+ private NoiseMode mode;
16
+
17
+ public NoiseGenerator() {
18
+ this.implementation = new ValueNoise();
19
+ this.mode = NoiseMode.PERLIN;
20
+ }
21
+
22
+ 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;
30
+ }
31
+ }
32
+
33
+ public NoiseMode noiseMode(){
34
+ return this.mode;
35
+ }
36
+
37
+ @Override
38
+ public float noise(float x, float y, float z) {
39
+ return implementation.noise(x, y, z);
40
+ }
41
+
42
+ @Override
43
+ public float noise(float x, float y, float z, float w) {
44
+ if (mode == NoiseMode.PERLIN) { return 0.5f;}
45
+ return implementation.noise(x, y, z, w);
46
+ }
47
+
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
+ @Override
59
+ public void noiseSeed(long seed) {
60
+ implementation.noiseSeed(seed);
61
+ }
62
+
63
+ }
@@ -0,0 +1,15 @@
1
+ /*
2
+ * To change this license header, choose License Headers in Project Properties.
3
+ * To change this template file, choose Tools | Templates
4
+ * and open the template in the editor.
5
+ */
6
+ package monkstone.noise;
7
+
8
+ /**
9
+ *
10
+ * @author tux
11
+ */
12
+ public enum NoiseMode {
13
+ SIMPLEX,
14
+ PERLIN;
15
+ }
@@ -1,3 +1,5 @@
1
+ package monkstone.noise;
2
+
1
3
  /*
2
4
  * A speed-improved simplex noise algorithm for 2D, 3D and 4D in Java.
3
5
  *
@@ -14,9 +16,9 @@
14
16
  * attribution is appreciated.
15
17
  *
16
18
  */
17
- package monkstone.noise;
18
19
 
19
- public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
20
+
21
+ public class SimplexNoise implements Noise{ // Simplex noise in 2D, 3D and 4D
20
22
 
21
23
  private static Grad grad3[] = {new Grad(1, 1, 0), new Grad(-1, 1, 0), new Grad(1, -1, 0), new Grad(-1, -1, 0),
22
24
  new Grad(1, 0, 1), new Grad(-1, 0, 1), new Grad(1, 0, -1), new Grad(-1, 0, -1),
@@ -56,43 +58,44 @@ public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
56
58
  }
57
59
 
58
60
  // Skewing and unskewing factors for 2, 3, and 4 dimensions
59
- private static final double F2 = 0.5 * (Math.sqrt(3.0) - 1.0);
60
- private static final double G2 = (3.0 - Math.sqrt(3.0)) / 6.0;
61
- private static final double F3 = 1.0 / 3.0;
62
- private static final double G3 = 1.0 / 6.0;
63
- private static final double F4 = (Math.sqrt(5.0) - 1.0) / 4.0;
64
- private static final double G4 = (5.0 - Math.sqrt(5.0)) / 20.0;
61
+ private static final float F2 = 0.5f * (float)(Math.sqrt(3.0) - 1.0);
62
+ private static final float G2 = (float)(3.0 - Math.sqrt(3.0)) / 6.0f;
63
+ private static final float F3 = 1.0f / 3.0f;
64
+ private static final float G3 = 1.0f / 6.0f;
65
+ private static final float F4 = (float)(Math.sqrt(5.0) - 1.0) / 4.0f;
66
+ private static final float G4 = (float)(5.0 - Math.sqrt(5.0)) / 20.0f;
65
67
 
66
68
  // This method is a *lot* faster than using (int)Math.floor(x)
67
- private static int fastfloor(double x) {
69
+ private static int fastfloor(float x) {
68
70
  int xi = (int) x;
69
71
  return x < xi ? xi - 1 : xi;
70
72
  }
71
73
 
72
- private static double dot(Grad g, double x, double y) {
74
+ private static float dot(Grad g, float x, float y) {
73
75
  return g.x * x + g.y * y;
74
76
  }
75
77
 
76
- private static double dot(Grad g, double x, double y, double z) {
78
+ private static float dot(Grad g, float x, float y, float z) {
77
79
  return g.x * x + g.y * y + g.z * z;
78
80
  }
79
81
 
80
- private static double dot(Grad g, double x, double y, double z, double w) {
82
+ private static float dot(Grad g, float x, float y, float z, float w) {
81
83
  return g.x * x + g.y * y + g.z * z + g.w * w;
82
84
  }
83
85
 
84
86
  // 2D simplex noise
85
- public static double noise(double xin, double yin) {
86
- double n0, n1, n2; // Noise contributions from the three corners
87
+ @Override
88
+ public float noise(float xin, float yin) {
89
+ float n0, n1, n2; // Noise contributions from the three corners
87
90
  // Skew the input space to determine which simplex cell we're in
88
- double s = (xin + yin) * F2; // Hairy factor for 2D
91
+ float s = (xin + yin) * F2; // Hairy factor for 2D
89
92
  int i = fastfloor(xin + s);
90
93
  int j = fastfloor(yin + s);
91
- double t = (i + j) * G2;
92
- double X0 = i - t; // Unskew the cell origin back to (x,y) space
93
- double Y0 = j - t;
94
- double x0 = xin - X0; // The x,y distances from the cell origin
95
- double y0 = yin - Y0;
94
+ float t = (i + j) * G2;
95
+ float X0 = i - t; // Unskew the cell origin back to (x,y) space
96
+ float Y0 = j - t;
97
+ float x0 = xin - X0; // The x,y distances from the cell origin
98
+ float y0 = yin - Y0;
96
99
  // For the 2D case, the simplex shape is an equilateral triangle.
97
100
  // Determine which simplex we are in.
98
101
  int i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords
@@ -107,10 +110,10 @@ public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
107
110
  // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and
108
111
  // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where
109
112
  // c = (3-sqrt(3))/6
110
- double x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
111
- double y1 = y0 - j1 + G2;
112
- double x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords
113
- double y2 = y0 - 1.0 + 2.0 * G2;
113
+ float x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords
114
+ float y1 = y0 - j1 + G2;
115
+ float x2 = x0 - 1.0f + 2.0f * G2; // Offsets for last corner in (x,y) unskewed coords
116
+ float y2 = y0 - 1.0f + 2.0f * G2;
114
117
  // Work out the hashed gradient indices of the three simplex corners
115
118
  int ii = i & 255;
116
119
  int jj = j & 255;
@@ -118,47 +121,48 @@ public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
118
121
  int gi1 = PERM_MOD_12[ii + i1 + PERM[jj + j1]];
119
122
  int gi2 = PERM_MOD_12[ii + 1 + PERM[jj + 1]];
120
123
  // Calculate the contribution from the three corners
121
- double t0 = 0.5 - x0 * x0 - y0 * y0;
124
+ float t0 = 0.5f - x0 * x0 - y0 * y0;
122
125
  if (t0 < 0) {
123
- n0 = 0.0;
126
+ n0 = 0.0f;
124
127
  } else {
125
128
  t0 *= t0;
126
129
  n0 = t0 * t0 * dot(grad3[gi0], x0, y0); // (x,y) of grad3 used for 2D gradient
127
130
  }
128
- double t1 = 0.5 - x1 * x1 - y1 * y1;
131
+ float t1 = 0.5f - x1 * x1 - y1 * y1;
129
132
  if (t1 < 0) {
130
- n1 = 0.0;
133
+ n1 = 0.0f;
131
134
  } else {
132
135
  t1 *= t1;
133
136
  n1 = t1 * t1 * dot(grad3[gi1], x1, y1);
134
137
  }
135
- double t2 = 0.5 - x2 * x2 - y2 * y2;
138
+ float t2 = 0.5f - x2 * x2 - y2 * y2;
136
139
  if (t2 < 0) {
137
- n2 = 0.0;
140
+ n2 = 0.0f;
138
141
  } else {
139
142
  t2 *= t2;
140
143
  n2 = t2 * t2 * dot(grad3[gi2], x2, y2);
141
144
  }
142
145
  // Add contributions from each corner to get the final noise value.
143
146
  // The result is scaled to return values in the interval [-1,1].
144
- return 70.0 * (n0 + n1 + n2);
147
+ return 70.0f * (n0 + n1 + n2);
145
148
  }
146
149
 
147
150
  // 3D simplex noise
148
- public static double noise(double xin, double yin, double zin) {
149
- double n0, n1, n2, n3; // Noise contributions from the four corners
151
+ @Override
152
+ public float noise(float xin, float yin, float zin) {
153
+ float n0, n1, n2, n3; // Noise contributions from the four corners
150
154
  // Skew the input space to determine which simplex cell we're in
151
- double s = (xin + yin + zin) * F3; // Very nice and simple skew factor for 3D
155
+ float s = (xin + yin + zin) * F3; // Very nice and simple skew factor for 3D
152
156
  int i = fastfloor(xin + s);
153
157
  int j = fastfloor(yin + s);
154
158
  int k = fastfloor(zin + s);
155
- double t = (i + j + k) * G3;
156
- double X0 = i - t; // Unskew the cell origin back to (x,y,z) space
157
- double Y0 = j - t;
158
- double Z0 = k - t;
159
- double x0 = xin - X0; // The x,y,z distances from the cell origin
160
- double y0 = yin - Y0;
161
- double z0 = zin - Z0;
159
+ float t = (i + j + k) * G3;
160
+ float X0 = i - t; // Unskew the cell origin back to (x,y,z) space
161
+ float Y0 = j - t;
162
+ float Z0 = k - t;
163
+ float x0 = xin - X0; // The x,y,z distances from the cell origin
164
+ float y0 = yin - Y0;
165
+ float z0 = zin - Z0;
162
166
  // For the 3D case, the simplex shape is a slightly irregular tetrahedron.
163
167
  // Determine which simplex we are in.
164
168
  int i1, j1, k1; // Offsets for second corner of simplex in (i,j,k) coords
@@ -218,15 +222,15 @@ public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
218
222
  // a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and
219
223
  // a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where
220
224
  // c = 1/6.
221
- double x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
222
- double y1 = y0 - j1 + G3;
223
- double z1 = z0 - k1 + G3;
224
- double x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords
225
- double y2 = y0 - j2 + 2.0 * G3;
226
- double z2 = z0 - k2 + 2.0 * G3;
227
- double x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords
228
- double y3 = y0 - 1.0 + 3.0 * G3;
229
- double z3 = z0 - 1.0 + 3.0 * G3;
225
+ float x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords
226
+ float y1 = y0 - j1 + G3;
227
+ float z1 = z0 - k1 + G3;
228
+ float x2 = x0 - i2 + 2.0f * G3; // Offsets for third corner in (x,y,z) coords
229
+ float y2 = y0 - j2 + 2.0f * G3;
230
+ float z2 = z0 - k2 + 2.0f * G3;
231
+ float x3 = x0 - 1.0f + 3.0f * G3; // Offsets for last corner in (x,y,z) coords
232
+ float y3 = y0 - 1.0f + 3.0f * G3;
233
+ float z3 = z0 - 1.0f + 3.0f * G3;
230
234
  // Work out the hashed gradient indices of the four simplex corners
231
235
  int ii = i & 255;
232
236
  int jj = j & 255;
@@ -236,58 +240,68 @@ public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
236
240
  int gi2 = PERM_MOD_12[ii + i2 + PERM[jj + j2 + PERM[kk + k2]]];
237
241
  int gi3 = PERM_MOD_12[ii + 1 + PERM[jj + 1 + PERM[kk + 1]]];
238
242
  // Calculate the contribution from the four corners
239
- double t0 = 0.5 - x0 * x0 - y0 * y0 - z0 * z0;
243
+ float t0 = 0.5f - x0 * x0 - y0 * y0 - z0 * z0;
240
244
  if (t0 < 0) {
241
- n0 = 0.0;
245
+ n0 = 0.0f;
242
246
  } else {
243
247
  t0 *= t0;
244
248
  n0 = t0 * t0 * dot(grad3[gi0], x0, y0, z0);
245
249
  }
246
- double t1 = 0.5 - x1 * x1 - y1 * y1 - z1 * z1;
250
+ float t1 = 0.5f - x1 * x1 - y1 * y1 - z1 * z1;
247
251
  if (t1 < 0) {
248
- n1 = 0.0;
252
+ n1 = 0.0f;
249
253
  } else {
250
254
  t1 *= t1;
251
255
  n1 = t1 * t1 * dot(grad3[gi1], x1, y1, z1);
252
256
  }
253
- double t2 = 0.5 - x2 * x2 - y2 * y2 - z2 * z2;
257
+ float t2 = 0.5f - x2 * x2 - y2 * y2 - z2 * z2;
254
258
  if (t2 < 0) {
255
- n2 = 0.0;
259
+ n2 = 0.0f;
256
260
  } else {
257
261
  t2 *= t2;
258
262
  n2 = t2 * t2 * dot(grad3[gi2], x2, y2, z2);
259
263
  }
260
- double t3 = 0.5 - x3 * x3 - y3 * y3 - z3 * z3;
264
+ float t3 = 0.5f - x3 * x3 - y3 * y3 - z3 * z3;
261
265
  if (t3 < 0) {
262
- n3 = 0.0;
266
+ n3 = 0.0f;
263
267
  } else {
264
268
  t3 *= t3;
265
269
  n3 = t3 * t3 * dot(grad3[gi3], x3, y3, z3);
266
270
  }
267
271
  // Add contributions from each corner to get the final noise value.
268
272
  // The result is scaled to stay just inside [-1,1]
269
- return 32.0 * (n0 + n1 + n2 + n3);
273
+ return 32.0f * (n0 + n1 + n2 + n3);
270
274
  }
271
275
 
272
276
  // 4D simplex noise, better simplex rank ordering method 2012-03-09
273
- public static double noise(double x, double y, double z, double w) {
274
277
 
275
- double n0, n1, n2, n3, n4; // Noise contributions from the five corners
278
+ /**
279
+ *
280
+ * @param x
281
+ * @param y
282
+ * @param z
283
+ * @param w
284
+ * @return
285
+ */
286
+ @Override
287
+ public float noise(float x, float y, float z, float w) {
288
+
289
+ float n0, n1, n2, n3, n4; // Noise contributions from the five corners
276
290
  // Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in
277
- double s = (x + y + z + w) * F4; // Factor for 4D skewing
291
+ float s = (x + y + z + w) * F4; // Factor for 4D skewing
278
292
  int i = fastfloor(x + s);
279
293
  int j = fastfloor(y + s);
280
294
  int k = fastfloor(z + s);
281
295
  int l = fastfloor(w + s);
282
- double t = (i + j + k + l) * G4; // Factor for 4D unskewing
283
- double X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
284
- double Y0 = j - t;
285
- double Z0 = k - t;
286
- double W0 = l - t;
287
- double x0 = x - X0; // The x,y,z,w distances from the cell origin
288
- double y0 = y - Y0;
289
- double z0 = z - Z0;
290
- double w0 = w - W0;
296
+ float t = (i + j + k + l) * G4; // Factor for 4D unskewing
297
+ float X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space
298
+ float Y0 = j - t;
299
+ float Z0 = k - t;
300
+ float W0 = l - t;
301
+ float x0 = x - X0; // The x,y,z,w distances from the cell origin
302
+ float y0 = y - Y0;
303
+ float z0 = z - Z0;
304
+ float w0 = w - W0;
291
305
  // For the 4D case, the simplex is a 4D shape I won't even try to describe.
292
306
  // To find out which of the 24 possible simplices we're in, we need to
293
307
  // determine the magnitude ordering of x0, y0, z0 and w0.
@@ -348,22 +362,22 @@ public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
348
362
  k3 = rankz >= 1 ? 1 : 0;
349
363
  l3 = rankw >= 1 ? 1 : 0;
350
364
  // The fifth corner has all coordinate offsets = 1, so no need to compute that.
351
- double x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
352
- double y1 = y0 - j1 + G4;
353
- double z1 = z0 - k1 + G4;
354
- double w1 = w0 - l1 + G4;
355
- double x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords
356
- double y2 = y0 - j2 + 2.0 * G4;
357
- double z2 = z0 - k2 + 2.0 * G4;
358
- double w2 = w0 - l2 + 2.0 * G4;
359
- double x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords
360
- double y3 = y0 - j3 + 3.0 * G4;
361
- double z3 = z0 - k3 + 3.0 * G4;
362
- double w3 = w0 - l3 + 3.0 * G4;
363
- double x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords
364
- double y4 = y0 - 1.0 + 4.0 * G4;
365
- double z4 = z0 - 1.0 + 4.0 * G4;
366
- double w4 = w0 - 1.0 + 4.0 * G4;
365
+ float x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords
366
+ float y1 = y0 - j1 + G4;
367
+ float z1 = z0 - k1 + G4;
368
+ float w1 = w0 - l1 + G4;
369
+ float x2 = x0 - i2 + 20.f * G4; // Offsets for third corner in (x,y,z,w) coords
370
+ float y2 = y0 - j2 + 20.f * G4;
371
+ float z2 = z0 - k2 + 20.f * G4;
372
+ float w2 = w0 - l2 + 20.f * G4;
373
+ float x3 = x0 - i3 + 30.f * G4; // Offsets for fourth corner in (x,y,z,w) coords
374
+ float y3 = y0 - j3 + 30.f * G4;
375
+ float z3 = z0 - k3 + 30.f * G4;
376
+ float w3 = w0 - l3 + 30.f * G4;
377
+ float x4 = x0 - 1.0f + 40.f * G4; // Offsets for last corner in (x,y,z,w) coords
378
+ float y4 = y0 - 1.0f + 40.f * G4;
379
+ float z4 = z0 - 1.0f + 40.f * G4;
380
+ float w4 = w0 - 1.0f + 40.f * G4;
367
381
  // Work out the hashed gradient indices of the five simplex corners
368
382
  int ii = i & 255;
369
383
  int jj = j & 255;
@@ -375,58 +389,78 @@ public class SimplexNoise { // Simplex noise in 2D, 3D and 4D
375
389
  int gi3 = PERM[ii + i3 + PERM[jj + j3 + PERM[kk + k3 + PERM[ll + l3]]]] % 32;
376
390
  int gi4 = PERM[ii + 1 + PERM[jj + 1 + PERM[kk + 1 + PERM[ll + 1]]]] % 32;
377
391
  // Calculate the contribution from the five corners
378
- double t0 = 0.5 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
392
+ float t0 = 0.5f - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;
379
393
  if (t0 < 0) {
380
- n0 = 0.0;
394
+ n0 = 0.0f;
381
395
  } else {
382
396
  t0 *= t0;
383
397
  n0 = t0 * t0 * dot(grad4[gi0], x0, y0, z0, w0);
384
398
  }
385
- double t1 = 0.5 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
399
+ float t1 = 0.5f - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;
386
400
  if (t1 < 0) {
387
- n1 = 0.0;
401
+ n1 = 0.0f;
388
402
  } else {
389
403
  t1 *= t1;
390
404
  n1 = t1 * t1 * dot(grad4[gi1], x1, y1, z1, w1);
391
405
  }
392
- double t2 = 0.5 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
406
+ float t2 = 0.5f - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;
393
407
  if (t2 < 0) {
394
- n2 = 0.0;
408
+ n2 = 0.0f;
395
409
  } else {
396
410
  t2 *= t2;
397
411
  n2 = t2 * t2 * dot(grad4[gi2], x2, y2, z2, w2);
398
412
  }
399
- double t3 = 0.5 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
413
+ float t3 = 0.5f - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;
400
414
  if (t3 < 0) {
401
- n3 = 0.0;
415
+ n3 = 0.0f;
402
416
  } else {
403
417
  t3 *= t3;
404
418
  n3 = t3 * t3 * dot(grad4[gi3], x3, y3, z3, w3);
405
419
  }
406
- double t4 = 0.5 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
420
+ float t4 = 0.5f - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;
407
421
  if (t4 < 0) {
408
- n4 = 0.0;
422
+ n4 = 0.0f;
409
423
  } else {
410
424
  t4 *= t4;
411
425
  n4 = t4 * t4 * dot(grad4[gi4], x4, y4, z4, w4);
412
426
  }
413
427
  // Sum up and scale the result to cover the range [-1,1]
414
- return 27.0 * (n0 + n1 + n2 + n3 + n4);
428
+ return 27.0f * (n0 + n1 + n2 + n3 + n4);
429
+ }
430
+
431
+ @Override
432
+ public void noiseDetail(int lod) {
433
+
434
+ }
435
+
436
+ @Override
437
+ public void noiseDetail(int lod, float falloff) {
438
+
439
+ }
440
+
441
+ @Override
442
+ public void noiseSeed(long seed) {
443
+
444
+ }
445
+
446
+ @Override
447
+ public void noiseMode(NoiseMode mode) {
448
+
415
449
  }
416
450
 
417
451
  // Inner class to speed upp gradient computations
418
452
  // (In Java, array access is a lot slower than member access)
419
453
  private static class Grad {
420
454
 
421
- double x, y, z, w;
455
+ float x, y, z, w;
422
456
 
423
- Grad(double x, double y, double z) {
457
+ Grad(float x, float y, float z) {
424
458
  this.x = x;
425
459
  this.y = y;
426
460
  this.z = z;
427
461
  }
428
462
 
429
- Grad(double x, double y, double z, double w) {
463
+ Grad(float x, float y, float z, float w) {
430
464
  this.x = x;
431
465
  this.y = y;
432
466
  this.z = z;