1
package org.pushingpixels.substance.internal.utils;
4
* A class for producing Perlin-inspired noise. The code written by Ken Perlin.
6
* @author Ken Perlin http://mrl.nyu.edu/~perlin/
8
public class PerlinNoiseGenerator {
10
* Returns noise for the specified coordinates.
18
* @return Noise for the specified coordinates.
20
static public double noise(double x, double y, double z) {
21
int X = (int) Math.floor(x) & 255, // FIND UNIT CUBE THAT
22
Y = (int) Math.floor(y) & 255, // CONTAINS POINT.
23
Z = (int) Math.floor(z) & 255;
24
x -= Math.floor(x); // FIND RELATIVE X,Y,Z
25
y -= Math.floor(y); // OF POINT IN CUBE.
27
double u = fade(x), // COMPUTE FADE CURVES
28
v = fade(y), // FOR EACH OF X,Y,Z.
30
int A = p[X] + Y, AA = p[A] + Z, AB = p[A + 1] + Z, // HASH COORDINATES
32
B = p[X + 1] + Y, BA = p[B] + Z, BB = p[B + 1] + Z; // THE 8 CUBE
35
return lerp(w, lerp(v, lerp(u, grad(p[AA], x, y, z), // AND ADD
36
grad(p[BA], x - 1, y, z)), // BLENDED
37
lerp(u, grad(p[AB], x, y - 1, z), // RESULTS
38
grad(p[BB], x - 1, y - 1, z))),// FROM 8
39
lerp(v, lerp(u, grad(p[AA + 1], x, y, z - 1), // CORNERS
40
grad(p[BA + 1], x - 1, y, z - 1)), // OF CUBE
41
lerp(u, grad(p[AB + 1], x, y - 1, z - 1), grad(
42
p[BB + 1], x - 1, y - 1, z - 1))));
46
* Fades the specified value.
50
* @return faded value.
52
static double fade(double t) {
53
return t * t * t * (t * (t * 6 - 15) + 10);
57
* Interpolates the specified value.
62
* Starting interpolation value.
64
* Ending interpolation value.
65
* @return Interpolated value.
67
static double lerp(double t, double a, double b) {
68
return a + t * (b - a);
78
static double grad(int hash, double x, double y, double z) {
79
int h = hash & 15; // CONVERT LO 4 BITS OF HASH CODE
80
double u = h < 8 ? x : y, // INTO 12 GRADIENT DIRECTIONS.
81
v = h < 4 ? y : (h == 12) || (h == 14) ? x : z;
82
return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
88
static final int p[] = new int[512];
93
static final int permutation[] = { 151, 160, 137, 91, 90, 15, 131, 13, 201,
94
95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37,
95
240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62,
96
94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56,
97
87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139,
98
48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133,
99
230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25,
100
63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200,
101
196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3,
102
64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255,
103
82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42,
104
223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153,
105
101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79,
106
113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242,
107
193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249,
108
14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204,
109
176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222,
110
114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 };
112
for (int i = 0; i < 256; i++)
113
p[256 + i] = p[i] = permutation[i];