Merge pull request #5 from sbrl/main

Updates + noise
This commit is contained in:
VorTechnix 2021-03-18 17:31:34 -07:00 committed by GitHub
commit a027130917
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 206 additions and 10 deletions

View file

@ -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!)_
@ -57,10 +59,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 [<axis1> [<axis2>]] <length>`](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 [<axis1> ] <length>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#scol-axis1--length)
- [`//srect [<axis1> [<axis2>]] <length>`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#srect-axis1-axis2-length)
- [`//scube [<axis1> [<axis2> [<axis3>]]] <length>`](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 <command_a> <command_b> ....`](https://github.com/sbrl/Minetest-WorldEditAdditions/blob/master/Chat-Command-Reference.md#multi-command_a-command_b-command_c-)
@ -77,6 +81,33 @@ The detailed explanations have moved! Check them out [here](https://github.com/s
- [`//farwand skip_liquid (true|false) | maxdist <number>`](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: <https://content.minetest.net/packages/Starbeamrainbowlabs/worldeditadditions/>.
### 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.
@ -98,6 +129,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!

View file

@ -1,3 +0,0 @@
function worldeditadditions.noise.engine_perlin_2d(x, y)
end

View file

@ -0,0 +1,100 @@
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.noise.perlin.new()
local instance = {}
setmetatable(instance, wea.noise.perlin)
instance:load()
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

View file

@ -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<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

View file

@ -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")

View file

@ -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