From 2cf3b19167c9b689ebbf11519705119663764f79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20C?= Date: Wed, 31 Jan 2024 11:32:24 +0100 Subject: [PATCH] Generate grid directly in pregenerate.lua, not in a function --- gridmanager.lua | 19 --------- init.lua | 4 +- pregenerate.lua | 105 ++++++++++++++++++++++++++---------------------- 3 files changed, 57 insertions(+), 71 deletions(-) diff --git a/gridmanager.lua b/gridmanager.lua index 21c8bda..ff56292 100644 --- a/gridmanager.lua +++ b/gridmanager.lua @@ -69,25 +69,6 @@ function mapgen_rivers.try_load_grid(grid) return true end -function mapgen_rivers.generate_grid() - minetest.log("action", '[mapgen_rivers] Generating grid, this may take a while...') - local grid = {} - - local blocksize = mapgen_rivers.settings.blocksize - local xsize = math.floor(mapgen_rivers.settings.map_x_size / blocksize) - local zsize = math.floor(mapgen_rivers.settings.map_z_size / blocksize) - grid.size = {x=xsize, y=zsize} - - if not mapgen_rivers.pregenerate then - minetest.log("error", "[mapgen_rivers] Pre-generation function is not available.") - return false - end - - mapgen_rivers.pregenerate(grid) - - return grid -end - function mapgen_rivers.write_grid(grid) minetest.mkdir(world_data) diff --git a/init.lua b/init.lua index 10d21cf..fcec84c 100644 --- a/init.lua +++ b/init.lua @@ -17,9 +17,7 @@ minetest.register_on_mods_loaded(function() local exist = mapgen_rivers.try_load_grid() if not exist then -- If grid does not exist yet, generate it - dofile(modpath .. 'pregenerate.lua') - - local grid = mapgen_rivers.generate_grid() + local grid = dofile(modpath .. 'pregenerate.lua') mapgen_rivers.write_grid(grid) mapgen_rivers.try_load_grid() -- Reload if needed end diff --git a/pregenerate.lua b/pregenerate.lua index 593c781..80d7191 100644 --- a/pregenerate.lua +++ b/pregenerate.lua @@ -21,6 +21,9 @@ local use_margin = mapgen_rivers.settings.margin local margin_width = mapgen_rivers.settings.margin_width / blocksize local margin_elev = mapgen_rivers.settings.margin_elev +local X = math.floor(mapgen_rivers.settings.map_x_size / blocksize) +local Y = math.floor(mapgen_rivers.settings.map_z_size / blocksize) + local function margin(dem, width, elev) local X, Y = dem.X, dem.Y for i=1, width do @@ -49,66 +52,70 @@ local function margin(dem, width, elev) end end -function mapgen_rivers.pregenerate(grid) - local size = grid.size +-- Generate the grid - if size.x * size.y > 4e6 then - minetest.log("warning", "[mapgen_rivers] You are going to generate a very large grid (>4M nodes). If you experience problems, you should increase blocksize or reduce map size.") - end +minetest.log("action", '[mapgen_rivers] Generating grid, this may take a while...') - local seed = tonumber(minetest.get_mapgen_setting("seed"):sub(-10)) - np_base.seed = (np_base.seed or 0) + seed +local grid = {size={x=X, y=Y}} - local nobj_base = PerlinNoiseMap(np_base, {x=size.x, y=1, z=size.y}) +if X*Y > 4e6 then + minetest.log("warning", "[mapgen_rivers] You are going to generate a very large grid (>4M nodes). If you experience problems, you should increase blocksize or reduce map size.") +end - local dem = nobj_base:get_3d_map_flat({x=0, y=0, z=0}) - dem.X = size.x - dem.Y = size.y +local seed = tonumber(minetest.get_mapgen_setting("seed"):sub(-10)) +np_base.seed = (np_base.seed or 0) + seed - if use_margin then - margin(dem, margin_width, margin_elev) - end +local nobj_base = PerlinNoiseMap(np_base, {x=X, y=1, z=Y}) - local model = EvolutionModel(evol_params) - model.dem = dem - local ref_dem = model:define_isostasy(dem) +local dem = nobj_base:get_3d_map_flat({x=0, y=0, z=0}) +dem.X = X +dem.Y = Y - local tectonic_step = tectonic_speed * time_step - collectgarbage() - for i=1, niter do - minetest.log("info", "[mapgen_rivers] Iteration " .. i .. " of " .. niter) +if use_margin then + margin(dem, margin_width, margin_elev) +end - model:diffuse(time_step) - model:flow() - model:erode(time_step) - if i < niter then - if tectonic_step ~= 0 then - nobj_base:get_3d_map_flat({x=0, y=tectonic_step*i, z=0}, ref_dem) - if use_margin then - margin(ref_dem, margin_width, margin_elev) - end - end - model:isostasy() - end +local model = EvolutionModel(evol_params) +model.dem = dem +local ref_dem = model:define_isostasy(dem) - collectgarbage() - end +local tectonic_step = tectonic_speed * time_step +collectgarbage() +for i=1, niter do + minetest.log("info", "[mapgen_rivers] Iteration " .. i .. " of " .. niter) + + model:diffuse(time_step) model:flow() - - local mfloor = math.floor - local mmin, mmax = math.min, math.max - local offset_x, offset_y = twist(model.dirs, model.rivers, 5) - for i=1, size.x*size.y do - offset_x[i] = mmin(mmax(offset_x[i]*256, -128), 127) - offset_y[i] = mmin(mmax(offset_y[i]*256, -128), 127) + model:erode(time_step) + if i < niter then + if tectonic_step ~= 0 then + nobj_base:get_3d_map_flat({x=0, y=tectonic_step*i, z=0}, ref_dem) + if use_margin then + margin(ref_dem, margin_width, margin_elev) + end + end + model:isostasy() end - 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 - collectgarbage() end +model:flow() + +local mfloor = math.floor +local mmin, mmax = math.min, math.max +local offset_x, offset_y = twist(model.dirs, model.rivers, 5) +for i=1, X*Y do + offset_x[i] = mmin(mmax(offset_x[i]*256, -128), 127) + offset_y[i] = mmin(mmax(offset_y[i]*256, -128), 127) +end + +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 + +collectgarbage() + +return grid