mirror of
https://gitlab.com/gaelysam/mapgen_rivers.git
synced 2024-12-29 12:20:41 +01:00
Various bugfixes and workarounds
Now working in pure Lua! Some parts of the code are very hacky (e.g. noise) and the way new and old codes have been glued together is sometimes to be rewritten. But at least it works.
This commit is contained in:
parent
cb297af047
commit
74733549df
28
generate.lua
28
generate.lua
@ -1,15 +1,16 @@
|
|||||||
local EvolutionModel = dofile(mapgen_rivers.modpath .. '/erosion.lua')
|
local EvolutionModel = dofile(mapgen_rivers.modpath .. '/terrainlib_lua/erosion.lua')
|
||||||
local twist = dofile(mapgen_rivers.modpath .. '/twist.lua')
|
local twist = dofile(mapgen_rivers.modpath .. '/terrainlib_lua/twist.lua')
|
||||||
|
|
||||||
local size = {x=1000, y=1000}
|
local size = {x=1000, y=1000}
|
||||||
local blocksize = 12
|
local blocksize = 12
|
||||||
|
local variation_speed = 70
|
||||||
|
|
||||||
local np_base = {
|
local np_base = {
|
||||||
offset = 0,
|
offset = 0,
|
||||||
scale = 200,
|
scale = 200,
|
||||||
seed = 2469,
|
seed = 2469,
|
||||||
octaves = 8,
|
octaves = 8,
|
||||||
spread = {x=4000/blocksize, y=4000/blocksize, z=5},
|
spread = {x=4000/blocksize, y=4000/blocksize, z=4000/blocksize},
|
||||||
persist = 0.6,
|
persist = 0.6,
|
||||||
lacunarity = 2,
|
lacunarity = 2,
|
||||||
}
|
}
|
||||||
@ -20,10 +21,14 @@ local niter = math.ceil(time/time_step)
|
|||||||
time_step = time / niter
|
time_step = time / niter
|
||||||
|
|
||||||
local function generate()
|
local function generate()
|
||||||
local nobj_base = minetest.get_perlin_map(np_base, size)
|
local seed = tonumber(minetest.get_mapgen_setting("seed"))
|
||||||
nobj_base:calc_3d_map({x=0, y=0, z=0})
|
np_base.seed = (np_base.seed or 0) + seed
|
||||||
|
|
||||||
local dem = nobj_base:get_map_slice({z=1}, {z=1})
|
local nobj_base = PerlinNoiseMap(np_base, {x=size.x, y=1, z=size.y})
|
||||||
|
--nobj_base:calc_3d_map({x=0, y=0, z=0})
|
||||||
|
|
||||||
|
--local dem = nobj_base:get_map_slice({z=1}, {z=1})
|
||||||
|
local dem = nobj_base:get_3d_map_flat({x=0, y=0, z=0})
|
||||||
dem.X = size.x
|
dem.X = size.x
|
||||||
dem.Y = size.y
|
dem.Y = size.y
|
||||||
|
|
||||||
@ -31,8 +36,10 @@ local function generate()
|
|||||||
model.dem = dem
|
model.dem = dem
|
||||||
local ref_dem = model:define_isostasy(dem)
|
local ref_dem = model:define_isostasy(dem)
|
||||||
|
|
||||||
|
local variation_step = variation_speed * time_step
|
||||||
for i=1, niter do
|
for i=1, niter do
|
||||||
nobj_base:get_map_slice({z=i+1}, {z=1}, ref_dem)
|
--nobj_base:get_map_slice({z=i+1}, {z=1}, ref_dem)
|
||||||
|
nobj_base:get_3d_map_flat({x=0, y=variation_step*i, z=0}, ref_dem)
|
||||||
|
|
||||||
model:diffuse(time_step)
|
model:diffuse(time_step)
|
||||||
model:flow()
|
model:flow()
|
||||||
@ -44,9 +51,12 @@ local function generate()
|
|||||||
local mfloor = math.floor
|
local mfloor = math.floor
|
||||||
local mmin, mmax = math.min, math.max
|
local mmin, mmax = math.min, math.max
|
||||||
local offset_x, offset_y = twist(model.dirs, model.rivers, 5)
|
local offset_x, offset_y = twist(model.dirs, model.rivers, 5)
|
||||||
for i=1, X*Y do
|
local dirs = model.dirs
|
||||||
|
local converter = {2, 1, 4, 3, [0]=0}
|
||||||
|
for i=1, size.x*size.y do
|
||||||
offset_x[i] = mmin(mmax(offset_x[i]*256, -128), 127)
|
offset_x[i] = mmin(mmax(offset_x[i]*256, -128), 127)
|
||||||
offset_y[i] = mmin(mmax(offset_y[i]*256, -128), 127)
|
offset_y[i] = mmin(mmax(offset_y[i]*256, -128), 127)
|
||||||
|
dirs[i] = converter[dirs[i]] -- TODO Fix this
|
||||||
end
|
end
|
||||||
|
|
||||||
mapgen_rivers.write_map('dem', model.dem, 2)
|
mapgen_rivers.write_map('dem', model.dem, 2)
|
||||||
@ -56,7 +66,7 @@ local function generate()
|
|||||||
mapgen_rivers.write_map('offset_x', offset_x, 1)
|
mapgen_rivers.write_map('offset_x', offset_x, 1)
|
||||||
mapgen_rivers.write_map('offset_y', offset_y, 1)
|
mapgen_rivers.write_map('offset_y', offset_y, 1)
|
||||||
local sfile = io.open(mapgen_rivers.world_data_path .. 'size', "w")
|
local sfile = io.open(mapgen_rivers.world_data_path .. 'size', "w")
|
||||||
sfile:write(X..'\n'..Y)
|
sfile:write(size.x..'\n'..size.y)
|
||||||
sfile:close()
|
sfile:close()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
2
init.lua
2
init.lua
@ -2,7 +2,7 @@ mapgen_rivers = {}
|
|||||||
|
|
||||||
local modpath = minetest.get_modpath(minetest.get_current_modname()) .. '/'
|
local modpath = minetest.get_modpath(minetest.get_current_modname()) .. '/'
|
||||||
mapgen_rivers.modpath = modpath
|
mapgen_rivers.modpath = modpath
|
||||||
mapgen_rivers.world_data_path = minetest.get_worldpath() .. '/river_data'
|
mapgen_rivers.world_data_path = minetest.get_worldpath() .. '/river_data/'
|
||||||
|
|
||||||
dofile(modpath .. 'settings.lua')
|
dofile(modpath .. 'settings.lua')
|
||||||
|
|
||||||
|
2
load.lua
2
load.lua
@ -1,4 +1,4 @@
|
|||||||
local worldpath = minetest.world_data_path
|
local worldpath = mapgen_rivers.world_data_path
|
||||||
|
|
||||||
function mapgen_rivers.load_map(filename, bytes, signed, size)
|
function mapgen_rivers.load_map(filename, bytes, signed, size)
|
||||||
local file = io.open(worldpath .. filename, 'rb')
|
local file = io.open(worldpath .. filename, 'rb')
|
||||||
|
@ -4,7 +4,7 @@ if not io.open(mod_data_path .. 'size', 'r') then
|
|||||||
mod_data_path = modpath .. 'demo_data/'
|
mod_data_path = modpath .. 'demo_data/'
|
||||||
end
|
end
|
||||||
|
|
||||||
local world_data_path = minetest.world_data_path
|
local world_data_path = mapgen_rivers.world_data_path
|
||||||
minetest.mkdir(world_data_path)
|
minetest.mkdir(world_data_path)
|
||||||
|
|
||||||
dofile(modpath .. 'load.lua')
|
dofile(modpath .. 'load.lua')
|
||||||
@ -26,15 +26,15 @@ sfile:close()
|
|||||||
|
|
||||||
local dem = mapgen_rivers.load_map('dem', 2, true, X*Z)
|
local dem = mapgen_rivers.load_map('dem', 2, true, X*Z)
|
||||||
local lakes = mapgen_rivers.load_map('lakes', 2, true, X*Z)
|
local lakes = mapgen_rivers.load_map('lakes', 2, true, X*Z)
|
||||||
local dirs = mapen_rivers.load_map('dirs', 1, false, X*Z)
|
local dirs = mapgen_rivers.load_map('dirs', 1, false, X*Z)
|
||||||
local rivers = mapgen_rivers.load_map('rivers', 4, false, X*Z)
|
local rivers = mapgen_rivers.load_map('rivers', 4, false, X*Z)
|
||||||
|
|
||||||
local offset_x = load_map('offset_x', 1, true, X*Z)
|
local offset_x = mapgen_rivers.load_map('offset_x', 1, true, X*Z)
|
||||||
for k, v in ipairs(offset_x) do
|
for k, v in ipairs(offset_x) do
|
||||||
offset_x[k] = (v+0.5)/256
|
offset_x[k] = (v+0.5)/256
|
||||||
end
|
end
|
||||||
|
|
||||||
local offset_z = load_map('offset_y', 1, true, X*Z)
|
local offset_z = mapgen_rivers.load_map('offset_y', 1, true, X*Z)
|
||||||
for k, v in ipairs(offset_z) do
|
for k, v in ipairs(offset_z) do
|
||||||
offset_z[k] = (v+0.5)/256
|
offset_z[k] = (v+0.5)/256
|
||||||
end
|
end
|
||||||
|
@ -110,7 +110,7 @@ end
|
|||||||
|
|
||||||
local modpath = ""
|
local modpath = ""
|
||||||
if minetest then
|
if minetest then
|
||||||
if minetest.global_exists(mapgen_rivers) then
|
if minetest.global_exists('mapgen_rivers') then
|
||||||
modpath = mapgen_rivers.modpath .. "terrainlib_lua/"
|
modpath = mapgen_rivers.modpath .. "terrainlib_lua/"
|
||||||
else
|
else
|
||||||
modpath = minetest.get_modpath(minetest.get_current_modname()) .. "terrainlib_lua/"
|
modpath = minetest.get_modpath(minetest.get_current_modname()) .. "terrainlib_lua/"
|
||||||
|
@ -29,7 +29,7 @@ local flow_methods = {
|
|||||||
|
|
||||||
local function flow_routing(dem, dirs, lakes, method)
|
local function flow_routing(dem, dirs, lakes, method)
|
||||||
method = method or 'semirandom'
|
method = method or 'semirandom'
|
||||||
flow_local = flow_methods[method] or flow_local_semirandom
|
local flow_local = flow_methods[method] or flow_local_semirandom
|
||||||
|
|
||||||
dirs = dirs or {}
|
dirs = dirs or {}
|
||||||
lakes = lakes or {}
|
lakes = lakes or {}
|
||||||
@ -194,7 +194,7 @@ local function flow_routing(dem, dirs, lakes, method)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
basin_graph = {}
|
local basin_graph = {}
|
||||||
for n=1, nbasins do
|
for n=1, nbasins do
|
||||||
--print(n, nbasins)
|
--print(n, nbasins)
|
||||||
local b1, lnk1 = next(lowlevel)
|
local b1, lnk1 = next(lowlevel)
|
||||||
|
Loading…
Reference in New Issue
Block a user