From 32bc9561b6d96bf9c982909813be84670287fcaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20C?= Date: Sat, 26 Jun 2021 13:13:41 +0200 Subject: [PATCH] Made interactive loading optional but enabled by default --- load.lua | 3 +++ polygons.lua | 60 ++++++++++++++++++++++++++++++++++-------------- pregenerate.lua | 16 +++++++------ settings.lua | 2 ++ settingtypes.txt | 5 ++++ 5 files changed, 62 insertions(+), 24 deletions(-) diff --git a/load.lua b/load.lua index 3ce804c..c8d6929 100644 --- a/load.lua +++ b/load.lua @@ -64,6 +64,9 @@ local loader_mt = { function mapgen_rivers.interactive_loader(filename, bytes, signed, size, converter) local file = io.open(worldpath .. filename, 'rb') if file then + minetest.register_on_shutdown(function() + file:close() + end) converter = converter or false return setmetatable({file=file, bytes=bytes, signed=signed, size=size, conv=converter}, loader_mt) end diff --git a/polygons.lua b/polygons.lua index 585d1ef..7f3f1ac 100644 --- a/polygons.lua +++ b/polygons.lua @@ -18,36 +18,62 @@ local function offset_converter(o) return (o + 0.5) * (1/256) end +local load_all = mapgen_rivers.settings.load_all + -- Try to read file 'size' local sfile = io.open(world_data_path..'size', 'r') +local first_mapgen = true if sfile then X, Z = tonumber(sfile:read('*l')), tonumber(sfile:read('*l')) sfile:close() + first_mapgen = false +end - minetest.register_on_mods_loaded(function() - local grid = mapgen_rivers.grid - grid.dem = mapgen_rivers.interactive_loader('dem', 2, true, X*Z) - grid.lakes = mapgen_rivers.interactive_loader('lakes', 2, true, X*Z) - grid.dirs = mapgen_rivers.interactive_loader('dirs', 1, false, X*Z) - grid.rivers = mapgen_rivers.interactive_loader('rivers', 4, false, X*Z) - - grid.offset_x = mapgen_rivers.interactive_loader('offset_x', 1, true, X*Z, offset_converter) - grid.offset_y = mapgen_rivers.interactive_loader('offset_y', 1, true, X*Z, offset_converter) - end) -else +if first_mapgen then -- Generate a map!! local pregenerate = dofile(mapgen_rivers.modpath .. '/pregenerate.lua') minetest.register_on_mods_loaded(function() - pregenerate() - local offset_x = mapgen_rivers.grid.offset_x - local offset_y = mapgen_rivers.grid.offset_y - for i=1, X*Z do - offset_x[i] = offset_converter(offset_x[i]) - offset_y[i] = offset_converter(offset_y[i]) + print('Generating grid') + pregenerate(load_all) + + if load_all then + local offset_x = mapgen_rivers.grid.offset_x + local offset_y = mapgen_rivers.grid.offset_y + for i=1, X*Z do + offset_x[i] = offset_converter(offset_x[i]) + offset_y[i] = offset_converter(offset_y[i]) + end end end) end +-- if data not already loaded +if not (first_mapgen and load_all) then + local load_map + if load_all then + load_map = mapgen_rivers.load_map + else + load_map = mapgen_rivers.interactive_loader + end + + minetest.register_on_mods_loaded(function() + if load_all then + print('Loading full grid') + else + print('Loading grid as interactive loaders') + end + local grid = mapgen_rivers.grid + + grid.dem = load_map('dem', 2, true, X*Z) + grid.lakes = load_map('lakes', 2, true, X*Z) + grid.dirs = load_map('dirs', 1, false, X*Z) + grid.rivers = load_map('rivers', 4, false, X*Z) + + grid.offset_x = load_map('offset_x', 1, true, X*Z, offset_converter) + grid.offset_y = load_map('offset_y', 1, true, X*Z, offset_converter) + end) +end + mapgen_rivers.grid.size = {x=X, y=Z} local function index(x, z) diff --git a/pregenerate.lua b/pregenerate.lua index b6e0986..f866411 100644 --- a/pregenerate.lua +++ b/pregenerate.lua @@ -13,7 +13,7 @@ local time_step = mapgen_rivers.settings.evol_time_step local niter = math.ceil(time/time_step) time_step = time / niter -local function pregenerate() +local function pregenerate(keep_loaded) local grid = mapgen_rivers.grid local size = grid.size @@ -66,12 +66,14 @@ local function pregenerate() sfile:write(size.x..'\n'..size.y) sfile:close() - grid.dem = model.dem - grid.lakes = model.lakes - grid.dirs = model.dirs - grid.rivers = model.rivers - grid.offset_x = offset_x - grid.offset_y = offset_y + if keep_loaded then + grid.dem = model.dem + grid.lakes = model.lakes + grid.dirs = model.dirs + grid.rivers = model.rivers + grid.offset_x = offset_x + grid.offset_y = offset_y + end end return pregenerate diff --git a/settings.lua b/settings.lua index 786a241..b87bb05 100644 --- a/settings.lua +++ b/settings.lua @@ -61,6 +61,8 @@ mapgen_rivers.settings = { 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') } local function write_settings() diff --git a/settingtypes.txt b/settingtypes.txt index f9f0749..358ad7e 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -46,6 +46,11 @@ mapgen_rivers_glacier_widening_factor (Glacier widening factor) float 8.0 1.0 20 # This results in mountains being more covered by snow. mapgen_rivers_elevation_chill (Elevation chill) float 0.25 0.0 5.0 +# If enabled, loads all grid data in memory at init time. +# If disabled, data will be loaded on request and cached in memory. +# It's recommended to disable it for very large maps (> 2000 grid nodes or so) +mapgen_rivers_load_all (Load all data in memory) bool false + [Landscape evolution parameters] # Modelled landscape evolution time, in arbitrary units