local is_client = game.Players.LocalPlayer if is_client then return {} end local scale = 20 -- * 10 local generation_folder = game.Workspace.Generation local function triangle(p1,p2,p3,r1,r2) -- simple function, might work? local s = 0.01 local bottom = { b1 = nil, b2 = nil, dist = 0, other = nil } local function check(point1,point2,other) local dist = (point1 - point2).Magnitude if dist > bottom.dist then bottom.b1 = point1 bottom.b2 = point2 bottom.other = other bottom.dist = dist end end check(p1,p2,p3) -- check all of the different options for bottom and get the right one? check(p1,p3,p2) check(p2,p3,p1) local view = CFrame.lookAt(bottom.b1,bottom.b2,(bottom.other-bottom.b1).Unit) local object = view:PointToObjectSpace(bottom.other) local length = object.Z local height = object.Y r1.Size = Vector3.new(0.25,height-s,-length-s) r1.CFrame = (view * CFrame.Angles(0,math.rad(180),0)) * CFrame.new(0,height/2+s/2,-length/2+s/2) r2.Size = Vector3.new(0.25,height-s,-(-bottom.dist-length)-s) r2.CFrame = view * CFrame.new(0,height/2+s/2,-(bottom.dist-length)/2+s/2) --[[if r1.Position.Y < 0 then r1.Color = Color3.new(0.764706, 0.756863, 0.478431) r1.Material = Enum.Material.Sand end if r2.Position.Y < 0 then r2.Color = Color3.new(0.764706, 0.756863, 0.478431) r2.Material = Enum.Material.Sand end]] return r1,r2 end local editable_mesh_template = Instance.new("EditableMesh") local editable_mesh_add_vertex = editable_mesh_template.AddVertex local editable_mesh_add_triangle = editable_mesh_template.AddTriangle local ta local tb local tc local function ntri(mesh,a,b,c,d) ta = editable_mesh_add_vertex(mesh,a) tb = editable_mesh_add_vertex(mesh,b) tc = editable_mesh_add_vertex(mesh,c) editable_mesh_add_triangle(mesh,ta,tb,tc) ta = editable_mesh_add_vertex(mesh,a) tb = editable_mesh_add_vertex(mesh,c) tc = editable_mesh_add_vertex(mesh,d) editable_mesh_add_triangle(mesh,ta,tb,tc) end local function part() local part = Instance.new("Part") part.Parent = generation_folder part.Anchored = true return part end local function tri(mat) local new = mat:Clone() new.Parent = generation_folder return new end local fidelity = 20 local tree = _G.Storage.Tree local mat_sand = game.Workspace:WaitForChild("SandTriangle") local mat_grass = game.Workspace:WaitForChild("GrassTriangle") local tri_union_pool = {} local function unionTable(tbl) if #tbl > 2 then local start = tbl[#tbl] table.remove(tbl,#tbl) start:UnionAsync(tbl).Parent = game.Workspace for _,item in pairs(tbl) do item:Destroy() end print("union!") end end local function chunk(sx,sy,ox,oy) --[[for i=18,2,-4 do local water = _G.Storage.Water:Clone() water.Size = Vector3.new(sx,0,sy)*scale*scale water.Position = Vector3.new(ox*sx+sx/2,-2,oy*sy+sy/2)*scale + Vector3.new(0,i,0) water.Parent = generation_folder end]] --[[local object = Instance.new("MeshPart") object.Parent = generation_folder object.Name = "MeshObject" object.Anchored = true object.Material = Enum.Material.Grass object.Color = Color3.new(0.254902, 0.403922, 0.133333) object.Size = Vector3.new(1,1,1) local edit = Instance.new("EditableMesh") edit.Parent = object edit.Name = "VertexObject" local rows = {} local last_column = nil local sumtris = {} for x=ox*sx,ox*sy+sx,fidelity do local columns = {} table.insert(rows,columns) local last_index = 1 for y=oy*sy,oy*sy+sy,fidelity do local biome = math.clamp(math.noise(x/1000,y/1000,-6.432),0,1)*50 local island = math.clamp(math.noise(x/200,y/200,-2.132)-0.3,0,1)*30 local height = math.noise(x/10,y/10,0.123) + math.clamp(math.noise(x/50,y/50,0.123),0.2,1)*3 - (0.2-math.clamp(math.abs(math.noise(x/50,y/50,5.213)),0,0.2))*10 + island - 8 + biome table.insert(columns,Vector3.new(x,height*2,y)) if last_column and last_index > 1 and height > -5 then local mat = mat_grass local current = columns[last_index]*scale local left = columns[last_index-1]*scale local up_left = last_column[last_index-1]*scale local up = last_column[last_index]*scale --ntri(edit,current,up,up_left,left) local t1,t2 = triangle(current,up,up_left,tri(mat),tri(mat)) local t3,t4 = triangle(current,left,up_left,tri(mat),tri(mat)) table.insert(sumtris,t1) table.insert(sumtris,t2) table.insert(sumtris,t3) table.insert(sumtris,t4) end last_index = last_index + 1 end last_column = columns end task.delay(0,function()unionTable(sumtris)end)]] end for x=-6,6 do for y=-6,6 do wait() chunk(100,100,x,y) end end return {}