From 9c02ffbd04ced312f1faa85e6e9b3b5f2d6c1bb1 Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Thu, 11 Mar 2021 21:04:02 +0000 Subject: [PATCH 1/6] README: update quick reference --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b3de001..6efd6b5 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,12 @@ The detailed explanations have moved! Check them out [here](https://github.com/s - [`//count`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#count) ### Selection -- [`//srect [ []] `](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#srect-axis1-axis2-length) -- [`//sstack`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#sstack) -- [`//spush`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spush) -- [`//spop`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spop) + - [`//scol [ ] `](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#scol-axis1--length) + - [`//srect [ []] `](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#srect-axis1-axis2-length) + - [`//scube [ [ []]] `](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#scube-axis1-axis2-axis3-length) + - [`//sstack`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#sstack) + - [`//spush`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spush) + - [`//spop`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#spop) ### Meta - [`//multi ....`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#multi-command_a-command_b-command_c-) From d20764cffdf96c5eba25675a7a2471479fd6ac07 Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Sat, 13 Mar 2021 00:37:26 +0000 Subject: [PATCH 2/6] Add pure Lua perlin implementation, but it's untested. --- worldeditadditions/lib/noise/engines.lua | 3 - .../lib/noise/engines/perlin.lua | 99 +++++++++++++++++++ 2 files changed, 99 insertions(+), 3 deletions(-) delete mode 100644 worldeditadditions/lib/noise/engines.lua create mode 100644 worldeditadditions/lib/noise/engines/perlin.lua diff --git a/worldeditadditions/lib/noise/engines.lua b/worldeditadditions/lib/noise/engines.lua deleted file mode 100644 index 7d172fd..0000000 --- a/worldeditadditions/lib/noise/engines.lua +++ /dev/null @@ -1,3 +0,0 @@ -function worldeditadditions.noise.engine_perlin_2d(x, y) - -end diff --git a/worldeditadditions/lib/noise/engines/perlin.lua b/worldeditadditions/lib/noise/engines/perlin.lua new file mode 100644 index 0000000..88196e4 --- /dev/null +++ b/worldeditadditions/lib/noise/engines/perlin.lua @@ -0,0 +1,99 @@ +local wea = worldeditadditions + +-- original code by Ken Perlin: http://mrl.nyu.edu/~perlin/noise/ +-- Port from this StackOverflow answer: https://stackoverflow.com/a/33425812/1460422 + + +local function BitAND(a, b) --Bitwise and + local p, c = 1, 0 + while a > 0 and b > 0 do + local ra, rb = a%2, b%2 + if ra + rb > 1 then c = c + p end + a, b, p = (a - ra) / 2, (b - rb) / 2, p * 2 + end + return c +end + +local function fade(t) + return t * t * t * (t * (t * 6 - 15) + 10) +end + +local function lerp(t, a, b) + return a + t * (b - a) +end + +local function grad(hash, x, y, z) + local h = BitAND(hash, 15) + local u = h < 8 and x or y + local v = h < 4 and y or ((h == 12 or h == 14) and x or z) + return ((h and 1) == 0 and u or - u) + ((h and 2) == 0 and v or - v) +end + + +wea.noise.perlin = {} +wea.noise.perlin.p = {} +wea.noise.perlin.permutation = { + 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, + 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, + 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, + 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, + 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, + 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, + 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, + 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, + 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, + 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, + 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, + 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, + 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, + 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, + 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, + 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 +} +wea.noise.perlin.size = 256 +wea.noise.perlin.gx = {} +wea.noise.perlin.gy = {} +wea.noise.perlin.randMax = 256 + +--- Creates a new perlin instance. +-- @return perlin A new perlin instance. +function wea.noice.perlin.new() + local instance = {} + setmetatable(instance, wea.noise.perlin) + return instance +end + +function wea.noise.perlin:load() + for i = 1, self.size do + self.p[i] = self.permutation[i] + self.p[255 + i] = self.p[i] + end +end + +function wea.noise.perlin:noise( x, y, z ) + local X = BitAND(math.floor(x), 255) + 1 + local Y = BitAND(math.floor(y), 255) + 1 + local Z = BitAND(math.floor(z), 255) + 1 + + x = x - math.floor(x) + y = y - math.floor(y) + z = z - math.floor(z) + local u = fade(x) + local v = fade(y) + local w = fade(z) + local A = self.p[X] + Y + local AA = self.p[A] + Z + local AB = self.p[A + 1] + Z + local B = self.p[X + 1] + Y + local BA = self.p[B] + Z + local BB = self.p[B + 1] + Z + + return lerp(w, lerp(v, lerp(u, grad(self.p[AA ], x, y, z ), + grad(self.p[BA ], x - 1, y, z )), + lerp(u, grad(self.p[AB ], x, y - 1, z ), + grad(self.p[BB ], x - 1, y - 1, z ))), + lerp(v, lerp(u, grad(self.p[AA + 1], x, y, z - 1), + grad(self.p[BA + 1], x - 1, y, z - 1)), + lerp(u, grad(self.p[AB + 1], x, y - 1, z - 1), + grad(self.p[BB + 1], x - 1, y - 1, z - 1)))) +end From 3c4f8e463b9136039b4727f30fb8b61f1d118cf7 Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Mon, 15 Mar 2021 23:37:46 +0000 Subject: [PATCH 3/6] README: ultimate final say --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 6efd6b5..46e3ff3 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,8 @@ Contributions are welcome! Please state in your pull request(s) that you release Please also make sure that the logic for every new command has it's own file. For example, the logic for `//floodfill` goes in `worldeditadditions/floodfill.lua`, the logic for `//overlay` goes in `worldeditadditions/overlay.lua`, etc. +I, Starbeamrainbowlabs (@sbrl), have the ultimate final say. + ## WorldEditAdditions around the web Are you using WorldEditAdditions for a project? Open an issue and I'll add your project to the below list! From a1911037d2543a7baab9df82591410be26690e6a Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Tue, 16 Mar 2021 21:39:12 +0000 Subject: [PATCH 4/6] Fill out noise.make_2d, but it's untested Next, we need to do the make_3d version, followed by the plumbing to worldeditadditions.noise(), followed by the chat command ....there's a lot to do. --- .../lib/noise/engines/perlin.lua | 3 +- worldeditadditions/lib/noise/make_2d.lua | 31 +++++++++++++++- worldeditadditions/lib/noise/noise.lua | 4 +- worldeditadditions/lib/noise/noise_params.lua | 37 +++++++++++++++++++ 4 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 worldeditadditions/lib/noise/noise_params.lua diff --git a/worldeditadditions/lib/noise/engines/perlin.lua b/worldeditadditions/lib/noise/engines/perlin.lua index 88196e4..29fa779 100644 --- a/worldeditadditions/lib/noise/engines/perlin.lua +++ b/worldeditadditions/lib/noise/engines/perlin.lua @@ -57,9 +57,10 @@ wea.noise.perlin.randMax = 256 --- Creates a new perlin instance. -- @return perlin A new perlin instance. -function wea.noice.perlin.new() +function wea.noise.perlin.new() local instance = {} setmetatable(instance, wea.noise.perlin) + instance:load() return instance end diff --git a/worldeditadditions/lib/noise/make_2d.lua b/worldeditadditions/lib/noise/make_2d.lua index 9810d44..7f8a7bb 100644 --- a/worldeditadditions/lib/noise/make_2d.lua +++ b/worldeditadditions/lib/noise/make_2d.lua @@ -4,6 +4,33 @@ -- ██ ████ ██ ███████ █████ █████ █████ ██ ██ -- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ -- ██ ██ ██ ██ ██ ██ ███████ ███████ ███████ ██████ -function worldeditadditions.noise.make_2d(size, noise_func) - -- TODO: Follow https://www.redblobgames.com/maps/terrain-from-noise/ + + +-- Generate a flat array of 2D noise. +-- Written with help from https://www.redblobgames.com/maps/terrain-from-noise/ +-- @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, params) + params = worldeditadditions.noise.params_apply_default(params) + + local result = {} + + local generator; + if params.algorithm == "perlin" then + generator = worldeditadditions.noise.perlin.new() + else -- We don't have any other generators just yet + return false, "Error: Unknown noise algorithm '"..params.."'." + end + + for x=params.offset.x, params.offset.x+size.x do + for y=params.offset.y, params.offset.y+size.y do + local result = 0 + for i,params_octave in ipairs(params) do + result = result + (generator:noise(x * scale.x, y * scale.y, 0) ^ params.exponent) * params.multiply + params.add + end + result[y*size.x + x] = result + end + end + + return result end diff --git a/worldeditadditions/lib/noise/noise.lua b/worldeditadditions/lib/noise/noise.lua index 30b2549..e7720d7 100644 --- a/worldeditadditions/lib/noise/noise.lua +++ b/worldeditadditions/lib/noise/noise.lua @@ -1,3 +1,5 @@ worldeditadditions.noise = {} -dofile(worldeditadditions.modpath.."/lib/noise/alg_perlin.lua") +dofile(worldeditadditions.modpath.."/lib/noise/noise_params.lua") +dofile(worldeditadditions.modpath.."/lib/noise/make_2d.lua") +dofile(worldeditadditions.modpath.."/lib/noise/engines/perlin.lua") diff --git a/worldeditadditions/lib/noise/noise_params.lua b/worldeditadditions/lib/noise/noise_params.lua new file mode 100644 index 0000000..e03546d --- /dev/null +++ b/worldeditadditions/lib/noise/noise_params.lua @@ -0,0 +1,37 @@ +--- Makes sure that the default settings are all present in the given params table. +-- This way not all params have to be specified by the user. +-- @param params table The params table generated from the user's input. +-- @return table A NEW table with all the missing properties filled in with the default values. +function worldeditadditions.noise.params_apply_default(params) + local params_default = { + algorithm = "perlin", + -- Zooms in and out + scale = vector.new(1, 1, 1), + -- Offset the generated noise by this vector. + offset = vector.new(0, 0, 0), + -- Apply this exponent to the resulting noise value + exponent = 1, + -- Multiply the resulting noise value by this number. Changes the "strength" of the noise + multiply = 1, + -- Add this number to the resulting noise value + add = 0 + -- The seed to generate the noise with. nil = randomly chosen + -- The perlin generator isn't currently seedable :-/ + -- seed = nil + } + + if not params[1] then params = { params } end + + -- If params[1] is thing, this is a list of params + -- This might be a thing if we're dealingw ith multiple octaves + for i,params_el in ipairs(params) do + local default_copy = worldeditadditions.shallowcopy(params_default) + worldeditadditions.table_apply( + params_el, + default_copy + ) + params[i] = default_copy + end + + return params +end From c10880f9ff39095daa9a4f3f53015927ea244b3b Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Wed, 17 Mar 2021 21:38:36 +0000 Subject: [PATCH 5/6] README: add news note --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 46e3ff3..1a4223f 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ If you can dream of it, it probably belongs here! +**Important News: The `master` branch has been renamed to `main`, to follow the new standard across the Git ecosystem. If you've installed _WorldEditAadditions_ through git, you will need to re-clone the repository.** + ![Screenshot](https://raw.githubusercontent.com/sbrl/Minetest-WorldEditAdditions/master/screenshot.png) _(Do you have a cool build that you used WorldEditAdditions to build? [Get in touch](https://github.com/sbrl/Minetest-WorldEditAdditions/issues/new) and I'll feature your screenshot here!)_ From 9bda3bf05a1e098de0a9db3ee9e9aa93425229c6 Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Wed, 17 Mar 2021 22:04:09 +0000 Subject: [PATCH 6/6] README: add installation instructions for #46. --- README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/README.md b/README.md index 1a4223f..707b8e9 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,33 @@ The detailed explanations have moved! Check them out [here](https://github.com/s - [`//farwand skip_liquid (true|false) | maxdist `](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#farwand-skip_liquid-truefalse--maxdist-number) +## Installation +You can install _WorldEditAadditions_ in multiple ways: + +### Through ContentDB +WorldEditAdditions is on ContentDB here: . + +### Through the latest release +You can get a copy of WorldEditAdditions by downloading the source code for the [latest release](https://github.com/sbrl/Minetest-WorldEditAdditions/releases/latest), but this is not recommended because it takes additional effort to update to the latest version. + +### Through Git +You can also clone this git repository. Note that the `main` branch is not considered to be stable at all times - though it shouldn't crash. It is recommended that you checkout a release to ensure stability. Do that like so: + +```bash +# First, clone the repository +git clone https://github.com/sbrl/Minetest-WorldEditAdditions.git WorldEditAdditions +cd WorldEditAdditions +# Then, checkout the latest release on Linux: +git checkout "$(git describe --tags --abbrev=0)"; +``` + +Windows users, you'll need to check the [releases page](https://github.com/sbrl/Minetest-WorldEditAdditions/releases) and find the name of the latest release, then do this instead of the `git checkout` above: + +```bash +git checkout TAG_NAME_HERE +``` + + ## Troubleshooting If you're experiencing issues with this mod, try checking this FAQ before opening an issue.