From 03038689e2eb81d467db367b49da6f0a79f504aa Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Tue, 13 Jul 2021 00:54:52 +0100 Subject: [PATCH] Add infrared noise --- Chat-Command-Reference.md | 3 +- .../lib/noise/engines/infrared.lua | 35 +++++++++++++++++++ worldeditadditions/lib/noise/engines/init.lua | 5 +-- worldeditadditions/lib/noise/make_2d.lua | 2 ++ 4 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 worldeditadditions/lib/noise/engines/infrared.lua diff --git a/Chat-Command-Reference.md b/Chat-Command-Reference.md index 3693be5..5a8fda3 100644 --- a/Chat-Command-Reference.md +++ b/Chat-Command-Reference.md @@ -519,7 +519,8 @@ Algorithm | Description `perlin` | Perlin noise. Functional, but currently contains artefacts I'm having difficulty tracking down. `sin` | A sine wave created with `math.sin()`. `white` | Random white noise. -`red` | Red noise - has a lower frequency than white noise. +`red` | Red noise - has a lower frequency than white noise. +`infrared` | Even smoother than red noise. Tends to also be quite flat unless you use a slightly higher `apply` value (e.g. `20`). When specifying algorithm names, the `algorithm` parameter name is optional. For example, the following are both equivalent: diff --git a/worldeditadditions/lib/noise/engines/infrared.lua b/worldeditadditions/lib/noise/engines/infrared.lua new file mode 100644 index 0000000..60b04f8 --- /dev/null +++ b/worldeditadditions/lib/noise/engines/infrared.lua @@ -0,0 +1,35 @@ +local wea = worldeditadditions + +local White = dofile(wea.modpath.."/lib/noise/engines/white.lua") + +local Infrared = {} +Infrared.__index = Infrared + + +function Infrared.new(seed) + local result = { + seed = seed or math.random(), + white = White.new(seed), + window = 2 + } + setmetatable(result, Infrared) + return result +end + +function Infrared:noise( x, y, z ) + local values = { } + for nx=x-self.window,x+self.window do + for ny=y-self.window,y+self.window do + for nz=z-self.window,z+self.window do + table.insert(values, self.white:noise(nx, ny, nz)) + + print("DEBUG nx", nx, "ny", ny, "nz", nz, "value", value) + end + end + end + for i,value in ipairs(values) do + end + return wea.average(values) +end + +return Infrared diff --git a/worldeditadditions/lib/noise/engines/init.lua b/worldeditadditions/lib/noise/engines/init.lua index 8918c8b..38cd625 100644 --- a/worldeditadditions/lib/noise/engines/init.lua +++ b/worldeditadditions/lib/noise/engines/init.lua @@ -2,10 +2,11 @@ local wea = worldeditadditions return { - available = { "perlin", "sin", "white", "red" }, + available = { "perlin", "sin", "white", "red", "infrared" }, Perlin = dofile(wea.modpath.."/lib/noise/engines/perlin.lua"), Sin = dofile(wea.modpath.."/lib/noise/engines/sin.lua"), White = dofile(wea.modpath.."/lib/noise/engines/white.lua"), - Red = dofile(wea.modpath.."/lib/noise/engines/red.lua") + Red = dofile(wea.modpath.."/lib/noise/engines/red.lua"), + Infrared = dofile(wea.modpath.."/lib/noise/engines/infrared.lua") -- TODO: Follow https://www.redblobgames.com/articles/noise/introduction.html and implement different colours of noise (*especially* red and pink noise) } diff --git a/worldeditadditions/lib/noise/make_2d.lua b/worldeditadditions/lib/noise/make_2d.lua index 06043e4..92e4972 100644 --- a/worldeditadditions/lib/noise/make_2d.lua +++ b/worldeditadditions/lib/noise/make_2d.lua @@ -23,6 +23,8 @@ function worldeditadditions.noise.make_2d(size, start_pos, params) generator = wea.noise.engines.White.new() elseif layer.algorithm == "red" then generator = wea.noise.engines.Red.new() + elseif layer.algorithm == "infrared" then + generator = wea.noise.engines.Infrared.new() else -- We don't have any other generators just yet return false, "Error: Unknown noise algorithm '"..tostring(layer.algorithm).."' in layer "..layer_i.." of "..#params.." (available algorithms: "..table.concat(wea.noise.engines.available, ", ")..")." end