2014-12-29 20:16:14 +01:00
|
|
|
--
|
|
|
|
-- layer generator
|
|
|
|
--
|
|
|
|
|
|
|
|
|
|
|
|
minetest.register_on_generated(function(minp, maxp, seed)
|
2015-02-08 16:58:57 +01:00
|
|
|
stone_ctx= minetest.get_content_id("default:stone")
|
|
|
|
air_ctx= minetest.get_content_id("air")
|
2014-12-29 20:16:14 +01:00
|
|
|
local timebefore=os.clock();
|
|
|
|
local manipulator, emin, emax = minetest.get_mapgen_object("voxelmanip")
|
|
|
|
local nodes = manipulator:get_data()
|
|
|
|
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
|
2015-02-08 16:58:57 +01:00
|
|
|
local side_length = (maxp.x - minp.x) + 1
|
|
|
|
local map_lengths_xyz = {x=side_length, y=side_length, z=side_length}
|
|
|
|
|
|
|
|
-- sort out unused layers
|
|
|
|
-- generate noises
|
|
|
|
avl={}
|
|
|
|
for i,d in ipairs(rocks.layers) do
|
|
|
|
-- h je normaalna vyyska horného konca vrstvy
|
|
|
|
if (d.height+d.gain)>=minp.y then -- ak je to mimo zdola tak ju vyhodime
|
|
|
|
-- urobime sum pre vrstvu
|
|
|
|
local np=rocks.noiseparams_layers
|
|
|
|
np.seed=d.seed
|
|
|
|
np.scale=d.gain
|
|
|
|
np.offset=d.height
|
|
|
|
d.nmap=minetest.get_perlin_map(np,map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z})
|
|
|
|
-- contene_id kamenov
|
|
|
|
d.rock.ctx=d.rock.ctx or minetest.get_content_id(d.rock.node)
|
|
|
|
table.insert(avl,d) -- pridame ju
|
|
|
|
if (d.height-d.gain)>maxp.y then break end -- ak je mimo zhora tak uz dalsie nehladaj
|
|
|
|
else
|
|
|
|
print(" no higher "..d.height.." than "..minp.y)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2014-12-29 20:16:14 +01:00
|
|
|
--
|
2015-02-08 16:58:57 +01:00
|
|
|
print("[rocks] afterinit "..os.clock()-timebefore.." #layers="..#avl)
|
|
|
|
for lh,ld in ipairs(avl) do
|
|
|
|
print(" "..lh.."->"..ld.name)
|
|
|
|
end
|
|
|
|
|
|
|
|
local noise2d_ix = 1
|
|
|
|
local noise3d_ix = 1
|
|
|
|
|
2014-12-29 20:16:14 +01:00
|
|
|
for x=minp.x,maxp.x,1 do
|
|
|
|
for z=minp.z,maxp.z,1 do
|
2015-02-08 16:58:57 +01:00
|
|
|
for y=minp.y,maxp.y,1 do
|
2014-12-29 21:47:55 +01:00
|
|
|
local p_pos = area:index(x, y, z)
|
2015-02-08 16:58:57 +01:00
|
|
|
local layer,rock
|
2014-12-29 21:47:55 +01:00
|
|
|
|
2014-12-29 20:16:14 +01:00
|
|
|
--* select layer
|
2015-02-08 16:58:57 +01:00
|
|
|
for lh,ld in ipairs(avl) do
|
|
|
|
if y<ld.nmap[noise2d_ix] then
|
2014-12-29 20:16:14 +01:00
|
|
|
layer=ld
|
2015-02-08 16:58:57 +01:00
|
|
|
rock=layer.rock
|
|
|
|
break
|
2014-12-29 20:16:14 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
--* place rocks
|
2014-12-29 21:47:55 +01:00
|
|
|
if (rock) and(nodes[p_pos]==stone_ctx) then
|
2014-12-29 20:16:14 +01:00
|
|
|
nodes[p_pos] = rock.ctx
|
|
|
|
end
|
2014-12-29 21:47:55 +01:00
|
|
|
|
2015-02-08 16:58:57 +01:00
|
|
|
noise3d_ix =noise3d_ix+1
|
|
|
|
end
|
|
|
|
noise2d_ix = noise2d_ix+1
|
2014-12-29 20:16:14 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
manipulator:set_data(nodes)
|
2015-02-08 16:58:57 +01:00
|
|
|
manipulator:calc_lighting()
|
|
|
|
manipulator:update_liquids()
|
2014-12-29 20:16:14 +01:00
|
|
|
manipulator:write_to_map()
|
|
|
|
print("[rocks] gen "..os.clock()-timebefore)
|
|
|
|
end)
|
2015-01-10 16:05:32 +01:00
|
|
|
|