106 lines
3 KiB
Text
106 lines
3 KiB
Text
v = 0.55
|
|
X = vector.new(0,-0.92836897,0.28899258)
|
|
Y = vector.new(-0.94538565,0.06753674,0.21695717)
|
|
Z = vector.new(0.23369713,0.28899258,0.92836897)
|
|
r1 = 40
|
|
r2 = 10
|
|
a = {1,-2,3,1,0,-1,-1,2,0,0}
|
|
b = {-1.2314479651658854,-1.5872747213793104,0.04683103835434217,1.9674748180974897,1.153043896136355,-0.10238369338887907,1.7042206782594087,-1.242120063575402,0.5603127510670854,2.66234724349466}
|
|
c = {4.321312860949716,2.116116100402904,2.7194094703705165,3.0821962706516177,5.994638109825947,0.8990716738267982,0.06271719387139103,0.7355961093238955,2.1949825399445198,5.522266625688897}
|
|
l = vector.new(0.57735027,0.57735027,0.57735027)
|
|
function surface(uv)
|
|
--print("surface")
|
|
total = 0
|
|
for i = 1,#a do
|
|
total = total + math.sin(a[i]*uv.x+math.floor(.5+b[i])*uv.y+c[i])
|
|
end
|
|
return math.pow(math.mod(total,2)-1,2)
|
|
end
|
|
function map(xyz)
|
|
--print("map")
|
|
local u = math.atan2(
|
|
xyz:dot(X),xyz:dot(Y)
|
|
)
|
|
local v = math.atan2(
|
|
xyz:dot(Z:normalize()),
|
|
math.sqrt(
|
|
xyz:dot(X)^2+xyz:dot(X)^2
|
|
)
|
|
-r1
|
|
)
|
|
return vector.new(u,v)
|
|
end
|
|
function lerp(x,y,t)
|
|
--print("lerp")
|
|
return x - (x-y)*t
|
|
end
|
|
function project(x,y)
|
|
--print("project x:",x," y:",y)
|
|
return x-(
|
|
y*(
|
|
(
|
|
x:dot(
|
|
y
|
|
)
|
|
)/(
|
|
y:dot(
|
|
y
|
|
)
|
|
)
|
|
)
|
|
)
|
|
end
|
|
function setmag(x,y)
|
|
--print("setmag")
|
|
return x:normalize()*y
|
|
end
|
|
function f(x,y,z)
|
|
--print("f")
|
|
xyz = vector.new(x,y,z)
|
|
dist = (xyz-setmag(project(xyz,Z),r1)):length()-r2
|
|
detail = lerp(5*surface(map(xyz)),r1,v)
|
|
return dist-detail
|
|
end
|
|
function blockat(x,y,z)
|
|
--print("blockat")
|
|
if f(x,y,z) < 0 then
|
|
flag = false
|
|
for k,v in pairs({
|
|
{1,0,0},
|
|
{0,1,0},
|
|
{0,0,1},
|
|
{-1,0,0},
|
|
{0,-1,0},
|
|
{0,0,-1}
|
|
})do
|
|
flag = f(x+v[1],y+v[2],z+v[3])>0 or flag
|
|
end
|
|
if flag then
|
|
dx = f(x+0.1,y,z)-f(x-0.1,y,z)
|
|
dy = f(x,y+0.1,z)-f(x,y-0.1,z)
|
|
dz = f(x,y,z+0.1)-f(x,y,z-0.1)
|
|
normal = vector.new(dx,dy,dz):normalize()
|
|
if normal:dot(vector.new(0,0,1)) > 0.5 then
|
|
return true, "minecraft:moss_block"
|
|
end
|
|
dot = normal:dot(l)
|
|
lighttable = {
|
|
{-.7,"minecraft:cobbled_deepslate"},
|
|
{-.5,"minecraft:andesite"},
|
|
{-.3,"minecraft:tuff"},
|
|
{0,"minecraft:cobblestone"},
|
|
{.5,"minecraft:diorite"},
|
|
{.7,"create:cut_limestone"},
|
|
{2,"minecraft:calcite"}
|
|
}
|
|
for i,v in ipairs(lighttable) do
|
|
if dot < v[1] then
|
|
return true, v[2]
|
|
end
|
|
end
|
|
end
|
|
end
|
|
-- print(x,y,z,"is not part of the set")
|
|
return false
|
|
end
|
|
return {blockat = blockat}
|