mirror of
https://gitlab.com/gaelysam/mapgen_rivers.git
synced 2025-02-22 06:50:29 +01:00
Load data on request instead of loading everything at first.
Data is cached in memory in case it is reused. Offset values have a callback that converts them to the range ±0.5
This commit is contained in:
parent
636773487a
commit
7e39189368
42
load.lua
42
load.lua
@ -1,6 +1,6 @@
|
|||||||
local worldpath = mapgen_rivers.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, converter)
|
||||||
local file = io.open(worldpath .. filename, 'rb')
|
local file = io.open(worldpath .. filename, 'rb')
|
||||||
local data = file:read('*all')
|
local data = file:read('*all')
|
||||||
if #data < bytes*size then
|
if #data < bytes*size then
|
||||||
@ -26,9 +26,49 @@ function mapgen_rivers.load_map(filename, bytes, signed, size)
|
|||||||
end
|
end
|
||||||
file:close()
|
file:close()
|
||||||
|
|
||||||
|
if converter then
|
||||||
|
for i=1, size do
|
||||||
|
map[i] = converter(map[i])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return map
|
return map
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local sbyte = string.byte
|
||||||
|
|
||||||
|
local loader_mt = {
|
||||||
|
__index = function(loader, i)
|
||||||
|
local file = loader.file
|
||||||
|
local bytes = loader.bytes
|
||||||
|
file:seek('set', (i-1)*bytes)
|
||||||
|
local strnum = file:read(bytes)
|
||||||
|
|
||||||
|
local n = sbyte(strnum, 1)
|
||||||
|
if loader.signed and n >= 128 then
|
||||||
|
n = n - 256
|
||||||
|
end
|
||||||
|
|
||||||
|
for j=2, bytes do
|
||||||
|
n = n*256 + sbyte(strnum, j)
|
||||||
|
end
|
||||||
|
|
||||||
|
if loader.conv then
|
||||||
|
n = loader.conv(n)
|
||||||
|
end
|
||||||
|
loader[i] = n
|
||||||
|
return n
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
function mapgen_rivers.interactive_loader(filename, bytes, signed, size, converter)
|
||||||
|
local file = io.open(worldpath .. filename, 'rb')
|
||||||
|
if file then
|
||||||
|
converter = converter or false
|
||||||
|
return setmetatable({file=file, bytes=bytes, signed=signed, size=size, conv=converter}, loader_mt)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function mapgen_rivers.write_map(filename, data, bytes)
|
function mapgen_rivers.write_map(filename, data, bytes)
|
||||||
local size = #data
|
local size = #data
|
||||||
local file = io.open(worldpath .. filename, 'wb')
|
local file = io.open(worldpath .. filename, 'wb')
|
||||||
|
35
polygons.lua
35
polygons.lua
@ -14,34 +14,39 @@ mapgen_rivers.grid = {}
|
|||||||
local X = 1000
|
local X = 1000
|
||||||
local Z = 1000
|
local Z = 1000
|
||||||
|
|
||||||
|
local function offset_converter(o)
|
||||||
|
return (o + 0.5) * (1/256)
|
||||||
|
end
|
||||||
|
|
||||||
-- Try to read file 'size'
|
-- Try to read file 'size'
|
||||||
local sfile = io.open(world_data_path..'size', 'r')
|
local sfile = io.open(world_data_path..'size', 'r')
|
||||||
if sfile then
|
if sfile then
|
||||||
X, Z = tonumber(sfile:read('*l')), tonumber(sfile:read('*l'))
|
X, Z = tonumber(sfile:read('*l')), tonumber(sfile:read('*l'))
|
||||||
sfile:close()
|
sfile:close()
|
||||||
|
|
||||||
minetest.register_on_mods_loaded(function()
|
minetest.register_on_mods_loaded(function()
|
||||||
local grid = mapgen_rivers.grid
|
local grid = mapgen_rivers.grid
|
||||||
grid.dem = mapgen_rivers.load_map('dem', 2, true, X*Z)
|
grid.dem = mapgen_rivers.interactive_loader('dem', 2, true, X*Z)
|
||||||
grid.lakes = mapgen_rivers.load_map('lakes', 2, true, X*Z)
|
grid.lakes = mapgen_rivers.interactive_loader('lakes', 2, true, X*Z)
|
||||||
grid.dirs = mapgen_rivers.load_map('dirs', 1, false, X*Z)
|
grid.dirs = mapgen_rivers.interactive_loader('dirs', 1, false, X*Z)
|
||||||
grid.rivers = mapgen_rivers.load_map('rivers', 4, false, X*Z)
|
grid.rivers = mapgen_rivers.interactive_loader('rivers', 4, false, X*Z)
|
||||||
|
|
||||||
grid.offset_x = mapgen_rivers.load_map('offset_x', 1, true, X*Z)
|
grid.offset_x = mapgen_rivers.interactive_loader('offset_x', 1, true, X*Z, offset_converter)
|
||||||
grid.offset_y = mapgen_rivers.load_map('offset_y', 1, true, X*Z)
|
grid.offset_y = mapgen_rivers.interactive_loader('offset_y', 1, true, X*Z, offset_converter)
|
||||||
end)
|
end)
|
||||||
else
|
else
|
||||||
-- Generate a map!!
|
-- Generate a map!!
|
||||||
local pregenerate = dofile(mapgen_rivers.modpath .. '/pregenerate.lua')
|
local pregenerate = dofile(mapgen_rivers.modpath .. '/pregenerate.lua')
|
||||||
minetest.register_on_mods_loaded(pregenerate)
|
minetest.register_on_mods_loaded(function()
|
||||||
end
|
pregenerate()
|
||||||
|
local offset_x = mapgen_rivers.grid.offset_x
|
||||||
minetest.register_on_mods_loaded(function()
|
local offset_y = mapgen_rivers.grid.offset_y
|
||||||
local offset_x, offset_y = mapgen_rivers.grid.offset_x, mapgen_rivers.grid.offset_y
|
for i=1, X*Z do
|
||||||
for i=1, #offset_x do
|
offset_x[i] = offset_converter(offset_x[i])
|
||||||
offset_x[i] = (offset_x[i]+0.5) * (1/256)
|
offset_y[i] = offset_converter(offset_y[i])
|
||||||
offset_y[i] = (offset_y[i]+0.5) * (1/256)
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
mapgen_rivers.grid.size = {x=X, y=Z}
|
mapgen_rivers.grid.size = {x=X, y=Z}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user