1 -- experimental pipe generator
5 -- the public table of registered pipes
7 local regs
=depositgen
.pipes
9 depositgen
.register_pipe
= function(descr
)
11 ymin
=(descr
.ymin
or -10000),
12 ymax
=(descr
.ymax
or 200),
13 scarcity
=descr
.scarcity
,
15 content
={ name
=descr
.content
},
18 table.insert(depositgen
.l
.ToResolve
,pipe
.content
)
19 for _
,sc
in pairs(descr
.scatter
) do
22 size
=(sc
.size
or pipe
.width
),
24 content
={ name
=sc
.content
}
26 table.insert(depositgen
.l
.ToResolve
,psc
.content
)
27 table.insert(pipe
.scatter
,psc
)
29 return table.insert(regs
,pipe
)
33 local sample_pipe_def
={
37 content
="default:glass",
39 { scarcity
=7, density
=4, content
="default:mese", size
=2 }
42 --depositgen.register_pipe(sample_pipe_def)
45 depositgen
.l
.ToResolve
.air
={name
="air"}
47 local function generate(mgc
)
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))
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
))
70 local p
=vector
.multiply(pointA
,(1-t
)^
2)
72 p
=vector
.add(p
, vector
.multiply(pointB
,2*t
*(1-t
)) )
73 p
=vector
.add(p
, vector
.multiply(pointC
,t
*t
) )
75 local radiusp
=math
.floor(descr
.width
/2)
76 local radiusn
=-descr
.width
+radiusp
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
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
106 --brush(data,area,p,descr.radius,content,descr.scatter,orepr)
112 l
.print("pipes "..math
.ceil((os
.clock() - t1
) * 1000).." ms ")
115 table.insert(depositgen
.l
.OnGenerate
,generate
)