1 -- experimental fast vein generator
6 -- the public table of registered veins
8 local regs
=depositgen
.veins
10 depositgen
.register_vein
= function(descr
)
12 ymin
=(descr
.ymin
or -10000),
13 ymax
=(descr
.ymax
or 200),
14 scarcity
=descr
.scarcity
,
15 content
={ name
=descr
.content
},
18 table.insert(depositgen
.l
.ToResolve
,vein
.content
)
19 for _
,sc
in pairs(descr
.scatter
) do
22 size
=(sc
.size
or vein
.width
),
24 content
={ name
=sc
.content
}
26 table.insert(depositgen
.l
.ToResolve
,psc
.content
)
27 table.insert(vein
.scatter
,psc
)
29 return table.insert(regs
,vein
)
33 local sample_vein_def
={
36 content
="default:dirt",
38 --{ scarcity=7, density=4, content="default:mese", size=2 }
41 depositgen
.register_vein(sample_vein_def
)
44 rocksl
.genvein
=function(minp
,maxp
,pr
,vm
,area
)
46 local data
= vm
:get_data()
48 local chunksizer
= maxp
.x
- minp
.x
+ 1
49 local chunksize
= chunksizer
+ 1
50 local pmapsize
= {x
= chunksize
, y
= chunksize
, z
= chunksize
}
51 local minpxz
= {x
= minp
.x
, y
= minp
.z
}
52 local c_sample
=minetest
.get_content_id("default:stone")
53 local c_sample_ore
=minetest
.get_content_id("default:mese")
56 local A
=vector
.new(pr
:next(0,chunksizer
)+minp
.x
,pr
:next(0,chunksizer
)+minp
.y
,pr
:next(0,chunksizer
)+minp
.z
)
57 local B
=vector
.new(pr
:next(0,chunksizer
)+minp
.x
,pr
:next(0,chunksizer
)+minp
.y
,pr
:next(0,chunksizer
)+minp
.z
)
58 local C
=vector
.new(pr
:next(0,chunksizer
)+minp
.x
,pr
:next(0,chunksizer
)+minp
.y
,pr
:next(0,chunksizer
)+minp
.z
)
59 local D
=vector
.new(pr
:next(0,chunksizer
)+minp
.x
,pr
:next(0,chunksizer
)+minp
.y
,pr
:next(0,chunksizer
)+minp
.z
)
60 local l1
=vector
.distance(A
,C
)+vector
.distance(C
,B
)
61 local l2
=vector
.distance(A
,D
)+vector
.distance(D
,B
)
62 local step
=1.4/math
.max(l1
,l2
)
63 print("step="..step
.." l1="..l1
.." l2="..l2
)
65 local ocn
=pr
:next(0,scarcity
)+(scarcity
/2)
67 local P
=vector
.multiply(A
,(1-t
)^
2)
68 P
=vector
.add(P
, vector
.multiply(B
,t
*t
) )
69 local Q
=vector
.add(P
, vector
.multiply(D
,2*t
*(1-t
)) )
70 P
=vector
.add(P
, vector
.multiply(C
,2*t
*(1-t
)) )
71 local step2
=1/vector
.distance(P
,Q
)
73 local R
=vector
.add(vector
.multiply(P
,(1-u
)), vector
.multiply(Q
,u
) )
74 local di
=area
:indexp(vector
.round(R
))
77 ocn
=pr
:next(0,scarcity
)+(scarcity
/2)
86 minetest
.log("action", "rocks/genvein/ "..math
.ceil((os
.clock() - t1
) * 1000).." ms ")