Kigs Framework  Doc version 0.8
Open source multi purpose Rapid Application Development framework
simplexnoise.h
1 /* Copyright (c) 2007-2012 Eliot Eshelman
2  *
3  * This program is free software: you can redistribute it and/or modify
4  * it under the terms of the GNU General Public License as published by
5  * the Free Software Foundation, either version 3 of the License, or
6  * (at your option) any later version.
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  */
17 
18 
19 #ifndef SIMPLEX_H_
20 #define SIMPLEX_H_
21 
22 
23 /* 2D, 3D and 4D Simplex Noise functions return 'random' values in (-1, 1).
24 
25 This algorithm was originally designed by Ken Perlin, but my code has been
26 adapted from the implementation written by Stefan Gustavson (stegu@itn.liu.se)
27 
28 Raw Simplex noise functions return the value generated by Ken's algorithm.
29 
30 Scaled Raw Simplex noise functions adjust the range of values returned from the
31 traditional (-1, 1) to whichever bounds are passed to the function.
32 
33 Multi-Octave Simplex noise functions compine multiple noise values to create a
34 more complex result. Each successive layer of noise is adjusted and scaled.
35 
36 Scaled Multi-Octave Simplex noise functions scale the values returned from the
37 traditional (-1,1) range to whichever range is passed to the function.
38 
39 In many cases, you may think you only need a 1D noise function, but in practice
40 2D is almost always better. For instance, if you're using the current frame
41 number as the parameter for the noise, all objects will end up with the same
42 noise value at each frame. By adding a second parameter on the second
43 dimension, you can ensure that each gets a unique noise value and they don't
44 all look identical.
45 */
46 
47 
48 // Multi-octave Simplex noise
49 // For each octave, a higher frequency/lower amplitude function will be added to the original.
50 // The higher the persistence [0-1], the more of each succeeding octave will be added.
51 float octave_noise_2d(const float octaves,
52  const float persistence,
53  const float scale,
54  const float x,
55  const float y);
56 float octave_noise_3d(const float octaves,
57  const float persistence,
58  const float scale,
59  const float x,
60  const float y,
61  const float z);
62 float octave_noise_4d(const float octaves,
63  const float persistence,
64  const float scale,
65  const float x,
66  const float y,
67  const float z,
68  const float w);
69 
70 
71 // Scaled Multi-octave Simplex noise
72 // The result will be between the two parameters passed.
73 float scaled_octave_noise_2d( const float octaves,
74  const float persistence,
75  const float scale,
76  const float loBound,
77  const float hiBound,
78  const float x,
79  const float y);
80 float scaled_octave_noise_3d( const float octaves,
81  const float persistence,
82  const float scale,
83  const float loBound,
84  const float hiBound,
85  const float x,
86  const float y,
87  const float z);
88 float scaled_octave_noise_4d( const float octaves,
89  const float persistence,
90  const float scale,
91  const float loBound,
92  const float hiBound,
93  const float x,
94  const float y,
95  const float z,
96  const float w);
97 
98 // Scaled Raw Simplex noise
99 // The result will be between the two parameters passed.
100 float scaled_raw_noise_2d( const float loBound,
101  const float hiBound,
102  const float x,
103  const float y);
104 float scaled_raw_noise_3d( const float loBound,
105  const float hiBound,
106  const float x,
107  const float y,
108  const float z);
109 float scaled_raw_noise_4d( const float loBound,
110  const float hiBound,
111  const float x,
112  const float y,
113  const float z,
114  const float w);
115 
116 
117 // Raw Simplex noise - a single noise value.
118 float raw_noise_2d(const float x, const float y);
119 float raw_noise_3d(const float x, const float y, const float z);
120 float raw_noise_4d(const float x, const float y, const float, const float w);
121 
122 
123 int fastfloor(const float x);
124 
125 float dot(const int* g, const float x, const float y);
126 float dot(const int* g, const float x, const float y, const float z);
127 float dot(const int* g, const float x, const float y, const float z, const float w);
128 
129 
130 // The gradients are the midpoints of the vertices of a cube.
131 static const int grad3[12][3] = {
132  {1,1,0}, {-1,1,0}, {1,-1,0}, {-1,-1,0},
133  {1,0,1}, {-1,0,1}, {1,0,-1}, {-1,0,-1},
134  {0,1,1}, {0,-1,1}, {0,1,-1}, {0,-1,-1}
135 };
136 
137 
138 // The gradients are the midpoints of the vertices of a hypercube.
139 static const int grad4[32][4]= {
140  {0,1,1,1}, {0,1,1,-1}, {0,1,-1,1}, {0,1,-1,-1},
141  {0,-1,1,1}, {0,-1,1,-1}, {0,-1,-1,1}, {0,-1,-1,-1},
142  {1,0,1,1}, {1,0,1,-1}, {1,0,-1,1}, {1,0,-1,-1},
143  {-1,0,1,1}, {-1,0,1,-1}, {-1,0,-1,1}, {-1,0,-1,-1},
144  {1,1,0,1}, {1,1,0,-1}, {1,-1,0,1}, {1,-1,0,-1},
145  {-1,1,0,1}, {-1,1,0,-1}, {-1,-1,0,1}, {-1,-1,0,-1},
146  {1,1,1,0}, {1,1,-1,0}, {1,-1,1,0}, {1,-1,-1,0},
147  {-1,1,1,0}, {-1,1,-1,0}, {-1,-1,1,0}, {-1,-1,-1,0}
148 };
149 
150 
151 // Permutation table. The same list is repeated twice.
152 static const int perm[512] = {
153  151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
154  8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
155  35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,
156  134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,
157  55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, 89,
158  18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,
159  250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,
160  189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,
161  172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,
162  228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,
163  107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,
164  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,
165 
166  151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,
167  8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,
168  35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,
169  134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,
170  55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208, 89,
171  18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,
172  250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,
173  189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,
174  172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,
175  228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,
176  107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,
177  138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
178 };
179 
180 
181 // A lookup table to traverse the simplex around a given point in 4D.
182 static const int simplex[64][4] = {
183  {0,1,2,3},{0,1,3,2},{0,0,0,0},{0,2,3,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,2,3,0},
184  {0,2,1,3},{0,0,0,0},{0,3,1,2},{0,3,2,1},{0,0,0,0},{0,0,0,0},{0,0,0,0},{1,3,2,0},
185  {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},
186  {1,2,0,3},{0,0,0,0},{1,3,0,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,3,0,1},{2,3,1,0},
187  {1,0,2,3},{1,0,3,2},{0,0,0,0},{0,0,0,0},{0,0,0,0},{2,0,3,1},{0,0,0,0},{2,1,3,0},
188  {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},
189  {2,0,1,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,0,1,2},{3,0,2,1},{0,0,0,0},{3,1,2,0},
190  {2,1,0,3},{0,0,0,0},{0,0,0,0},{0,0,0,0},{3,1,0,2},{0,0,0,0},{3,2,0,1},{3,2,1,0}
191 };
192 
193 
194 #endif /*SIMPLEX_H_*/