Very old thing that I forgot to commit.
[rocks.git] / depositgen / pipes.lua
blobd9c9db9be6ee92acc9653f535b98344d6f338541
1 -- experimental pipe generator
2 local l=depositgen.l
3 local print=l.print
5 -- the public table of registered pipes
6 depositgen.pipes={}
7 local regs=depositgen.pipes
9 depositgen.register_pipe= function(descr)
10 local pipe={
11 ymin=(descr.ymin or -10000),
12 ymax=(descr.ymax or 200),
13 scarcity=descr.scarcity,
14 width=descr.width-1,
15 content={ name=descr.content },
16 scatter={}
18 table.insert(depositgen.l.ToResolve,pipe.content)
19 for _,sc in pairs(descr.scatter) do
20 local psc={
21 scarcity=sc.scarcity,
22 size=(sc.size or pipe.width),
23 density=sc.density,
24 content={ name=sc.content }
26 table.insert(depositgen.l.ToResolve,psc.content)
27 table.insert(pipe.scatter,psc)
28 end
29 return table.insert(regs,pipe)
30 end
33 local sample_pipe_def={
34 ymin=-200, ymax=-6,
35 scarcity=80,
36 width=4,
37 content="default:glass",
38 scatter={
39 { scarcity=7, density=4, content="default:mese", size=2 }
42 --depositgen.register_pipe(sample_pipe_def)
43 end
45 depositgen.l.ToResolve.air={name="air"}
47 local function generate(mgc)
48 local t1 = os.clock()
50 local data = mgc.data
51 local area = mgc.area
52 local pr=mgc.pr
53 local minp,maxp=mgc.minp,mgc.maxp
54 local chunksizer = maxp.x - minp.x + 1
55 local chunksize = chunksizer + 1
56 local pmapsize = {x = chunksize, y = chunksize, z = chunksize}
57 local minpxz = {x = minp.x, y = minp.z}
59 for _,descr in pairs(regs) do
60 local numpipes_raw=(chunksize/descr.scarcity)
61 local numpipes = math.floor(numpipes_raw + (pr:next(0,99)/100))
63 for vc=1, numpipes do
64 local pointA=l.rndvector(mgc)
65 local pointB=l.rndvector(mgc)
66 local pointC=l.rndvector(mgc)
67 local step=(1.8)/(vector.distance(pointA,pointB)+vector.distance(pointB,pointC))
69 for t=0, 1, step do
70 local p=vector.multiply(pointA,(1-t)^2)
71 local di
72 p=vector.add(p, vector.multiply(pointB,2*t*(1-t)) )
73 p=vector.add(p, vector.multiply(pointC,t*t) )
74 p=vector.round(p)
75 local radiusp=math.floor(descr.width/2)
76 local radiusn=-descr.width+radiusp
77 --<scatter>
78 for _,ore in pairs(descr.scatter) do
79 if pr:next(0,ore.scarcity)==0 then
80 local ocx=pr:next(radiusn,radiusp)
81 local ocy=pr:next(radiusn,radiusp)
82 local ocz=pr:next(radiusn,radiusp)
83 for y=ocy-ore.size, ocy+ore.size do
84 for x=ocx-ore.size, ocx+ore.size do
85 for z=ocz-ore.size, ocz+ore.size do
86 if pr:next(0,ore.density)==0 then
87 di=area:index(p.x+x,p.y+y,p.z+z)
88 if data[di]==depositgen.l.ToResolve.air.id then
89 data[di]=ore.content.id
90 end
91 end
92 end end end
93 end
94 end
95 --</scatter>
96 --<brush>
97 for y= radiusn, radiusp do
98 for x= radiusn, radiusp do
99 for z= radiusn, radiusp do
100 di=area:index(p.x+x,p.y+y,p.z+z)
101 if data[di]==depositgen.l.ToResolve.air.id then
102 data[di]=descr.content.id
104 end end end
105 --</brush>
106 --brush(data,area,p,descr.radius,content,descr.scatter,orepr)
110 end --</apipe>
112 l.print("pipes "..math.ceil((os.clock() - t1) * 1000).." ms ")
115 table.insert(depositgen.l.OnGenerate,generate)