Optionally disable distorsion

by setting 'mapgen_rivers_distort = false' in minetest.conf
This commit is contained in:
Gaël de Sailly 2020-07-21 14:01:29 +02:00
parent 25c5cb2e1f
commit 103cd49d78
2 changed files with 74 additions and 46 deletions

118
init.lua
View File

@ -8,6 +8,7 @@ local blocksize = mapgen_rivers.blocksize
local sea_level = mapgen_rivers.sea_level local sea_level = mapgen_rivers.sea_level
local riverbed_slope = mapgen_rivers.riverbed_slope local riverbed_slope = mapgen_rivers.riverbed_slope
local elevation_chill = mapgen_rivers.elevation_chill local elevation_chill = mapgen_rivers.elevation_chill
local use_distort = mapgen_rivers.distort
dofile(modpath .. 'noises.lua') dofile(modpath .. 'noises.lua')
@ -48,48 +49,58 @@ local function generate(minp, maxp, seed)
y = chulens.y+1, y = chulens.y+1,
z = chulens.z, z = chulens.z,
} }
noise_x_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_x, mapsize) if use_distort then
noise_z_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_z, mapsize) noise_x_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_x, mapsize)
noise_z_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_z, mapsize)
noise_distort_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_amplitude, chulens)
end
noise_heat_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.heat, chulens) noise_heat_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.heat, chulens)
noise_heat_blend_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.heat_blend, chulens) noise_heat_blend_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.heat_blend, chulens)
noise_distort_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_amplitude, chulens)
init = true init = true
end end
local minp2d = {x=minp.x, y=minp.z} local minp2d = {x=minp.x, y=minp.z}
noise_x_obj:get_3d_map_flat(minp, noise_x_map) if use_distort then
noise_z_obj:get_3d_map_flat(minp, noise_z_map) noise_x_obj:get_3d_map_flat(minp, noise_x_map)
noise_distort_obj:get_2d_map_flat(minp2d, noise_distort_map) noise_z_obj:get_3d_map_flat(minp, noise_z_map)
noise_distort_obj:get_2d_map_flat(minp2d, noise_distort_map)
end
noise_heat_obj:get_2d_map_flat(minp2d, noise_heat_map) noise_heat_obj:get_2d_map_flat(minp2d, noise_heat_map)
noise_heat_blend_obj:get_2d_map_flat(minp2d, noise_heat_blend_map) noise_heat_blend_obj:get_2d_map_flat(minp2d, noise_heat_blend_map)
local xmin, xmax, zmin, zmax = minp.x, maxp.x, minp.z, maxp.z local terrain_map, lake_map, incr, i_origin
local i = 0
local i2d = 0
for z=minp.z, maxp.z do
for y=minp.y, maxp.y+1 do
for x=minp.x, maxp.x do
i = i+1
i2d = i2d+1
local distort = noise_distort_map[i2d]
local xv = noise_x_map[i]*distort + x
if xv < xmin then xmin = xv end
if xv > xmax then xmax = xv end
noise_x_map[i] = xv
local zv = noise_z_map[i]*distort + z
if zv < zmin then zmin = zv end
if zv > zmax then zmax = zv end
noise_z_map[i] = zv
end
i2d = i2d-chulens.x
end
end
local pminp = {x=math.floor(xmin), z=math.floor(zmin)} if use_distort then
local pmaxp = {x=math.floor(xmax)+1, z=math.floor(zmax)+1} local xmin, xmax, zmin, zmax = minp.x, maxp.x, minp.z, maxp.z
local incr = pmaxp.x-pminp.x+1 local i = 0
local i_origin = 1 - pminp.z*incr - pminp.x local i2d = 0
local terrain_map, lake_map = heightmaps(pminp, pmaxp) for z=minp.z, maxp.z do
for y=minp.y, maxp.y+1 do
for x=minp.x, maxp.x do
i = i+1
i2d = i2d+1
local distort = noise_distort_map[i2d]
local xv = noise_x_map[i]*distort + x
if xv < xmin then xmin = xv end
if xv > xmax then xmax = xv end
noise_x_map[i] = xv
local zv = noise_z_map[i]*distort + z
if zv < zmin then zmin = zv end
if zv > zmax then zmax = zv end
noise_z_map[i] = zv
end
i2d = i2d-chulens.x
end
end
local pminp = {x=math.floor(xmin), z=math.floor(zmin)}
local pmaxp = {x=math.floor(xmax)+1, z=math.floor(zmax)+1}
incr = pmaxp.x-pminp.x+1
i_origin = 1 - pminp.z*incr - pminp.x
terrain_map, lake_map = heightmaps(pminp, pmaxp)
else
terrain_map, lake_map = heightmaps(minp, maxp)
end
local c_stone = minetest.get_content_id("default:stone") local c_stone = minetest.get_content_id("default:stone")
local c_dirt = minetest.get_content_id("default:dirt") local c_dirt = minetest.get_content_id("default:dirt")
@ -119,20 +130,29 @@ local function generate(minp, maxp, seed)
local ivm = a:index(x, minp.y, z) local ivm = a:index(x, minp.y, z)
local ground_above = false local ground_above = false
local temperature = noise_heat_map[i2d]+noise_heat_blend_map[i2d] local temperature = noise_heat_map[i2d]+noise_heat_blend_map[i2d]
local terrain, lake
if not use_distort then
terrain = terrain_map[i2d]
lake = lake_map[i2d]
end
for y = maxp.y+1, minp.y, -1 do for y = maxp.y+1, minp.y, -1 do
local xn = noise_x_map[nid] if use_distort then
local zn = noise_z_map[nid] local xn = noise_x_map[nid]
local x0 = math.floor(xn) local zn = noise_z_map[nid]
local z0 = math.floor(zn) local x0 = math.floor(xn)
local z0 = math.floor(zn)
local i0 = i_origin + z0*incr + x0 local i0 = i_origin + z0*incr + x0
local i1 = i0+1 local i1 = i0+1
local i2 = i1+incr local i2 = i1+incr
local i3 = i2-1 local i3 = i2-1
terrain = interp(terrain_map[i0], terrain_map[i1], terrain_map[i2], terrain_map[i3], xn-x0, zn-z0)
lake = math.min(lake_map[i0], lake_map[i1], lake_map[i2], lake_map[i3])
end
local terrain = interp(terrain_map[i0], terrain_map[i1], terrain_map[i2], terrain_map[i3], xn-x0, zn-z0)
if y <= maxp.y then if y <= maxp.y then
local lake = math.min(lake_map[i0], lake_map[i1], lake_map[i2], lake_map[i3])
local is_lake = lake > terrain local is_lake = lake > terrain
local ivm = a:index(x, y, z) local ivm = a:index(x, y, z)
@ -166,12 +186,20 @@ local function generate(minp, maxp, seed)
ground_above = y <= terrain ground_above = y <= terrain
ivm = ivm + ystride ivm = ivm + ystride
nid = nid + incrY if use_distort then
nid = nid + incrY
end
end
if use_distort then
nid = nid + incrX
end end
nid = nid + incrX
i2d = i2d + 1 i2d = i2d + 1
end end
nid = nid + incrZ
if use_distort then
nid = nid + incrZ
end
end end
vm:set_data(data) vm:set_data(data)

View File

@ -47,7 +47,7 @@ mapgen_rivers.sea_level = get_settings('sea_level', 'int', 1)
mapgen_rivers.min_catchment = get_settings('min_catchment', 'float', 25) mapgen_rivers.min_catchment = get_settings('min_catchment', 'float', 25)
mapgen_rivers.max_catchment = get_settings('max_catchment', 'float', 40000) mapgen_rivers.max_catchment = get_settings('max_catchment', 'float', 40000)
mapgen_rivers.riverbed_slope = get_settings('riverbed_slope', 'float', 0.4) * mapgen_rivers.blocksize mapgen_rivers.riverbed_slope = get_settings('riverbed_slope', 'float', 0.4) * mapgen_rivers.blocksize
--mapgen_rivers.distort = get_settings('distort', 'bool', true) To be implemented: should be possible to disable distorsion mapgen_rivers.distort = get_settings('distort', 'bool', true)
mapgen_rivers.glaciers = get_settings('glaciers', 'bool', true) mapgen_rivers.glaciers = get_settings('glaciers', 'bool', true)
mapgen_rivers.glacier_factor = get_settings('glacier_factor', 'float', 8) mapgen_rivers.glacier_factor = get_settings('glacier_factor', 'float', 8)
mapgen_rivers.elevation_chill = get_settings('elevation_chill', 'float', 0.25) mapgen_rivers.elevation_chill = get_settings('elevation_chill', 'float', 0.25)