Minetest-WorldEditAdditions/worldeditadditions/lib/noise/noise2d.lua

57 lines
2.1 KiB
Lua
Raw Normal View History

--- Applies a layer of 2D noise over the terrain in the defined region.
-- @module worldeditadditions.noise2d
local wea = worldeditadditions
-- ███ ██ ██████ ██ ███████ ███████ ██████ ██████
-- ████ ██ ██ ██ ██ ██ ██ ██ ██ ██
-- ██ ██ ██ ██ ██ ██ ███████ █████ █████ ██ ██
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-- ██ ████ ██████ ██ ███████ ███████ ███████ ██████
--- Applies a layer of 2d noise over the terrain in the defined region.
-- @param pos1 Vector pos1 of the defined region
-- @param pos2 Vector pos2 of the defined region
-- @param noise_params table A noise parameters table. Will be passed unmodified to PerlinNoise() from the Minetest API.
function worldeditadditions.noise.noise2d(pos1, pos2, noise_params)
pos1, pos2 = worldedit.sort_pos(pos1, pos2)
local region_height = pos1.y - pos2.y
-- pos2 will always have the highest co-ordinates now
-- Fill in the default params
noise_params = worldeditadditions.noise.params_apply_default(noise_params)
-- Fetch the nodes in the specified area
local manip, area = worldedit.manip_helpers.init(pos1, pos2)
local data = manip:get_data()
local heightmap_old, heightmap_size = worldeditadditions.make_heightmap(
pos1, pos2,
manip, area,
data
)
local heightmap_new = worldeditadditions.table.shallowcopy(heightmap_old)
local noisemap = wea.noise.make_2d(noise_params, heightmap_size)
wea.noise.apply_2d(
heightmap_new,
noisemap,
heightmap_size,
region_height,
noise_params.apply
)
local success, stats = wea.apply_heightmap_changes(
pos1, pos2,
area, data,
heightmap_old, heightmap_new,
heightmap_size
)
if not success then return success, stats end
-- Save the modified nodes back to disk & return
worldedit.manip_helpers.finish(manip, data)
return true, stats
end