KiCad PCB EDA Suite
PerlinNoise Class Reference

#include <PerlinNoise.h>

Public Member Functions

 PerlinNoise ()
 
 PerlinNoise (unsigned int seed)
 
float noise (float x, float y, float z) const
 
float noise (float x, float y) const
 

Private Member Functions

float fade (float t) const
 
float lerp (float t, float a, float b) const
 
float grad (int hash, float x, float y, float z) const
 
float grad (int hash, float x, float y) const
 

Private Attributes

std::vector< int > p
 

Detailed Description

Definition at line 55 of file PerlinNoise.h.

Constructor & Destructor Documentation

PerlinNoise::PerlinNoise ( )

Definition at line 57 of file PerlinNoise.cpp.

References p.

58 {
59 
60  // Initialize the permutation vector with the reference values
61  p = {
62  151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
63  8,99,37,240,21,10,23,190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
64  35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,
65  134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,
66  55,46,245,40,244,102,143,54, 65,25,63,161,1,216,80,73,209,76,132,187,208, 89,
67  18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,
68  250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,
69  189,28,42,223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167,
70  43,172,9,129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,
71  97,228,251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,
72  107,49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
73  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 };
74 
75  // Duplicate the permutation vector
76  p.insert(p.end(), p.begin(), p.end());
77 }
std::vector< int > p
Definition: PerlinNoise.h:58
PerlinNoise::PerlinNoise ( unsigned int  seed)

Definition at line 80 of file PerlinNoise.cpp.

References p.

81 {
82  p.resize( 256 );
83 
84  // Fill p with values from 0 to 255
85  std::iota( p.begin(), p.end(), 0 );
86 
87  // Initialize a random engine with seed
88  std::default_random_engine engine( seed );
89 
90  // Suffle using the above random engine
91  std::shuffle( p.begin(), p.end(), engine );
92 
93  // Duplicate the permutation vector
94  p.insert( p.end(), p.begin(), p.end() );
95 }
std::vector< int > p
Definition: PerlinNoise.h:58

Member Function Documentation

float PerlinNoise::fade ( float  t) const
private

Definition at line 178 of file PerlinNoise.cpp.

Referenced by noise().

179 {
180  return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
181 }
float PerlinNoise::grad ( int  hash,
float  x,
float  y,
float  z 
) const
private

Definition at line 190 of file PerlinNoise.cpp.

Referenced by noise().

191 {
192  const int h = hash & 15;
193 
194  // Convert lower 4 bits of hash inot 12 gradient directions
195  const float u = h < 8 ? x : y;
196  const float v = h < 4 ? y : h == 12 || h == 14 ? x : z;
197 
198  return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
199 }
float PerlinNoise::grad ( int  hash,
float  x,
float  y 
) const
private

Definition at line 202 of file PerlinNoise.cpp.

203 {
204  const int h = hash & 15;
205 
206  // Convert lower 4 bits of hash inot 12 gradient directions
207  const float u = h < 8 ? x : y;
208  const float v = h < 4 ? y : h == 12 || h == 14 ? x : 0.0f;
209 
210  return ((h & 1) == 0 ? u : -u) + ((h & 2) == 0 ? v : -v);
211 }
float PerlinNoise::lerp ( float  t,
float  a,
float  b 
) const
private

Definition at line 184 of file PerlinNoise.cpp.

Referenced by noise().

185 {
186  return a + t * (b - a);
187 }
float PerlinNoise::noise ( float  x,
float  y,
float  z 
) const

Definition at line 97 of file PerlinNoise.cpp.

References fade(), grad(), lerp(), and p.

Referenced by CCOPPERNORMAL::Generate(), CPLASTICNORMAL::Generate(), CPLASTICSHINENORMAL::Generate(), and CMETALBRUSHEDNORMAL::Generate().

98 {
99  // Find the unit cube that contains the point
100  int X = (int) ((float)floor( x )) & 255;
101  int Y = (int) ((float)floor( y )) & 255;
102  int Z = (int) ((float)floor( z )) & 255;
103 
104  // Find relative x, y,z of point in cube
105  x -= (float)floor( x );
106  y -= (float)floor( y );
107  z -= (float)floor( z );
108 
109  // Compute fade curves for each of x, y, z
110  const float u = fade( x );
111  const float v = fade( y );
112  const float w = fade( z );
113 
114  // Hash coordinates of the 8 cube corners
115  const int A = p[X] + Y;
116  const int AA = p[A] + Z;
117  const int AB = p[A + 1] + Z;
118  const int B = p[X + 1] + Y;
119  const int BA = p[B] + Z;
120  const int BB = p[B + 1] + Z;
121 
122  // Add blended results from 8 corners of cube
123  const float res = lerp( w,
124  lerp( v,
125  lerp( u,
126  grad( p[AA], x , y, z),
127  grad( p[BA], x - 1, y, z) ),
128  lerp( u,
129  grad( p[AB], x , y - 1, z ),
130  grad( p[BB], x - 1, y - 1, z) ) ),
131  lerp( v,
132  lerp( u,
133  grad( p[AA + 1], x , y, z - 1 ),
134  grad( p[BA + 1], x - 1, y, z - 1) ),
135  lerp( u,
136  grad( p[AB + 1], x , y - 1, z - 1 ),
137  grad( p[BB + 1], x - 1, y - 1, z - 1 ) ) ) );
138 
139  return (res + 1.0f) / 2.0f;
140 }
std::vector< int > p
Definition: PerlinNoise.h:58
float lerp(float t, float a, float b) const
float fade(float t) const
float grad(int hash, float x, float y, float z) const
float PerlinNoise::noise ( float  x,
float  y 
) const

Definition at line 143 of file PerlinNoise.cpp.

References fade(), grad(), lerp(), and p.

144 {
145  // Find the unit cube that contains the point
146  int X = (int) ((float)floor( x )) & 255;
147  int Y = (int) ((float)floor( y )) & 255;
148 
149  // Find relative x, y,z of point in cube
150  x -= (float)floor( x );
151  y -= (float)floor( y );
152 
153  // Compute fade curves for each of x, y
154  const float u = fade( x );
155  const float v = fade( y );
156 
157  // Hash coordinates of the 8 cube corners
158  const int A = p[X] + Y;
159  const int AA = p[A] + 0;
160  const int AB = p[A + 1] + 0;
161  const int B = p[X + 1] + Y;
162  const int BA = p[B] + 0;
163  const int BB = p[B + 1] + 0;
164 
165  // Add blended results from 8 corners of cube
166  const float res = lerp( v,
167  lerp( u,
168  grad( p[AA], x , y ),
169  grad( p[BA], x - 1, y ) ),
170  lerp( u,
171  grad( p[AB], x , y - 1 ),
172  grad( p[BB], x - 1, y - 1 ) ) );
173 
174  return (res + 1.0f) / 2.0f;
175 }
std::vector< int > p
Definition: PerlinNoise.h:58
float lerp(float t, float a, float b) const
float fade(float t) const
float grad(int hash, float x, float y, float z) const

Member Data Documentation

std::vector<int> PerlinNoise::p
private

Definition at line 58 of file PerlinNoise.h.

Referenced by noise(), and PerlinNoise().


The documentation for this class was generated from the following files: