From 6f00394d3d5c3faebf8d0e1524d170646f8ade12 Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Sat, 7 Aug 2021 22:30:10 +0100 Subject: [PATCH] Noise: add perlinmt algorithm & set as default --- .luacheckrc | 3 +- worldeditadditions/lib/noise/engines/init.lua | 3 +- .../lib/noise/engines/perlinmt.lua | 32 +++++++++++++++++++ worldeditadditions/lib/noise/make_2d.lua | 4 +++ .../lib/noise/params_apply_default.lua | 2 +- 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 worldeditadditions/lib/noise/engines/perlinmt.lua diff --git a/.luacheckrc b/.luacheckrc index c3a1473..b4d086c 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -31,6 +31,7 @@ read_globals = { "it", "describe", "bonemeal", - "dofile" + "dofile", + "PerlinNoise" } std = "max" diff --git a/worldeditadditions/lib/noise/engines/init.lua b/worldeditadditions/lib/noise/engines/init.lua index 38cd625..2266d70 100644 --- a/worldeditadditions/lib/noise/engines/init.lua +++ b/worldeditadditions/lib/noise/engines/init.lua @@ -2,8 +2,9 @@ local wea = worldeditadditions return { - available = { "perlin", "sin", "white", "red", "infrared" }, + available = { "perlin", "perlinmt", "sin", "white", "red", "infrared" }, Perlin = dofile(wea.modpath.."/lib/noise/engines/perlin.lua"), + PerlinMT = dofile(wea.modpath.."/lib/noise/engines/perlinmt.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"), diff --git a/worldeditadditions/lib/noise/engines/perlinmt.lua b/worldeditadditions/lib/noise/engines/perlinmt.lua new file mode 100644 index 0000000..01d4059 --- /dev/null +++ b/worldeditadditions/lib/noise/engines/perlinmt.lua @@ -0,0 +1,32 @@ +local wea = worldeditadditions + + +local PerlinMT = {} +PerlinMT.__index = PerlinMT + + +function PerlinMT.new(seed, params) + if not seed then seed = 0 end + local result = { + -- Provided by Minetest + engine = PerlinNoise({ + offset = 0, + scale = 1, + spread = {x = 10, y = 10, z = 10}, + seed = seed, + octaves = 1, + persistence = 0.63, + lacunarity = 2.0, + flags = "defaults,absvalue", + }) + } + setmetatable(result, PerlinMT) + return result +end + +function PerlinMT:noise( x, y, z ) + local value = self.engine:get_3d(wea.Vector3.new(x, y, z)) + return value +end + +return PerlinMT diff --git a/worldeditadditions/lib/noise/make_2d.lua b/worldeditadditions/lib/noise/make_2d.lua index 92e4972..2c69949 100644 --- a/worldeditadditions/lib/noise/make_2d.lua +++ b/worldeditadditions/lib/noise/make_2d.lua @@ -11,12 +11,16 @@ local wea = worldeditadditions -- @param size Vector An x/y vector representing the size of the noise area to generate. -- @param params table|table A table of noise params to use to generate the noise. Values that aren't specified are filled in automatically. If a table of tables is specified, it is interpreted as multiple octaves of noise to apply in sequence. function worldeditadditions.noise.make_2d(size, start_pos, params) + params = worldeditadditions.noise.params_apply_default(params) + local result = {} for layer_i, layer in ipairs(params) do local generator if layer.algorithm == "perlin" then generator = wea.noise.engines.Perlin.new() + elseif layer.algorithm == "perlinmt" then + generator = wea.noise.engines.PerlinMT.new() elseif layer.algorithm == "sin" then generator = wea.noise.engines.Sin.new() elseif layer.algorithm == "white" then diff --git a/worldeditadditions/lib/noise/params_apply_default.lua b/worldeditadditions/lib/noise/params_apply_default.lua index e1121ad..a2bf2fd 100644 --- a/worldeditadditions/lib/noise/params_apply_default.lua +++ b/worldeditadditions/lib/noise/params_apply_default.lua @@ -13,7 +13,7 @@ function worldeditadditions.noise.params_apply_default(params) -- - A string in the form of digits followed, then the noise will is remapped from the range 0 - 1 to the range -1 - +1 and multiplied by this number / 2, and then for each pixel in the heightmap the corresponding noise value will be added to it. apply = 5, -- The backend noise algorithm to use - algorithm = "perlin", + algorithm = "perlinmt", -- Zooms in and out scale = wea.Vector3.new(1, 1, 1), -- Offset the generated noise by this vector.