1 /*
2 noise.h and noise.c are derived from this project:
3
4 https://github.com/caseman/noise
5
6 Copyright (c) 2008 Casey Duncan
7
8 Permission is hereby granted, free of charge, to any person obtaining a copy
9 of this software and associated documentation files (the "Software"), to deal
10 in the Software without restriction, including without limitation the rights
11 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 copies of the Software, and to permit persons to whom the Software is
13 furnished to do so, subject to the following conditions:
14
15 The above copyright notice and this permission notice shall be included in all
16 copies or substantial portions of the Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 SOFTWARE.
25 */
26
27 #include <math.h>
28 #include <stdlib.h>
29 #include <string.h>
30
31 #define F2 0.3660254037844386f
32 #define G2 0.21132486540518713f
33 #define F3 (1.0f / 3.0f)
34 #define G3 (1.0f / 6.0f)
35 #define ASSIGN(a, v0, v1, v2) (a)[0] = v0; (a)[1] = v1; (a)[2] = v2;
36 #define DOT3(v1, v2) ((v1)[0] * (v2)[0] + (v1)[1] * (v2)[1] + (v1)[2] * (v2)[2])
37
38 const static float GRAD3[16][3] = {
39 { 1, 1, 0}, {-1, 1, 0}, { 1,-1, 0}, {-1,-1, 0},
40 { 1, 0, 1}, {-1, 0, 1}, { 1, 0,-1}, {-1, 0,-1},
41 { 0, 1, 1}, { 0,-1, 1}, { 0, 1,-1}, { 0,-1,-1},
42 { 1, 0,-1}, {-1, 0,-1}, { 0,-1, 1}, { 0, 1, 1}
43 };
44
45 static unsigned char PERM[] = {
46 151, 160, 137, 91, 90, 15, 131, 13,
47 201, 95, 96, 53, 194, 233, 7, 225,
48 140, 36, 103, 30, 69, 142, 8, 99,
49 37, 240, 21, 10, 23, 190, 6, 148,
50 247, 120, 234, 75, 0, 26, 197, 62,
51 94, 252, 219, 203, 117, 35, 11, 32,
52 57, 177, 33, 88, 237, 149, 56, 87,
53 174, 20, 125, 136, 171, 168, 68, 175,
54 74, 165, 71, 134, 139, 48, 27, 166,
55 77, 146, 158, 231, 83, 111, 229, 122,
56 60, 211, 133, 230, 220, 105, 92, 41,
57 55, 46, 245, 40, 244, 102, 143, 54,
58 65, 25, 63, 161, 1, 216, 80, 73,
59 209, 76, 132, 187, 208, 89, 18, 169,
60 200, 196, 135, 130, 116, 188, 159, 86,
61 164, 100, 109, 198, 173, 186, 3, 64,
62 52, 217, 226, 250, 124, 123, 5, 202,
63 38, 147, 118, 126, 255, 82, 85, 212,
64 207, 206, 59, 227, 47, 16, 58, 17,
65 182, 189, 28, 42, 223, 183, 170, 213,
66 119, 248, 152, 2, 44, 154, 163, 70,
67 221, 153, 101, 155, 167, 43, 172, 9,
68 129, 22, 39, 253, 19, 98, 108, 110,
69 79, 113, 224, 232, 178, 185, 112, 104,
70 218, 246, 97, 228, 251, 34, 242, 193,
71 238, 210, 144, 12, 191, 179, 162, 241,
72 81, 51, 145, 235, 249, 14, 239, 107,
73 49, 192, 214, 31, 181, 199, 106, 157,
74 184, 84, 204, 176, 115, 121, 50, 45,
75 127, 4, 150, 254, 138, 236, 205, 93,
76 222, 114, 67, 29, 24, 72, 243, 141,
77 128, 195, 78, 66, 215, 61, 156, 180,
78 151, 160, 137, 91, 90, 15, 131, 13,
79 201, 95, 96, 53, 194, 233, 7, 225,
80 140, 36, 103, 30, 69, 142, 8, 99,
81 37, 240, 21, 10, 23, 190, 6, 148,
82 247, 120, 234, 75, 0, 26, 197, 62,
83 94, 252, 219, 203, 117, 35, 11, 32,
84 57, 177, 33, 88, 237, 149, 56, 87,
85 174, 20, 125, 136, 171, 168, 68, 175,
86 74, 165, 71, 134, 139, 48, 27, 166,
87 77, 146, 158, 231, 83, 111, 229, 122,
88 60, 211, 133, 230, 220, 105, 92, 41,
89 55, 46, 245, 40, 244, 102, 143, 54,
90 65, 25, 63, 161, 1, 216, 80, 73,
91 209, 76, 132, 187, 208, 89, 18, 169,
92 200, 196, 135, 130, 116, 188, 159, 86,
93 164, 100, 109, 198, 173, 186, 3, 64,
94 52, 217, 226, 250, 124, 123, 5, 202,
95 38, 147, 118, 126, 255, 82, 85, 212,
96 207, 206, 59, 227, 47, 16, 58, 17,
97 182, 189, 28, 42, 223, 183, 170, 213,
98 119, 248, 152, 2, 44, 154, 163, 70,
99 221, 153, 101, 155, 167, 43, 172, 9,
100 129, 22, 39, 253, 19, 98, 108, 110,
101 79, 113, 224, 232, 178, 185, 112, 104,
102 218, 246, 97, 228, 251, 34, 242, 193,
103 238, 210, 144, 12, 191, 179, 162, 241,
104 81, 51, 145, 235, 249, 14, 239, 107,
105 49, 192, 214, 31, 181, 199, 106, 157,
106 184, 84, 204, 176, 115, 121, 50, 45,
107 127, 4, 150, 254, 138, 236, 205, 93,
108 222, 114, 67, 29, 24, 72, 243, 141,
109 128, 195, 78, 66, 215, 61, 156, 180
110 };
111
seed(unsigned int x)112 void seed(unsigned int x) {
113 srand(x);
114 for (int i = 0; i < 256; i++) {
115 PERM[i] = i;
116 }
117 for (int i = 255; i > 0; i--) {
118 int j;
119 int n = i + 1;
120 while (n <= (j = rand() / (RAND_MAX / n)));
121 unsigned char a = PERM[i];
122 unsigned char b = PERM[j];
123 PERM[i] = b;
124 PERM[j] = a;
125 }
126 memcpy(PERM + 256, PERM, sizeof(unsigned char) * 256);
127 }
128
noise2(float x,float y)129 float noise2(float x, float y) {
130 int i1, j1, I, J, c;
131 float s = (x + y) * F2;
132 float i = floorf(x + s);
133 float j = floorf(y + s);
134 float t = (i + j) * G2;
135
136 float xx[3], yy[3], f[3];
137 float noise[3] = {0.0f, 0.0f, 0.0f};
138 int g[3];
139
140 xx[0] = x - (i - t);
141 yy[0] = y - (j - t);
142
143 i1 = xx[0] > yy[0];
144 j1 = xx[0] <= yy[0];
145
146 xx[2] = xx[0] + G2 * 2.0f - 1.0f;
147 yy[2] = yy[0] + G2 * 2.0f - 1.0f;
148 xx[1] = xx[0] - i1 + G2;
149 yy[1] = yy[0] - j1 + G2;
150
151 I = (int) i & 255;
152 J = (int) j & 255;
153 g[0] = PERM[I + PERM[J]] % 12;
154 g[1] = PERM[I + i1 + PERM[J + j1]] % 12;
155 g[2] = PERM[I + 1 + PERM[J + 1]] % 12;
156
157 for (c = 0; c <= 2; c++) {
158 f[c] = 0.5f - xx[c]*xx[c] - yy[c]*yy[c];
159 }
160
161 for (c = 0; c <= 2; c++) {
162 if (f[c] > 0) {
163 noise[c] = f[c] * f[c] * f[c] * f[c] *
164 (GRAD3[g[c]][0] * xx[c] + GRAD3[g[c]][1] * yy[c]);
165 }
166 }
167
168 return (noise[0] + noise[1] + noise[2]) * 70.0f;
169 }
170
noise3(float x,float y,float z)171 float noise3(float x, float y, float z) {
172 int c, o1[3], o2[3], g[4], I, J, K;
173 float f[4], noise[4] = {0.0f, 0.0f, 0.0f, 0.0f};
174 float s = (x + y + z) * F3;
175 float i = floorf(x + s);
176 float j = floorf(y + s);
177 float k = floorf(z + s);
178 float t = (i + j + k) * G3;
179
180 float pos[4][3];
181
182 pos[0][0] = x - (i - t);
183 pos[0][1] = y - (j - t);
184 pos[0][2] = z - (k - t);
185
186 if (pos[0][0] >= pos[0][1]) {
187 if (pos[0][1] >= pos[0][2]) {
188 ASSIGN(o1, 1, 0, 0);
189 ASSIGN(o2, 1, 1, 0);
190 } else if (pos[0][0] >= pos[0][2]) {
191 ASSIGN(o1, 1, 0, 0);
192 ASSIGN(o2, 1, 0, 1);
193 } else {
194 ASSIGN(o1, 0, 0, 1);
195 ASSIGN(o2, 1, 0, 1);
196 }
197 } else {
198 if (pos[0][1] < pos[0][2]) {
199 ASSIGN(o1, 0, 0, 1);
200 ASSIGN(o2, 0, 1, 1);
201 } else if (pos[0][0] < pos[0][2]) {
202 ASSIGN(o1, 0, 1, 0);
203 ASSIGN(o2, 0, 1, 1);
204 } else {
205 ASSIGN(o1, 0, 1, 0);
206 ASSIGN(o2, 1, 1, 0);
207 }
208 }
209
210 for (c = 0; c <= 2; c++) {
211 pos[3][c] = pos[0][c] - 1.0f + 3.0f * G3;
212 pos[2][c] = pos[0][c] - o2[c] + 2.0f * G3;
213 pos[1][c] = pos[0][c] - o1[c] + G3;
214 }
215
216 I = (int) i & 255;
217 J = (int) j & 255;
218 K = (int) k & 255;
219 g[0] = PERM[I + PERM[J + PERM[K]]] % 12;
220 g[1] = PERM[I + o1[0] + PERM[J + o1[1] + PERM[o1[2] + K]]] % 12;
221 g[2] = PERM[I + o2[0] + PERM[J + o2[1] + PERM[o2[2] + K]]] % 12;
222 g[3] = PERM[I + 1 + PERM[J + 1 + PERM[K + 1]]] % 12;
223
224 for (c = 0; c <= 3; c++) {
225 f[c] = 0.6f - pos[c][0] * pos[c][0] - pos[c][1] * pos[c][1] -
226 pos[c][2] * pos[c][2];
227 }
228
229 for (c = 0; c <= 3; c++) {
230 if (f[c] > 0) {
231 noise[c] = f[c] * f[c] * f[c] * f[c] * DOT3(pos[c], GRAD3[g[c]]);
232 }
233 }
234
235 return (noise[0] + noise[1] + noise[2] + noise[3]) * 32.0f;
236 }
237
simplex2(float x,float y,int octaves,float persistence,float lacunarity)238 float simplex2(
239 float x, float y,
240 int octaves, float persistence, float lacunarity)
241 {
242 float freq = 1.0f;
243 float amp = 1.0f;
244 float max = 1.0f;
245 float total = noise2(x, y);
246 int i;
247 for (i = 1; i < octaves; i++) {
248 freq *= lacunarity;
249 amp *= persistence;
250 max += amp;
251 total += noise2(x * freq, y * freq) * amp;
252 }
253 return (1 + total / max) / 2;
254 }
255
simplex3(float x,float y,float z,int octaves,float persistence,float lacunarity)256 float simplex3(
257 float x, float y, float z,
258 int octaves, float persistence, float lacunarity)
259 {
260 float freq = 1.0f;
261 float amp = 1.0f;
262 float max = 1.0f;
263 float total = noise3(x, y, z);
264 int i;
265 for (i = 1; i < octaves; ++i) {
266 freq *= lacunarity;
267 amp *= persistence;
268 max += amp;
269 total += noise3(x * freq, y * freq, z * freq) * amp;
270 }
271 return (1 + total / max) / 2;
272 }
273