mgmini/api.lua

93 lines
2.1 KiB
Lua

local function scale_noise(noise,scale)
noise = table.copy(noise)
local s = noise.spread
s.x = s.x / scale.x
s.z = s.z / scale.z
if (noise.dims and noise.dims == 2) then
s.y = s.y / scale.z
else
s.y = s.y / scale.y
end
if (dims == 2 and noise.mgmini_scale_values ~= false)
or (dims == 3 and noise.mgmini_scale_values) then
noise.scale = noise.scale / scale.y
noise.offset = noise.offset / scale.y
else
return noise
end
local function smallest_octave_scale(noise)
if (noise.lacunarity or 2) < 1 then
return noise.spread
end
local weight = math.pow((1/(noise.lacunarity or 2.0)),(noise.octaves or 1)-1)
return vector.multiply((noise.spread or {x=0,y=0,z=0}),weight)
end
local function average_value(noise)
if not string.match(noise.flags or "",".absvalue.") then
return noise.offset or 0
end
local weight = 0
for i=1,(noise.octaves or 0) do
weight = weight + math.pow((noise.persistance or 0),i-1)
end
return (noise.offset or 0) + (weight * (noise.scale or 0))
end
local function minify_function(func,scale)
return function(noise,map_size)
if type(noise) ~= "table" then
minetest.log("error","Old format defintions are not supported")
error()
end
local snoise = scale_noise(noise,scale)
local nscale = smallest_octave_scale(snoise)
if nscale.x < 1
or nscale.y < 1
or nscale.z < 1 then
if snoise.lacunarity > 1
and snoise.octaves > 1 then
snoise.octaves = 1
nscale = smallest_octave_scale(snoise)
if nscale.x < 1
or nscale.y < 1
or nscale.z < 1 then
snoise = mgmini.ave_val_def(average_value(noise))
end
else
snoise = mgmini.ave_val_def(average_value(noise))
end
end
return func(snoise,map_size)
end
end
local minified = false
local miniscale = nil
mgmini.minify = function(self,scale)
if minified then
return miniscale
end
minetest.get_perlin_map = minify_function(minetest.get_perlin_map,scale)
PerlinNoiseMap = minify_function(PerlinNoiseMap,scale)
minetest.get_perlin = minify_function(minetest.get_perlin,scale)
PerlinNoise = minify_function(PerlinNoise,scale)
minified = true
miniscale = scale
return miniscale
end