Demo code for 2d noise
Code: Select all
local test_noise = function( minp, maxp, seed )
-- var = new PerlinNoise(seed, octaves, persisitence)
-- or
-- minetest.env:get_perlinnoise(seed_diff, octaves, persistence)
-- it will use world seed + seed_diff as a seed value
local noise = minetest.env:get_perlinnoise(4, 8, 0.6)
local pr = PseudoRandom(seed)
local cell_size = 4
local cell_volume = cell_size * cell_size
local ore_in_cell_min = 3
local ore_in_cell_max = 8
if maxp.x < 0 or minp.x > 0 then
return
end
for j = minp.y, maxp.y do
for k = minp.z, maxp.z do
local p = { x= 0 , y= j, z = k}
minetest.env:set_node(p, {name ="default:sandstone"} )
end
end
for j = minp.y, maxp.y, cell_size do
for k = minp.z, maxp.z, cell_size do
local p2d = { x= 0.5 + j/50 , y= 0.5 + k/50 }
local noiseval = noise:get2d(p2d)
print ( dump(p2d) .. " " .. dump(noiseval))
local ore = math.floor( noiseval * ore_in_cell_max + 1)
if ore >= ore_in_cell_min then
for n = 1, ore do
local jd = pr:next(0, cell_size - 1 )
local kd = pr:next(0, cell_size - 1 )
local p = { x = 0, y = j + jd, z = k + kd }
minetest.env:set_node(p, {name ="default:mese"} )
end
end
end
end
end
minetest.register_on_generated(test_noise)
Demo code for 3D noise:
Code: Select all
local test_noise = function( minp, maxp, seed )
local noise = minetest.env:get_perlinnoise(3, 8, 0.6)
local pr = PseudoRandom(seed)
local cell_size = 16
local chunks_per_cell_min = 2
local chunks_per_cell_max = 5
local chunk_size = 3
local chunk_volume = chunk_size * chunk_size * chunk_size
local ore_per_chunk = 5
for i = minp.x, maxp.x, cell_size do
for j = minp.y, maxp.y, cell_size do
for k = minp.z, maxp.z, cell_size do
local noise_p = { x= 0.5 + i/200 , y= 0.5 + j/200, z = 0.5 + k/200 }
local noiseval = noise:get3d(noise_p)
local chunks = math.floor( noiseval * chunks_per_cell_max + 1)
-- print ( dump(noise_p) .. " " .. dump(noiseval) .. " " .. dump(chunks))
if chunks >= chunks_per_cell_min then
for n = 1, chunks do
local id = pr:next(0, cell_size - chunk_size )
local jd = pr:next(0, cell_size - chunk_size )
local kd = pr:next(0, cell_size - chunk_size )
for ci = i + id , i + id + chunk_size - 1 do
for cj = j + id, j + jd + chunk_size - 1 do
for ck = k + kd, k + kd + chunk_size -1 do
local p = { x = ci, y = cj , z = ck}
if pr:next(1, chunk_volume) < ore_per_chunk then
minetest.env:set_node(p, {name ="default:mese"} )
else
minetest.env:set_node(p, {name = "default:glass"} )
end
end
end
end
end
end
end
end
end
end
minetest.register_on_generated(test_noise)