-
Notifications
You must be signed in to change notification settings - Fork 2
/
3d.lua
129 lines (115 loc) · 3.46 KB
/
3d.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
local math = require 'ext.math'
local result
local bit = bit or bit32
if not bit then
result, bit = pcall(require, 'bit32')
end
if not bit then
result, bit = pcall(require, 'bit')
end
local function simplexDot(fp,x,y,z) -- assumes a ctype array
return fp[1] * x + fp[2] * y + fp[3] * z
end
local grad3 = {
{1,1,0},{-1,1,0},{1,-1,0},{-1,-1,0},
{1,0,1},{-1,0,1},{1,0,-1},{-1,0,-1},
{0,1,1},{0,-1,1},{0,1,-1},{0,-1,-1}
}
local p = {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}
local perm = {}
for i=0,511 do
perm[i+1] = assert(p[bit.band(i,255) + 1])
end
local function simplexNoise(xin,yin,zin)
local s = (xin + yin + zin) * (1 / 3)
local i = math.trunc(xin + s)
local j = math.trunc(yin + s)
local k = math.trunc(zin + s)
local t = (i + j + k) * (1/6)
local X0 = i-t
local Y0 = j-t
local Z0 = k-t
local x0 = xin - X0
local y0 = yin - Y0
local z0 = zin - Z0
local i1,j1,k1,i2,j2,k2
if x0 >= y0 then
if y0 >= z0 then
i1 = 1 j1 = 0 k1 = 0 i2 = 1 j2 = 1 k2 = 0 --XYZ
elseif x0 >= z0 then
i1 = 1 j1 = 0 k1 = 0 i2 = 1 j2 = 0 k2 = 1 --XZY
else
i1 = 0 j1 = 0 k1 = 1 i2 = 1 j2 = 0 k2 = 1 --ZXY
end
else
if y0 < z0 then
i1 = 0 j1 = 0 k1 = 1 i2 = 0 j2 = 1 k2 = 1 --ZYX
elseif x0 < z0 then
i1 = 0 j1 = 1 k1 = 0 i2 = 0 j2 = 1 k2 = 1 --YZX
else
i1 = 0 j1 = 1 k1 = 0 i2 = 1 j2 = 1 k2 = 0 --YXZ
end
end
local x1 = x0 - i1 + (1/6)
local y1 = y0 - j1 + (1/6)
local z1 = z0 - k1 + (1/6)
local x2 = x0 - i2 + (1/3)
local y2 = y0 - j2 + (1/3)
local z2 = z0 - k2 + (1/3)
local x3 = x0 - (1/2)
local y3 = y0 - (1/2)
local z3 = z0 - (1/2)
local ii = bit.band(i,255)
local jj = bit.band(j,255)
local kk = bit.band(k,255)
local gi0 = perm[ii + perm[jj + perm[kk+1]+1]+1] % 12
local gi1 = perm[ii + i1 + perm[jj + j1 + perm[kk + k1+1]+1]+1] % 12
local gi2 = perm[ii + i2 + perm[jj + j2 + perm[kk + k2+1]+1]+1] % 12
local gi3 = perm[ii + 1 + perm[jj + 1 + perm[kk + 1+1]+1]+1] % 12
local t0 = .6 - x0*x0 - y0*y0 - z0*z0
local n0
if t0 < 0 then
n0 = 0
else
t0 = t0 * t0
n0 = t0 * t0 * simplexDot(grad3[gi0+1], x0,y0,z0)
end
local t1 = .6 - x1*x1 - y1*y1 - z1*z1
local n1
if t1 < 0 then
n1 = 0
else
t1 = t1 * t1
n1 = t1 * t1 * simplexDot(grad3[gi1+1], x1, y1, z1)
end
local t2 = .6 - x2*x2 - y2*y2 - z2*z2
local n2
if t2 < 0 then
n2 = 0
else
t2 = t2 * t2
n2 = t2 * t2 * simplexDot(grad3[gi2+1], x2, y2, z2)
end
local t3 = .6 - x3*x3 - y3*y3 - z3*z3
local n3
if t3 < 0 then
n3 = 0
else
t3 = t3 * t3
n3 = t3 * t3 * simplexDot(grad3[gi3+1], x3, y3, z3)
end
return 32 * (n0 + n1 + n2 + n3)
end
return simplexNoise