From d01049f0d0a2c60d043db617fc20884a324b2797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?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 | 116 ++++++++++++++++++++++--------------------- 2 files changed, 67 insertions(+), 64 deletions(-) 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 index 5de829b..5c1f333 100644 --- a/depositgen/pipes.lua +++ b/depositgen/pipes.lua @@ -1,4 +1,6 @@ -- experimental pipe generator +local l=depositgen.l +local print=l.print -- the public table of registered pipes depositgen.pipes={} @@ -9,7 +11,7 @@ depositgen.register_pipe= function(descr) ymin=(descr.ymin or -10000), ymax=(descr.ymax or 200), scarcity=descr.scarcity, - radius=descr.radius, + width=descr.width-1, content={ name=descr.content }, scatter={} } @@ -17,7 +19,7 @@ depositgen.register_pipe= function(descr) for _,sc in pairs(descr.scatter) do local psc={ scarcity=sc.scarcity, - size=(sc.size or pipe.radius), + size=(sc.size or pipe.width), density=sc.density, content={ name=sc.content } } @@ -30,77 +32,77 @@ end depositgen.register_pipe({ ymin=-200, ymax=-6, scarcity=80, - radius=3, + width=1, content="default:wood", scatter={ - { scarcity=7, density=4, content="default:mese" } + { scarcity=7, density=4, content="default:mese", size=1 } } }) -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 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} - - 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 _,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) - 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) + 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 + + end -- vm:set_data(data) - minetest.log("action", "rocks/genpipe/ "..math.ceil((os.clock() - t1) * 1000).." ms ") + l.print("pipes "..math.ceil((os.clock() - t1) * 1000).." ms ") end table.insert(depositgen.l.OnGenerate,generate)