From e5b8f2b3b81f96273c2f97c67cc88da6f5327cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20C?= Date: Thu, 4 Jan 2024 22:47:50 +0100 Subject: [PATCH] Refactor to use only Settings objects for settings. Also remove globally stored path for modpath and data. Basically use less global variables for better adaptation to multithreading. --- heightmap.lua | 10 +-- init.lua | 6 +- load_grid.lua | 12 ++- mapgen.lua | 1 + noises.lua | 80 -------------------- polygons.lua | 1 - pregenerate.lua | 41 +++++++--- settings.lua | 148 +++++++++++++++++++++---------------- terrainlib_lua/erosion.lua | 6 +- 9 files changed, 131 insertions(+), 174 deletions(-) delete mode 100644 noises.lua diff --git a/heightmap.lua b/heightmap.lua index cbe8923..1dfc9be 100644 --- a/heightmap.lua +++ b/heightmap.lua @@ -1,10 +1,10 @@ -local modpath = mapgen_rivers.modpath +local modpath = minetest.get_modpath(minetest.get_current_modname()) -local make_polygons = dofile(modpath .. 'polygons.lua') -local transform_quadri = dofile(modpath .. 'geometry.lua') +local make_polygons = dofile(modpath .. '/polygons.lua') +local transform_quadri = dofile(modpath .. '/geometry.lua') -local sea_level = mapgen_rivers.settings.sea_level -local riverbed_slope = mapgen_rivers.settings.riverbed_slope * mapgen_rivers.settings.blocksize +local sea_level = tonumber(minetest.get_mapgen_setting("water_level")) +local riverbed_slope = tonumber(mapgen_rivers.settings:get("riverbed_slope")) * tonumber(mapgen_rivers.settings:get("blocksize")) local MAP_BOTTOM = -31000 diff --git a/init.lua b/init.lua index 4c6e3b6..e93317d 100644 --- a/init.lua +++ b/init.lua @@ -1,9 +1,5 @@ mapgen_rivers = {} -local modpath = minetest.get_modpath(minetest.get_current_modname()) .. '/' -mapgen_rivers.modpath = modpath -mapgen_rivers.world_data_path = minetest.get_worldpath() .. '/river_data/' - if minetest.get_mapgen_setting("mg_name") ~= "singlenode" then minetest.set_mapgen_setting("mg_name", "singlenode", true) minetest.log("warning", "[mapgen_rivers] Mapgen set to singlenode") @@ -11,7 +7,7 @@ end dofile(modpath .. 'settings.lua') -local sfile = io.open(mapgen_rivers.world_data_path .. 'size') +local sfile = io.open(minetest.get_worldpath() .. '/river_data/size') if sfile then sfile:close() else diff --git a/load_grid.lua b/load_grid.lua index 3f3af47..c6a9968 100644 --- a/load_grid.lua +++ b/load_grid.lua @@ -1,10 +1,16 @@ -local worldpath = mapgen_rivers.world_data_path +local datapath = minetest.get_worldpath() .. "/river_data/" local floor = math.floor local sbyte = string.byte local unpk = unpack local load_map +local use_interactive_loader +if minetest.settings:has("mapgen_rivers_use_interactive_loader") then + use_interactive_loader = minetest.settings:get_bool("mapgen_rivers_use_interactive_loader") +else + use_interactive_loader = not minetest.settings:get_bool("mapgen_rivers_load_all") +end if mapgen_rivers.use_interactive_loader then local loader_mt = { @@ -32,7 +38,7 @@ if mapgen_rivers.use_interactive_loader then } load_map = function(filename, bytes, signed, size, converter) - local file = io.open(worldpath .. filename, 'rb') + local file = io.open(datapath .. filename, 'rb') if file then minetest.register_on_shutdown(function() file:close() @@ -45,7 +51,7 @@ if mapgen_rivers.use_interactive_loader then else load_map = function(filename, bytes, signed, size, converter) - local file = io.open(worldpath .. filename, 'rb') + local file = io.open(datapath .. filename, 'rb') local data = file:read('*all') if #data < bytes*size then data = minetest.decompress(data) diff --git a/mapgen.lua b/mapgen.lua index 0be79f8..6c276f9 100644 --- a/mapgen.lua +++ b/mapgen.lua @@ -25,6 +25,7 @@ local noiseparams = { if use_biomes then noiseparams.heat = minetest.get_mapgen_setting_noiseparams("np_heat") + noiseparams.heat.offset = noiseparams.heat.offset + sea_level / elevation_chill noiseparams.heat_blend = minetest.get_mapgen_setting_noiseparams("np_heat_blend") end diff --git a/noises.lua b/noises.lua deleted file mode 100644 index 0b005ce..0000000 --- a/noises.lua +++ /dev/null @@ -1,80 +0,0 @@ -local def_setting = mapgen_rivers.define_setting - -mapgen_rivers.noise_params = { - base = def_setting('np_base', 'noise', { - offset = 0, - scale = 300, - seed = 2469, - octaves = 8, - spread = {x=2048, y=2048, z=2048}, - persist = 0.6, - lacunarity = 2, - flags = "eased", - }), - - distort_x = def_setting('np_distort_x', 'noise', { - offset = 0, - scale = 1, - seed = -4574, - spread = {x=64, y=32, z=64}, - octaves = 3, - persistence = 0.75, - lacunarity = 2, - }), - - distort_z = def_setting('np_distort_z', 'noise', { - offset = 0, - scale = 1, - seed = -7940, - spread = {x=64, y=32, z=64}, - octaves = 3, - persistence = 0.75, - lacunarity = 2, - }), - - distort_amplitude = def_setting('np_distort_amplitude', 'noise', { - 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'), -} - --- Convert to number because Minetest API is not able to do it cleanly... -for name, np in pairs(mapgen_rivers.noise_params) do - for field, value in pairs(np) do - if field ~= 'flags' and type(value) == 'string' then - np[field] = tonumber(value) or value - elseif field == 'spread' then - for dir, v in pairs(value) do - value[dir] = tonumber(v) or v - end - end - end -end - -local heat = mapgen_rivers.noise_params.heat -local base = mapgen_rivers.noise_params.base -local settings = mapgen_rivers.settings -heat.offset = heat.offset + settings.sea_level * settings.elevation_chill -base.spread.x = base.spread.x / settings.blocksize -base.spread.y = base.spread.y / settings.blocksize -base.spread.z = base.spread.z / settings.blocksize - -for name, np in pairs(mapgen_rivers.noise_params) do - local lac = np.lacunarity or 2 - if lac > 1 then - local omax = math.floor(math.log(math.min(np.spread.x, np.spread.y, np.spread.z)) / math.log(lac))+1 - if np.octaves > omax then - minetest.log("warning", "[mapgen_rivers] Noise " .. name .. ": 'octaves' reduced to " .. omax) - np.octaves = omax - end - end -end diff --git a/polygons.lua b/polygons.lua index a1a7ff9..f4d1201 100644 --- a/polygons.lua +++ b/polygons.lua @@ -9,7 +9,6 @@ local settings = mapgen_rivers.settings local blocksize = tonumber(settings:get('blocksize')) local min_catchment = tonumber(settings:get('min_catchment')) -local max_catchment = tonumber(settings:get('max_catchment')) local map_offset = {x=0, z=0} if settings:get_bool('center') then diff --git a/pregenerate.lua b/pregenerate.lua index 51ae40c..34b7d45 100644 --- a/pregenerate.lua +++ b/pregenerate.lua @@ -1,15 +1,24 @@ -local EvolutionModel = dofile(mapgen_rivers.modpath .. '/terrainlib_lua/erosion.lua') -local twist = dofile(mapgen_rivers.modpath .. '/terrainlib_lua/twist.lua') +local modpath = minetest.get_modpath(minetest.get_current_modname()) -local blocksize = mapgen_rivers.settings.blocksize -local tectonic_speed = mapgen_rivers.settings.tectonic_speed +local EvolutionModel = dofile(modpath .. '/terrainlib_lua/erosion.lua') +local twist = dofile(modpath .. '/terrainlib_lua/twist.lua') -local np_base = table.copy(mapgen_rivers.noise_params.base) +local blocksize = tonumber(mapgen_rivers.settings:get("blocksize")) +local tectonic_speed = tonumber(mapgen_rivers.settings:get("tectonic_speed")) -local evol_params = mapgen_rivers.settings.evol_params +local np_base = mapgen_rivers.settings:get_np_group("np_base") +np_base.spread.x = np_base.spread.x / blocksize +np_base.spread.y = np_base.spread.y / blocksize +np_base.spread.z = np_base.spread.z / blocksize -local time = mapgen_rivers.settings.evol_time -local time_step = mapgen_rivers.settings.evol_time_step +local evol_params = { + K = tonumber(mapgen_rivers.settings:get("river_erosion_coef")), + m = tonumber(mapgen_rivers.settings:get("river_erosion_power")), + d = tonumber(mapgen_rivers.settings:get("difusive_erosion")), +} + +local time = tonumber(mapgen_rivers.settings:get("evol_time")) +local time_step = tonumber(mapgen_rivers.settings:get("evol_time_step")) local niter = math.ceil(time/time_step) time_step = time / niter @@ -60,11 +69,12 @@ for i=1, size.x*size.y do end -- Write the results in the world directory -minetest.mkdir(mapgen_rivers.world_data_path) +local datapath = minetest.get_worldpath .. "/river_data/" +minetest.mkdir(datapath) local function write_map(filename, data, bytes) local size = #data - local file = io.open(worldpath .. filename, 'wb') + local file = io.open(datapath .. filename, 'wb') local bytelist = {} for j=1, bytes do @@ -95,11 +105,18 @@ write_map('dirs', model.dirs, 1) write_map('rivers', model.rivers, 4) write_map('offset_x', offset_x, 1) write_map('offset_y', offset_y, 1) -local sfile = io.open(mapgen_rivers.world_data_path .. 'size', "w") +local sfile = io.open(datapath .. 'size', "w") sfile:write(size.x..'\n'..size.y) sfile:close() -if not mapgen_rivers.settings.use_interactive_loader then +local use_interactive_loader +if minetest.settings:has("mapgen_rivers_use_interactive_loader") then + use_interactive_loader = minetest.settings:get_bool("mapgen_rivers_use_interactive_loader") +else + use_interactive_loader = not minetest.settings:get_bool("mapgen_rivers_load_all") +end + +if not use_interactive_loader then mapgen_rivers.grid = { size = {x=size_x, y=size_y}, dem = model.dem, diff --git a/settings.lua b/settings.lua index 83a7268..f76e1a8 100644 --- a/settings.lua +++ b/settings.lua @@ -1,11 +1,11 @@ local mtsettings = minetest.settings -local mgrsettings = Settings(minetest.get_worldpath() .. '/mapgen_rivers.conf') +local settings = Settings(minetest.get_worldpath() .. '/mapgen_rivers.conf') mapgen_rivers.version = "1.0.2" mapgen_rivers.settings = settings local previous_version_mt = mtsettings:get("mapgen_rivers_version") or "0.0" -local previous_version_mgr = mgrsettings:get("version") or "0.0" +local previous_version_mgr = settings:get("version") or "0.0" if mapgen_rivers.version ~= previous_version_mt or mapgen_rivers.version ~= previous_version_mgr then local compat_mt, compat_mgr = dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/compatibility.lua") @@ -13,81 +13,103 @@ if mapgen_rivers.version ~= previous_version_mt or mapgen_rivers.version ~= prev compat_mt(mtsettings) end if mapgen_rivers.version ~= previous_version_mgr then - compat_mgr(mgrsettings) + compat_mgr(settings) end end mtsettings:set("mapgen_rivers_version", mapgen_rivers.version) -mgrsettings:set("version", mapgen_rivers.version) +settings:set("version", mapgen_rivers.version) -function mapgen_rivers.define_setting(name, dtype, default) +local modified = false +local function verify_setting(name, dtype, default) + if settings:has(name) then + return + end + + modified = true + local v = default + local mtname = 'mapgen_rivers_' .. name + local mthas = mtsettings:has(mtname) if dtype == "number" or dtype == "string" then - local v = mgrsettings:get(name) - if v == nil then - v = mtsettings:get('mapgen_rivers_' .. name) - if v == nil then + if mthas then + v = mtsettings:get(mtname) + if dtype == "number" and tonumber(v) == nil then v = default end - mgrsettings:set(name, v) - end - if dtype == "number" then - return tonumber(v) - else - return v end + settings:set(name, v) elseif dtype == "bool" then - local v = mgrsettings:get_bool(name) - if v == nil then - v = mtsettings:get_bool('mapgen_rivers_' .. name) - if v == nil then - v = default - end - mgrsettings:set_bool(name, v) + if mthas then + v = mtsettings:get(mtname) end - return v - elseif dtype == "noise" then - local v = mgrsettings:get_np_group(name) - if v == nil then - v = mtsettings:get_np_group('mapgen_rivers_' .. name) - if v == nil then - v = default - end - mgrsettings:set_np_group(name, v) + settings:set_bool(name, v) + elseif dtype = "noise" then + if mthas then + v = mtsettings:get_np_group(mtname) end - return v + settings:set_np_group(name, v) end end -local def_setting = mapgen_rivers.define_setting +verify_setting('center', 'bool', true) +verify_setting('blocksize', 'number', 15) +verify_setting('min_catchment', 'number', 3600) +verify_setting('river_widening_power', 'number', 0.5) +verify_setting('riverbed_slope', 'number', 0.4) +verify_setting('distort', 'bool', true) +verify_setting('biomes', 'bool', true) +verify_setting('glaciers', 'bool', false) +verify_setting('glacier_factor', 'number', 8) +verify_setting('elevation_chill', 'number', 0.25) +verify_setting('grid_x_size', 'number', 1000) +verify_setting('grid_z_size', 'number', 1000) +verify_setting('river_erosion_coef', 'number', 0.5) +verify_setting('river_erosion_power', 'number', 0.4) +verify_setting('diffusive_erosion', 'number', 0.5) +verify_setting('compensation_radius', 'number', 50) +verify_setting('tectonic_speed', 'number', 70) +verify_setting('evol_time', 'number', 10) +verify_setting('evol_time_step', 'number', 1) -mapgen_rivers.settings = { - center = def_setting('center', 'bool', true), - blocksize = def_setting('blocksize', 'number', 15), - sea_level = tonumber(minetest.get_mapgen_setting('water_level')), - min_catchment = def_setting('min_catchment', 'number', 3600), - river_widening_power = def_setting('river_widening_power', 'number', 0.5), - riverbed_slope = def_setting('riverbed_slope', 'number', 0.4), - distort = def_setting('distort', 'bool', true), - biomes = def_setting('biomes', 'bool', true), - glaciers = def_setting('glaciers', 'bool', false), - glacier_factor = def_setting('glacier_factor', 'number', 8), - elevation_chill = def_setting('elevation_chill', 'number', 0.25), +verify_setting('np_base', 'noise', { + offset = 0, + scale = 300, + seed = 2469, + octaves = 8, + spread = {x=2048, y=2048, z=2048}, + persist = 0.6, + lacunarity = 2, + flags = "eased", +}) +verify_setting('np_distort_x', 'noise', { + offset = 0, + scale = 1, + seed = -4574, + spread = {x=64, y=32, z=64}, + octaves = 3, + persistence = 0.75, + lacunarity = 2, +}) +verify_setting('np_distort_z', 'noise', { + offset = 0, + scale = 1, + seed = -7940, + spread = {x=64, y=32, z=64}, + octaves = 3, + persistence = 0.75, + lacunarity = 2, +}) +verify_setting('np_distort_amplitude', 'noise', { + offset = 0, + scale = 10, + seed = 676, + spread = {x=1024, y=1024, z=1024}, + octaves = 5, + persistence = 0.5, + lacunarity = 2, + flags = "absvalue", +}) - grid_x_size = def_setting('grid_x_size', 'number', 1000), - grid_z_size = def_setting('grid_z_size', 'number', 1000), - evol_params = { - K = def_setting('river_erosion_coef', 'number', 0.5), - m = def_setting('river_erosion_power', 'number', 0.4), - d = def_setting('diffusive_erosion', 'number', 0.5), - compensation_radius = def_setting('compensation_radius', 'number', 50), - }, - tectonic_speed = def_setting('tectonic_speed', 'number', 70), - evol_time = def_setting('evol_time', 'number', 10), - evol_time_step = def_setting('evol_time_step', 'number', 1), - - load_all = mtsettings:get_bool('mapgen_rivers_load_all') -} - -dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/noises.lua") - -mgrsettings:write() +if modified then + settings:write() +end diff --git a/terrainlib_lua/erosion.lua b/terrainlib_lua/erosion.lua index 355249d..7a09904 100644 --- a/terrainlib_lua/erosion.lua +++ b/terrainlib_lua/erosion.lua @@ -123,11 +123,7 @@ end local modpath = "" if minetest then - if minetest.global_exists('mapgen_rivers') then - modpath = mapgen_rivers.modpath .. "terrainlib_lua/" - else - modpath = minetest.get_modpath(minetest.get_current_modname()) .. "terrainlib_lua/" - end + modpath = minetest.get_modpath(minetest.get_current_modname()) .. "terrainlib_lua/" end local rivermapper = dofile(modpath .. "rivermapper.lua")