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