From d01049f0d0a2c60d043db617fc20884a324b2797 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Tom=C3=A1=C5=A1=20Brada?= Date: Thu, 2 Jul 2015 15:47:17 +0200 Subject: [PATCH] Pipe beush and scatter. --- depositgen/init.lua | 15 ++-- depositgen/pipes.lua | 214 ++++++++++++++++++++++++++------------------------- 2 files changed, 116 insertions(+), 113 deletions(-) rewrite depositgen/pipes.lua (66%) diff --git a/depositgen/init.lua b/depositgen/init.lua index 2ec6e26..30ab51f 100644 --- a/depositgen/init.lua +++ b/depositgen/init.lua @@ -3,7 +3,7 @@ local l={} depositgen.l=l l.print=function(text) - minetest.log("info","[depositgen] "..text) + minetest.log("action","[depositgen] "..text) end l.print("mod initializing") @@ -15,15 +15,16 @@ l.OnInit={} l.ToResolve={} local includes={ -"pipes","veins" +"pipes" --,"veins" } minetest.register_on_generated(function(minp,maxp,seed) + l.print("on generated") local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} local pr=PseudoRandom(seed) - for i=0, #l.OnGenerate do - l.OnGenerate[i](minp,maxp,seed,vm,area) + for i=1, #l.OnGenerate do + l.OnGenerate[i](minp,maxp,pr,vm,area) end vm:write_to_map() end) @@ -33,9 +34,9 @@ minetest.register_on_mapgen_init(function(mapgen_params) -- todo: sort layers --Resolve all mapgen nodes to content ids l.print("Resolving node names") - for _,i in pairs(l.ToResolve) do - i.id=minetest.get_content_id(i.node) - i.node=nil --free some memory + for index,i in pairs(l.ToResolve) do + i.id=minetest.get_content_id(i.name) + i.name=nil --free some memory end l.print("running mapgen initialization tasks") for _,i in pairs(l.OnInit) do diff --git a/depositgen/pipes.lua b/depositgen/pipes.lua dissimilarity index 66% index 5de829b..5c1f333 100644 --- a/depositgen/pipes.lua +++ b/depositgen/pipes.lua @@ -1,106 +1,108 @@ --- experimental pipe generator - --- the public table of registered pipes -depositgen.pipes={} -local regs=depositgen.pipes - -depositgen.register_pipe= function(descr) - local pipe={ - ymin=(descr.ymin or -10000), - ymax=(descr.ymax or 200), - scarcity=descr.scarcity, - radius=descr.radius, - content={ name=descr.content }, - scatter={} - } - table.insert(depositgen.l.ToResolve,pipe.content) - for _,sc in pairs(descr.scatter) do - local psc={ - scarcity=sc.scarcity, - size=(sc.size or pipe.radius), - density=sc.density, - content={ name=sc.content } - } - table.insert(depositgen.l.ToResolve,psc.content) - table.insert(pipe.scatter,psc) - end - return table.insert(regs,pipe) -end - -depositgen.register_pipe({ - ymin=-200, ymax=-6, - scarcity=80, - radius=3, - content="default:wood", - scatter={ - { scarcity=7, density=4, content="default:mese" } - } -}) - -local function brush(data,area,pos,radius,content,ores,pr) - local rsq=radius^2 - local orect - local oresc - radius=radius+2 - for _,ore in pairs(ores) do - if pr:next(0,ore.scarcity)==0 then - orect=ore.c_ore - oresc=ore.density - end - end - for x=-radius, radius do - for y=-radius, radius do - for z=-radius, radius do - if (x^2)+(y^2)+(z^2)<=rsq then - local di=area:index(x+pos.x,y+pos.y,z+pos.z) - if oresc and (pr:next(0,oresc)==0) then - data[di]=orect - else - data[di]=content - end - end - end end end -end - -local function generate(minp,maxp,pr,vm,area,descr) - local t1 = os.clock() - local data = vm:get_data() - - local chunksizer = maxp.x - minp.x + 1 - local chunksize = chunksizer + 1 - local pmapsize = {x = chunksize, y = chunksize, z = chunksize} - local minpxz = {x = minp.x, y = minp.z} - - local bedrocks={} - for _,node in pairs(descr.bedrock) do bedrocks[minetest.get_content_id(node)]=true end - local startrocks={} - for _,node in pairs(descr.startrock) do startrocks[minetest.get_content_id(node)]=true end - local content=minetest.get_content_id(descr.content) - for _,des in pairs(descr.scatter) do - des.c_ore=minetest.get_content_id(des.ore) - end - local orepr=PseudoRandom(pr:next()) - - local numpipes_raw=(chunksize/descr.scarcity) - local numpipes = math.floor(numpipes_raw + (pr:next(0,99)/100)) - - for vc=1, numpipes do - local pointA=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z) - if (#startrocks>0)and(startrocks[data[area:indexp(pointA)]]==nil) then break end - local pointB=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z) - local pointC=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z) - local step=(1.8*descr.radius)/(vector.distance(pointA,pointB)+vector.distance(pointB,pointC)) - for t=0, 1, step do - local p=vector.multiply(pointA,(1-t)^2) - p=vector.add(p, vector.multiply(pointB,2*t*(1-t)) ) - p=vector.add(p, vector.multiply(pointC,t*t) ) - p=vector.round(p) - brush(data,area,p,descr.radius,content,descr.scatter,orepr) - end - end - - vm:set_data(data) - minetest.log("action", "rocks/genpipe/ "..math.ceil((os.clock() - t1) * 1000).." ms ") -end - -table.insert(depositgen.l.OnGenerate,generate) +-- experimental pipe generator +local l=depositgen.l +local print=l.print + +-- the public table of registered pipes +depositgen.pipes={} +local regs=depositgen.pipes + +depositgen.register_pipe= function(descr) + local pipe={ + ymin=(descr.ymin or -10000), + ymax=(descr.ymax or 200), + scarcity=descr.scarcity, + width=descr.width-1, + content={ name=descr.content }, + scatter={} + } + table.insert(depositgen.l.ToResolve,pipe.content) + for _,sc in pairs(descr.scatter) do + local psc={ + scarcity=sc.scarcity, + size=(sc.size or pipe.width), + density=sc.density, + content={ name=sc.content } + } + table.insert(depositgen.l.ToResolve,psc.content) + table.insert(pipe.scatter,psc) + end + return table.insert(regs,pipe) +end + +depositgen.register_pipe({ + ymin=-200, ymax=-6, + scarcity=80, + width=1, + content="default:wood", + scatter={ + { scarcity=7, density=4, content="default:mese", size=1 } + } +}) + +local function generate(minp,maxp,pr,vm,area) + local t1 = os.clock() + + print("pipes on generate") + local data = vm:get_data() + local chunksizer = maxp.x - minp.x + 1 + local chunksize = chunksizer + 1 + local pmapsize = {x = chunksize, y = chunksize, z = chunksize} + local minpxz = {x = minp.x, y = minp.z} + + for _,descr in pairs(regs) do + l.print(dump(descr)) + --local orepr=PseudoRandom(pr:next()) + local numpipes_raw=(chunksize/descr.scarcity) + local numpipes = math.floor(numpipes_raw + (pr:next(0,99)/100)) + + for vc=1, numpipes do + local pointA=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z) + local pointB=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z) + local pointC=vector.new(pr:next(0,chunksizer)+minp.x,pr:next(0,chunksizer)+minp.y,pr:next(0,chunksizer)+minp.z) + local step=(1.8)/(vector.distance(pointA,pointB)+vector.distance(pointB,pointC)) + + print(" "..dump({step=step})) + for t=0, 1, step do + local p=vector.multiply(pointA,(1-t)^2) + p=vector.add(p, vector.multiply(pointB,2*t*(1-t)) ) + p=vector.add(p, vector.multiply(pointC,t*t) ) + p=vector.round(p) + local radiusp=math.floor(descr.width/2) + local radiusn=-descr.width+radiusp + -- + for _,ore in pairs(descr.scatter) do + if pr:next(0,ore.scarcity)==0 then + local ocx=pr:next(radiusn,radiusp) + local ocy=pr:next(radiusn,radiusp) + local ocz=pr:next(radiusn,radiusp) + for y=ocy-ore.size, ocy+ore.size do + for x=ocx-ore.size, ocx+ore.size do + for z=ocz-ore.size, ocz+ore.size do + if pr:next(0,ore.density)==0 then + di=area:index(p.x+x,p.y+y,p.z+z) + data[di]=ore.content.id + end + end end end + end + end + -- + -- + for y= radiusn, radiusp do + for x= radiusn, radiusp do + for z= radiusn, radiusp do + di=area:index(p.x+x,p.y+y,p.z+z) + --data[di]=descr.content.id + end end end + -- + --brush(data,area,p,descr.radius,content,descr.scatter,orepr) + end + print(" ") + end + + end -- + + vm:set_data(data) + l.print("pipes "..math.ceil((os.clock() - t1) * 1000).." ms ") +end + +table.insert(depositgen.l.OnGenerate,generate) -- 2.11.4.GIT