60 151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
61 8,99,37,240,21,10,23,190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
62 35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,
63 134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,
64 55,46,245,40,244,102,143,54, 65,25,63,161,1,216,80,73,209,76,132,187,208, 89,
65 18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,
66 250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,
67 189,28,42,223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167,
68 43,172,9,129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,
69 97,228,251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,
70 107,49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
71 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 };
74 auto oldsize =
p.size();
75 p.resize( 2 *
p.size() );
76 std::copy_n(
p.begin(), oldsize,
p.begin() + oldsize );
85 std::iota(
p.begin(),
p.end(), 0 );
88 std::default_random_engine engine( seed );
91 std::shuffle(
p.begin(),
p.end(), engine );
94 auto oldsize =
p.size();
95 p.resize( 2 *
p.size() );
96 std::copy_n(
p.begin(), oldsize,
p.begin() + oldsize );
103 int X =
static_cast<int>( std::floor( x ) ) & 255;
104 int Y =
static_cast<int>( std::floor( y ) ) & 255;
105 int Z =
static_cast<int>( std::floor( z ) ) & 255;
108 x -= std::floor( x );
109 y -= std::floor( y );
110 z -= std::floor( z );
113 const float u =
fade( x );
114 const float v =
fade( y );
115 const float w =
fade( z );
118 const int A =
p[
X] + Y;
119 const int AA =
p[
A] + Z;
120 const int AB =
p[
A + 1] + Z;
121 const int B =
p[
X + 1] + Y;
122 const int BA =
p[
B] + Z;
123 const int BB =
p[
B + 1] + Z;
128 lerp( v,
lerp( u,
grad(
p[AA], x, y, z ),
grad(
p[
BA], x - 1, y, z ) ),
130 lerp( v,
lerp( u,
grad(
p[AA + 1], x, y, z - 1 ),
grad(
p[
BA + 1], x - 1, y, z - 1 ) ),
131 lerp( u,
grad(
p[AB + 1], x, y - 1, z - 1 ),
132 grad(
p[
BB + 1], x - 1, y - 1, z - 1 ) ) ) );
134 return (
res + 1.0f) / 2.0f;
141 int X =
static_cast<int>( std::floor( x ) ) & 255;
142 int Y =
static_cast<int>( std::floor( y ) ) & 255;
145 x -= std::floor( x );
146 y -= std::floor( y );
149 const float u =
fade( x );
150 const float v =
fade( y );
153 const int A =
p[
X] + Y;
154 const int AA =
p[
A] + 0;
155 const int AB =
p[
A + 1] + 0;
156 const int B =
p[
X + 1] + Y;
157 const int BA =
p[
B] + 0;
158 const int BB =
p[
B + 1] + 0;
164 return (
res + 1.0f ) / 2.0f;
170 return t * t * t * ( t * ( t * 6.0f - 15.0f ) + 10.0f );
176 return a + t * ( b - a );
182 const int h = hash & 15;
185 const float u = h < 8 ? x : y;
186 const float v = h < 4 ? y : h == 12 || h == 14 ? x : z;
188 return ( ( h & 1 ) == 0 ? u : -u ) + ( ( h & 2 ) == 0 ? v : -v );
194 const int h = hash & 15;
197 const float u = h < 8 ? x : y;
198 const float v = h < 4 ? y : h == 12 || h == 14 ? x : 0.0f;
200 return ( ( h & 1 ) == 0 ? u : -u ) + ( ( h & 2 ) == 0 ? v : -v );
This source code comes from the project: https://github.com/sol-prog/Perlin_Noise.
float lerp(float t, float a, float b) const
PerlinNoise()
Initialize with the reference values for the permutation vector.
float grad(int hash, float x, float y, float z) const
float noise(float x, float y, float z) const
float fade(float t) const