-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnoise.lua
197 lines (174 loc) · 5.03 KB
/
noise.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
-- Perlin noise for norns
-- author: @naus3a - [email protected]
--[[ Credits:
this Perlin noise implementation is basically a lua port of Stefan Gustavon's SimplexNoise1234 c++ version.
I like this code a lot, I used it very often and I ported it to most languages/environments, so kudos and credits to:
(c) Stefan Gustavson 2003-2005
]]--
Noise = {}
-- Permutation table
-- This is just a random jumble of all numbers 0-255,
-- repeated twice to avoid wrapping the index at 255 for each lookup.
-- This needs to be exactly the same for all instances on all platforms,
-- so it's easiest to just keep it as inline explicit data.
-- This also removes the need for any initialisation of this class.
Noise.perm = {151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180,
151,160,137,91,90,15,
131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180
}
function Noise.fastFloor(x)
if x>0 then
return math.floor(x)
else
return (math.floor(x)-1)
end
end
function Noise.grad1(hash, x)
local h = bit32.band(hash, 15)
local grad = 1 + bit32.band(h, 7)
if bit32.band(h, 8)>8 then
grad = -grad
end
return (grad*x)
end
function Noise.grad2(hash, x, y)
local h = bit32.band(hash, 7)
local u = 0
local v = 0
if h<4 then
u = x
v = y
else
u = y
v = x
end
local g1 = -u
if bit32.band(h, 1)>0 then
g1 = u
end
local g2 = -2*v
if bit32.band(h,2) then
g2 = -1*g2
end
return (g1+g2)
end
-- 1D noise
function Noise:noise(x)
local i0 = Noise.fastFloor(x)
local i1 = i0+1
local x0 = x-i0
local x1 = x0-1
local t1 = 1 - (x1*x1)
local n0 = 0
local n1 = 0
local t0 = 1 - (x0*x0)
t0 = t0*t0
local pIdx = bit32.band(i0, 0xff)
if pIdx<1 then
pIdx = 1
elseif pIdx>255 then
pIdx = 255
end
local pEl = self.perm[pIdx]
local g = Noise.grad1(pEl, x0)
n0 = t0*t0*g
pIdx = bit32.band(i1, 0xff)
if pIdx<1 then
pIdx = 1
elseif pIdx>255 then
pIdx = 255
end
pEl = self.perm[pIdx]
g = Noise.grad1(pEl, x1)
t1 = t1*t1
n1 = t1*t1*g
return (0.25 * (n0+n1))
end
-- noise 2D
function Noise:noise2D(x,y)
local f2 = 0.366025403
local g2 = 0.211324865
local n0 = 0
local n1 = 0
local n2 = 0
local s = (x+y)*f2
local xs = x+s
local ys = y+s
local i = Noise.fastFloor(xs)
local j = Noise.fastFloor(ys)
local t = (i+j)*g2
local X0 = i-t
local Y0 = j-t
local x0 = x-X0
local y0 = y-Y0
local x1 = 0
local y1 = 0
local x2 = 0
local y2 = 0
local ii = 0
local jj = 0
local t0 = 0
local t1 = 0
local t2 = 0
local i1 = 0
local j1 = 0
if x0>y0 then
i1=1
j1=0
else
i1=0
j1=1
end
x1 = x0-i1+g2
y1 = y0-j1+g2
x2 = x0-1+2*g2
y2 = y0-1+2*g2
ii = math.floor(i%256)
jj = math.floor(j%256)
t0 = 0.5 - (x0*x0) - (y0*y0)
if t0<0 then
n0 = 0
else
t0 = t0*t0
n0 = t0*t0*Noise.grad2(self.perm[ii+self.perm[jj]],x0,y0)
end
t1 = 0.5 - (x1*x1) - (y1*y1)
if t1<0 then
n1 = 0
else
t1 = t1*t1
n1 = t1*t1*Noise.grad2(self.perm[ii+i1+self.perm[jj+j1]],x1,y1)
end
t2 = 0.5 - (x2*x2) - (y2*y2)
if t2<0 then
n2 = 0
else
t2 = t2*t2
n2 = t2*t2*Noise.grad2(self.perm[ii+1+self.perm[jj+1]],math.floor(x2),math.floor(y2))
end
return (40*(n0+n1+n2))
end