79 lines
2.0 KiB
Plaintext
79 lines
2.0 KiB
Plaintext
local module = {}
|
|
|
|
local function new(name,tab)
|
|
local instance = Instance.new(name)
|
|
for index,item in pairs(tab) do
|
|
instance[index] = item
|
|
end
|
|
return instance
|
|
end
|
|
|
|
local function block(cframe,size)
|
|
return new("Part",{
|
|
Material = Enum.Material.WoodPlanks,
|
|
Color = Color3.new(0.301961, 0.14902, 0.0588235),
|
|
Anchored = true,
|
|
CFrame = cframe + Vector3.new(0,size.Y/2,0),
|
|
Size = size,
|
|
Transparency = 0.5,
|
|
Parent = workspace
|
|
})
|
|
end
|
|
|
|
local function mark(position)
|
|
return block(CFrame.new(position),Vector3.one * 128)
|
|
end
|
|
|
|
local function r(v)
|
|
return math.noise(v.X*0.379,v.Y*0.379,v.Z*0.379) + 1
|
|
end
|
|
|
|
local px = Vector3.xAxis
|
|
local py = Vector3.xAxis
|
|
local pz = Vector3.xAxis
|
|
|
|
module.main = function(ox,oy,oz,noise)
|
|
local n = function(v) return noise(v.X,v.Y,v.Z) end
|
|
local o = Vector3.new(ox,oy,oz)
|
|
|
|
--[[
|
|
origin: where the wall starts
|
|
direction: where the wall faces
|
|
magnitude: the size of the wall
|
|
depth: the current depth of the wall
|
|
]]
|
|
local walls = {}
|
|
local function hit(origin,direction,magnitude,depth)
|
|
|
|
end
|
|
local function wall(origin,direction,magnitude)
|
|
|
|
end
|
|
local function project(origin,direction,magnitude)
|
|
local depth = 0
|
|
for i = 1,4 do
|
|
depth += magnitude * 0.5
|
|
local probe = origin + direction * depth
|
|
if n(probe) > 0.05 then continue end
|
|
if hit(origin,direction,magnitude,depth) then continue end
|
|
mark(origin + direction * depth)
|
|
end
|
|
if depth == 0 then return nil
|
|
else return depth end
|
|
end
|
|
|
|
local function extrude(origin,look,width,height)
|
|
local depth = project(origin,look,width)
|
|
if not depth then return end
|
|
return block(CFrame.lookAlong(origin - look * depth * 0.5,look),Vector3.new(width,height,depth))
|
|
end
|
|
|
|
local no = n(o)
|
|
local norm = Vector3.new(no - n(o + Vector3.xAxis),no - n(o + Vector3.yAxis),no - n(o + Vector3.zAxis)).Unit
|
|
local flat = Vector3.new(norm.X,0,norm.Z).Unit;
|
|
mark(o).CFrame = CFrame.lookAlong(o,norm)
|
|
o = o + project(o,-norm,64) * -norm or o
|
|
extrude(o,flat,r(o+px)*256,r(o+py)*256)
|
|
end
|
|
|
|
return module |