diff options
Diffstat (limited to 'server/noise.lua')
-rw-r--r-- | server/noise.lua | 34 |
1 files changed, 13 insertions, 21 deletions
diff --git a/server/noise.lua b/server/noise.lua index 1480448..8a83b60 100644 --- a/server/noise.lua +++ b/server/noise.lua @@ -1,11 +1,12 @@ local Pos = require"common.coords".Pos +local class = require"common.class" local tau = 2*math.pi math.randomseed(os.time()) local function random_unit_vec() local theta = math.random()*tau - return Pos.make(math.cos(theta),math.sin(theta)) + return Pos:make(math.cos(theta),math.sin(theta)) end local function lerp(a,b,t) return (1-t)*a + t*b end local function smoothstep(x) @@ -15,14 +16,13 @@ local function smoothstep(x) end local function slerp(a,b,t) return lerp(a,b,smoothstep(t)) end -local NoiseGen = {} -NoiseGen.__index = NoiseGen -function NoiseGen.make() +local PerlinNoise = class() +function PerlinNoise.make(cls) local grid = {} setmetatable(grid,{__index=function(t,k) t[k] = {} return t[k] end}) - return setmetatable({grid=grid},NoiseGen) + return setmetatable({grid=grid},cls) end -function NoiseGen.vertex(self,ix,iy) +function PerlinNoise.vertex(self,ix,iy) local v = self.grid[ix][iy] if v then return v end vv = random_unit_vec() @@ -30,7 +30,7 @@ function NoiseGen.vertex(self,ix,iy) return vv end -function NoiseGen.at(self,x,y) +function PerlinNoise.at(self,x,y) local x0 = math.floor(x) local y0 = math.floor(y) local x1 = x0 + 1 @@ -41,7 +41,7 @@ function NoiseGen.at(self,x,y) local v10 = self:vertex(x1,y0) local v11 = self:vertex(x1,y1) - local p = Pos.make + local p = function(...) return Pos:make(...) end local d00 = v00:dot(p(x-x0,y-y0)) local d01 = v01:dot(p(x-x0,y-y1)) local d10 = v10:dot(p(x-x1,y-y0)) @@ -53,17 +53,9 @@ function NoiseGen.at(self,x,y) return z end -local NoiseAgg = {} -NoiseAgg.__index = NoiseAgg -function NoiseAgg.make(things) - return setmetatable({things=things or {}},NoiseAgg) -end -function NoiseAgg.make_perlin_octaves(nocts) - local things = {} - for i=1,nocts do - table.insert(things,{amp=2^i,scale=2^(nocts-i),gen=NoiseGen.make()}) - end - return NoiseAgg.make(things) +local NoiseAgg = class() +function NoiseAgg.make(cls,things) + return setmetatable({things=things or {}},cls) end function NoiseAgg.at(self,x,y) local n = 0 @@ -72,7 +64,7 @@ function NoiseAgg.at(self,x,y) for _,thing in ipairs(self.things) do local gen,scale,amp = thing.gen,thing.scale,thing.amp n = n + amp - t = t + gen:at(x*scale,y*scale)*amp + t = t + gen:at(x/scale,y/scale)*amp end return t/n end @@ -93,4 +85,4 @@ end -- io.write("\n") -- end -return {NoiseGen=NoiseGen,NoiseAgg=NoiseAgg} +return {PerlinNoise=PerlinNoise,NoiseAgg=NoiseAgg} |