Added glaciers, and re-organized noise definitions

This commit is contained in:
Gael-de-Sailly 2020-05-24 11:38:47 +02:00
parent 625768f967
commit 6f43430574
4 changed files with 90 additions and 44 deletions

View File

@ -7,6 +7,9 @@ dofile(modpath .. 'settings.lua')
local blocksize = mapgen_rivers.blocksize 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
dofile(modpath .. 'noises.lua')
local make_polygons = dofile(modpath .. 'polygons.lua') local make_polygons = dofile(modpath .. 'polygons.lua')
@ -23,43 +26,6 @@ end
local data = {} local data = {}
local noise_x_params = {
offset = 0,
scale = 1,
seed = -4574,
spread = {x=64, y=32, z=64},
octaves = 3,
persistence = 0.75,
lacunarity = 2,
}
local noise_z_params = {
offset = 0,
scale = 1,
seed = -7940,
spread = {x=64, y=32, z=64},
octaves = 3,
persistence = 0.75,
lacunarity = 2,
}
local noise_distort_params = {
offset = 0,
scale = 10,
seed = 676,
spread = {x=1024, y=1024, z=1024},
octaves = 5,
persistence = 0.5,
lacunarity = 2,
flags = "absvalue",
}
local noise_heat_params = minetest.get_mapgen_setting_noiseparams('mg_biome_np_heat')
local noise_heat_blend_params = minetest.get_mapgen_setting_noiseparams('mg_biome_np_heat_blend')
local elevation_chill = 0.25
noise_heat_params.offset = noise_heat_params.offset + sea_level*elevation_chill
local noise_x_obj, noise_z_obj, noise_distort_obj, noise_heat_obj, noise_heat_blend_obj local noise_x_obj, noise_z_obj, noise_distort_obj, noise_heat_obj, noise_heat_blend_obj
local noise_x_map = {} local noise_x_map = {}
local noise_z_map = {} local noise_z_map = {}
@ -82,11 +48,11 @@ 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(noise_x_params, mapsize) noise_x_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_x, mapsize)
noise_z_obj = minetest.get_perlin_map(noise_z_params, mapsize) noise_z_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_z, mapsize)
noise_heat_obj = minetest.get_perlin_map(noise_heat_params, chulens) noise_heat_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.heat, chulens)
noise_heat_blend_obj = minetest.get_perlin_map(noise_heat_blend_params, chulens) noise_heat_blend_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.heat_blend, chulens)
noise_distort_obj = minetest.get_perlin_map(noise_distort_params, chulens) noise_distort_obj = minetest.get_perlin_map(mapgen_rivers.noise_params.distort_amplitude, chulens)
init = true init = true
end end

37
noises.lua Normal file
View File

@ -0,0 +1,37 @@
mapgen_rivers.noise_params = {
distort_x = {
offset = 0,
scale = 1,
seed = -4574,
spread = {x=64, y=32, z=64},
octaves = 3,
persistence = 0.75,
lacunarity = 2,
},
distort_z = {
offset = 0,
scale = 1,
seed = -7940,
spread = {x=64, y=32, z=64},
octaves = 3,
persistence = 0.75,
lacunarity = 2,
},
distort_amplitude = {
offset = 0,
scale = 10,
seed = 676,
spread = {x=1024, y=1024, z=1024},
octaves = 5,
persistence = 0.5,
lacunarity = 2,
flags = "absvalue",
},
heat = minetest.get_mapgen_setting_noiseparams('mg_biome_np_heat'),
heat_blend = minetest.get_mapgen_setting_noiseparams('mg_biome_np_heat_blend'),
}
mapgen_rivers.noise_params.heat.offset = mapgen_rivers.noise_params.heat.offset + mapgen_rivers.sea_level*mapgen_rivers.elevation_chill

View File

@ -74,9 +74,28 @@ local function river_width(flow)
return math.min(wfactor * flow ^ wpower, 1) return math.min(wfactor * flow ^ wpower, 1)
end end
local noise_heat -- Need a large-scale noise here so no heat blend
local elevation_chill = mapgen_rivers.elevation_chill
local function get_temperature(x, y, z)
local pos = {x=x, y=z}
return noise_heat:get2d(pos) - y*elevation_chill
end
local glaciers = mapgen_rivers.glaciers
local glacier_factor = mapgen_rivers.glacier_factor
local init = false
-- On map generation, determine into which polygon every point (in 2D) will fall. -- On map generation, determine into which polygon every point (in 2D) will fall.
-- Also store polygon-specific data -- Also store polygon-specific data
local function make_polygons(minp, maxp) local function make_polygons(minp, maxp)
if not init then
if glaciers then
noise_heat = minetest.get_perlin(mapgen_rivers.noise_params.heat)
end
init = true
end
local chulens = maxp.z - minp.z + 1 local chulens = maxp.z - minp.z + 1
local polygons = {} local polygons = {}
@ -141,7 +160,8 @@ local function make_polygons(minp, maxp)
end end
end end
polygon.dem = {dem[iA], dem[iB], dem[iC], dem[iD]} local poly_dem = {dem[iA], dem[iB], dem[iC], dem[iD]}
polygon.dem = poly_dem
polygon.lake = math.min(lakes[iA], lakes[iB], lakes[iC], lakes[iD]) polygon.lake = math.min(lakes[iA], lakes[iB], lakes[iC], lakes[iD])
-- Now, rivers. -- Now, rivers.
@ -150,6 +170,21 @@ local function make_polygons(minp, maxp)
local riverB = river_width(rivers[iB]) local riverB = river_width(rivers[iB])
local riverC = river_width(rivers[iC]) local riverC = river_width(rivers[iC])
local riverD = river_width(rivers[iD]) local riverD = river_width(rivers[iD])
if glaciers then -- Widen the river
if get_temperature(poly_x[1]*blocksize, poly_dem[1], poly_z[1]*blocksize) < 0 then
riverA = math.min(riverA*glacier_factor, 1)
end
if get_temperature(poly_x[2]*blocksize, poly_dem[2], poly_z[2]*blocksize) < 0 then
riverB = math.min(riverB*glacier_factor, 1)
end
if get_temperature(poly_x[3]*blocksize, poly_dem[3], poly_z[3]*blocksize) < 0 then
riverC = math.min(riverC*glacier_factor, 1)
end
if get_temperature(poly_x[4]*blocksize, poly_dem[4], poly_z[4]*blocksize) < 0 then
riverD = math.min(riverD*glacier_factor, 1)
end
end
polygon.river_corners = {riverA, 1-riverB, 2-riverC, 1-riverD} polygon.river_corners = {riverA, 1-riverB, 2-riverC, 1-riverD}
-- Flow directions -- Flow directions

View File

@ -9,6 +9,8 @@ local function get_settings(key, dtype, default)
return storage:get_int(key) return storage:get_int(key)
elseif dtype == "float" then elseif dtype == "float" then
return storage:get_float(key) return storage:get_float(key)
elseif dtype == "bool" then
return storage:get_string(key) == 'true'
end end
end end
@ -20,7 +22,7 @@ local function get_settings(key, dtype, default)
elseif dtype == "float" then elseif dtype == "float" then
conf_val = tonumber(conf_val) conf_val = tonumber(conf_val)
storage:set_float(key, conf_val) storage:set_float(key, conf_val)
elseif dtype == "string" then elseif dtype == "string" or dtype == "bool" then
storage:set_string(key, conf_val) storage:set_string(key, conf_val)
end end
@ -32,6 +34,8 @@ local function get_settings(key, dtype, default)
storage:set_float(key, default) storage:set_float(key, default)
elseif dtype == "string" then elseif dtype == "string" then
storage:set_string(key, default) storage:set_string(key, default)
elseif dtype == "bool" then
storage:set_string(key, tostring(default))
end end
return default return default
@ -43,3 +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.glaciers = get_settings('glaciers', 'bool', true)
mapgen_rivers.glacier_factor = get_settings('glacier_factor', 'float', 8)
mapgen_rivers.elevation_chill = get_settings('elevation_chill', 'float', 0.25)