-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslimerand.lua
92 lines (89 loc) · 3.8 KB
/
slimerand.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
-- version 1.0.1, source: https://github.com/Litttlefish/teardown_slimeutils
-- please do not rename slimerand.lua, thanks.
--init {
math.randomseed(tonumber(tostring(newproxy(false)):sub(19, -2), 16))
local random = math.random
local samples, cbrs = {}, {} -- pre-calculated data
for i = 128, 1, -1 do
local r = random()
samples[i], cbrs[i] = (r ^ 0.135 - (1 - r) ^ 0.135) / 0.1975, r ^ (1 / 3) -- fast standard normal distribution
end
--}
local function fast_std_norm_distr()
local r = random()
return (r ^ 0.135 - (1 - r) ^ 0.135) / 0.1975
end
Fastrnd = {
Sphere = {
UnitVec = function()
return VecNormalize({samples[random(128)], samples[random(128)], samples[random(128)]})
end,
RangedVec = function(r)
return VecScale(VecNormalize({samples[random(128)], samples[random(128)], samples[random(128)]}), r)
end
},
Ball = {
UnitVec = function()
return VecScale(VecNormalize({samples[random(128)], samples[random(128)], samples[random(128)]}), cbrs[random(128)])
end,
RangedVec = function(r)
return VecScale(VecNormalize({samples[random(128)], samples[random(128)], samples[random(128)]}), cbrs[random(128)] * r)
end
},
ConcBall = {
UnitVec = function()
return VecScale(VecNormalize({samples[random(128)], samples[random(128)], samples[random(128)]}), random())
end,
RangedVec = function (r)
return VecScale(VecNormalize({samples[random(128)], samples[random(128)], samples[random(128)]}), random() * r)
end
},
Quat={
Raw = function()
return Quat(samples[random(128)], samples[random(128)], samples[random(128)], samples[random(128)]) -- the game will normalize it automatically so no worries!
end,
AxisAngle = function(d)
return QuatAxisAngle({samples[random(128)], samples[random(128)], samples[random(128)]}, d)
end,
RangedAxisAngle = function(d)
return QuatAxisAngle({samples[random(128)], samples[random(128)], samples[random(128)]}, random() * d)
end
}
}
Truernd={
Sphere = {
UnitVec = function()
return VecNormalize({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()})
end,
RangedVec = function(r)
return VecScale(VecNormalize({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()}), r)
end
},
Ball = {
UnitVec = function()
return VecScale(VecNormalize({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()}), random() ^ (1 / 3))
end,
RangedVec = function (r)
return VecScale(VecNormalize({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()}), random() ^ (1 / 3) * r)
end
},
ConcBall = {
UnitVec = function()
return VecScale(VecNormalize({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()}), random())
end,
RangedVec = function (r)
return VecScale(VecNormalize({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()}), random() * r)
end
},
Quat={
Raw = function()
return Quat(fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()) -- the game will normalize it automatically so no worries!
end,
AxisAngle = function(d)
return QuatAxisAngle({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()}, d)
end,
RangedAxisAngle = function(d)
return QuatAxisAngle({fast_std_norm_distr(), fast_std_norm_distr(), fast_std_norm_distr()}, random() * d)
end
}
}