5
// Created by DoG on 19.02.07.
6
// Copyright 2007 Doemoetoer Gulyas. All rights reserved.
9
#import "SimplexNoise.h"
10
#import "MersenneTwister.h"
13
static const float grad3[12][3] = {
14
{1,1,0},{-1,1,0},{1,-1,0},{-1,-1,0},
15
{1,0,1},{-1,0,1},{1,0,-1},{-1,0,-1},
16
{0,1,1},{0,-1,1},{0,1,-1},{0,-1,-1}
19
static float dot3(const float g[], const float x, const float y, const float z)
20
{ return g[0]*x + g[1]*y + g[2]*z; };
23
@implementation SimplexNoise
41
- (void) setSeed: (uint32_t) seed
43
MersenneTwister* rgen = [[[MersenneTwister alloc] initWithSeed: seed] autorelease];
47
perm = calloc(3*256, sizeof(uint32_t));
49
// generate array from 0..255
50
for (uint32_t i = 0; i < 256; ++i)
54
// randomly swap indices
55
for (uint32_t i = 0; i < 256; ++i)
57
uint32_t r1 = [rgen randomNumber] & 0xFF;
59
uint32_t tmp = perm[i];
64
for (uint32_t i = 0; i < 256; ++i)
66
perm[i + 256] = perm[i];
67
perm[i - 256] = perm[i];
73
static float sumFA(float *v, uint32_t n)
76
for (unsigned int i = 0; i < n; ++i)
82
static v3 atv(uint32_t* array)
85
for (size_t i = 0; i < 3; ++i)
90
- (float) noise3dWithVector: (v3) v
92
//float n[4] = {0.0f,0.0f,0.0f,0.0f};
94
const float F3 = 1.0f/3.0f;
95
const float G3 = 1.0f/6.0f;
98
v3 ijk = vfloor(vadd(v,vcreate(s,s,s)));
99
float t = vsum(ijk)*G3;
101
v3 X0 = vsub(ijk, vcreate(t,t,t));
105
BOOL Xy = x[0].a[0] >= x[0].a[1];
106
BOOL Yz = x[0].a[1] >= x[0].a[2];
107
BOOL Zx = x[0].a[2] >= x[0].a[0];
109
int xOrder = !Xy + Zx;
110
int yOrder = Xy + !Yz;
111
int zOrder = !Zx + Yz;
113
if ((xOrder == 1) && (yOrder == 1) && (zOrder == 1))
120
int i1 = (xOrder < 1), j1 = (yOrder < 1), k1 = (zOrder < 1); // Offsets for second corner of simplex in (i,j,k) coords
121
int i2 = (xOrder < 2), j2 = (yOrder < 2), k2 = (zOrder < 2); // Offsets for third corner of simplex in (i,j,k) coords
123
v3 ijk1 = {{i1,j1,k1}};
124
v3 ijk2 = {{i2,j2,k2}};
125
v3 G3v = {{G3,G3,G3}};
126
x[1] = vadd(vsub(x[0], ijk1), G3v);
127
x[2] = vadd(vsub(x[0], ijk2), vmul(G3v, 2.0f));
128
x[3] = vadd(vsub(x[0], vcreate(1.0f, 1.0f, 1.0f)), vmul(G3v, 3.0f));
132
int32_t ii = (int32_t)ijk.a[0] % 256;
133
int32_t jj = (int32_t)ijk.a[1] % 256;
134
int32_t kk = (int32_t)ijk.a[2] % 256;
136
uint32_t gi[4] = { perm[ii + perm[jj + perm[kk]]] % 12,
137
perm[ii + i1 + perm[jj + j1 + perm[kk + k1]]] % 12,
138
perm[ii + i2 + perm[jj + j2 + perm[kk + k2]]] % 12,
139
perm[ii + 1 + perm[jj + 1 + perm[kk + 1]]] % 12};
141
float n[4] = {0.0f,0.0f,0.0f,0.0f};
144
if ((v.v.x == 0.0f) && (v.v.y == 0.0f) && (v.v.z == 0.0f))
149
for (size_t i = 0; i < 4; ++i)
151
float ti = 0.6f - vdot(x[i],x[i]);
155
n[i] = ti*ti*dot3(grad3[gi[i]], x[i].a[0], x[i].a[1], x[i].a[2]);
158
float result = 32.0f*(sumFA(n,4));
159
//NSLog(@"%f", result);
160
return result; // range: -1..1
163
- (float) noise3dWithX: (float) _x Y: (float) _y Z: (float) _z
165
//float n[4] = {0.0f,0.0f,0.0f,0.0f};
168
return [self noise3dWithVector: v];
172
static const int primes[100] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523};
174
- (float) noise3dPrimeWithX: (float) x Y: (float) y Z: (float) z withOctaves: (size_t) count
179
float factors = 0.0f;
184
for (size_t i = 0; i < count; ++i)
186
float scale = primes[i];
187
float factor = 1.0f/scale;
189
v3 offset = {{i,i,i}};
190
noise += [self noise3dWithVector: vadd(vmul(v,scale),offset)]*factor;
192
return noise/factors;
195
- (float) noise3dOctavesWithX: (float) x Y: (float) y Z: (float) z withOctaves: (size_t) count
201
float factors = 0.0f;
208
for (size_t i = 0; i < count; ++i)
210
float factor = 1.0f/(scale);
212
v3 offset = {{i,i,i}};
213
noise += [self noise3dWithVector: vadd(vmul(v,scale),offset)]*factor;
216
return noise/factors;
219
- (float) noise3dOctavesSqrWithX: (float) x Y: (float) y Z: (float) z withOctaves: (size_t) count
225
float factors = 0.0f;
232
for (size_t i = 0; i < count; ++i)
234
float factor = 1.0f/(scale*scale);
236
v3 offset = {{i,i,i}};
237
noise += [self noise3dWithVector: vadd(vmul(v,scale),offset)]*factor;
240
return noise/factors;
243
- (float) noise3dWhiteWithX: (float) x Y: (float) y Z: (float) z withOctaves: (size_t) count
249
float factors = 0.0f;
255
for (size_t i = 0; i < count; ++i)
257
float scale = 1.0f+i;
260
v3 offset = {{i,i,i}};
261
noise += [self noise3dWithVector: vadd(vmul(v,scale),offset)]*factor;
263
return noise/factors;
266
- (float) noise3dPinkWithX: (float) x Y: (float) y Z: (float) z withOctaves: (size_t) count
272
float factors = 0.0f;
278
for (size_t i = 0; i < count; ++i)
280
float scale = 1.0f+i;
281
float factor = 1.0f/scale;
283
v3 offset = {{i,i,i}};
284
noise += [self noise3dWithVector: vadd(vmul(v,scale),offset)]*factor;
286
return noise/factors;
289
- (float) noise3dBrownWithX: (float) x Y: (float) y Z: (float) z withOctaves: (size_t) count
295
float factors = 0.0f;
301
for (size_t i = 0; i < count; ++i)
303
float scale = 1.0f+i;
304
float factor = 1.0f/(scale*scale);
306
v3 offset = {{i,i,i}};
307
noise += [self noise3dWithVector: vadd(vmul(v,scale),offset)]*factor;
309
return noise/factors;
312
- (float) noise3dWithX: (float) x Y: (float) y Z: (float) z withOctaves: (size_t) count ofType: (int) type
317
return [self noise3dBrownWithX: x Y: y Z: z withOctaves: count];
319
return [self noise3dPinkWithX: x Y: y Z: z withOctaves: count];
321
return [self noise3dWhiteWithX: x Y: y Z: z withOctaves: count];
323
return [self noise3dOctavesSqrWithX: x Y: y Z: z withOctaves: count];
325
return [self noise3dOctavesWithX: x Y: y Z: z withOctaves: count];
327
return [self noise3dPrimeWithX: x Y: y Z: z withOctaves: count];
330
return [self noise3dWithX: x Y: y Z: z];