mirror of
https://github.com/Mjokfox/WorldEdit_terraform.git
synced 2024-12-04 15:14:01 -05:00
Compare commits
3 commits
b546bbf085
...
dbb8b7d2c4
Author | SHA1 | Date | |
---|---|---|---|
|
dbb8b7d2c4 | ||
|
53a3937e45 | ||
|
27319454b0 |
4 changed files with 35 additions and 39 deletions
53
init.lua
53
init.lua
|
@ -1,26 +1,17 @@
|
||||||
local S = minetest.get_translator("worldedit_commands")
|
local S = minetest.get_translator("worldedit_commands")
|
||||||
|
|
||||||
local terraform = {}
|
local worldedit_terraform = {}
|
||||||
|
|
||||||
mh = worldedit.manip_helpers
|
mh = worldedit.manip_helpers
|
||||||
|
|
||||||
local radius_limit = minetest.settings:get("radius_limit")
|
local radius_limit = tonumber(minetest.settings:get("worldedit_terraform_radius_limit")) or 10
|
||||||
|
local threshold_multiplier = tonumber(minetest.settings:get("worldedit_terraform_threshold_multiplier")) or 20
|
||||||
|
local gauss_sigma = tonumber(minetest.settings:get("worldedit_terraform_gauss_sigma")) or 4
|
||||||
|
local guass_radius = tonumber(minetest.settings:get("worldedit_terraform_guass_radius")) or 2
|
||||||
|
|
||||||
if (radius_limit == nil) then
|
if (threshold_multiplier > 100) then
|
||||||
radius_limit = 10
|
threshold_multiplier = 100
|
||||||
minetest.settings:set("radius_limit",10)
|
minetest.settings:set("worldedit_terraform_threshold_multiplier",100)
|
||||||
else
|
|
||||||
radius_limit = tonumber(radius_limit)
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
local threshold_multiplier = minetest.settings:get("threshold_multiplier")
|
|
||||||
|
|
||||||
if (threshold_multiplier == nil) then
|
|
||||||
threshold_multiplier = 1
|
|
||||||
minetest.settings:set("threshold_multiplier",1)
|
|
||||||
else
|
|
||||||
threshold_multiplier = tonumber(threshold_multiplier)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function createGaussianKernel(radius, sigma)
|
local function createGaussianKernel(radius, sigma)
|
||||||
|
@ -53,12 +44,11 @@ local function createGaussianKernel(radius, sigma)
|
||||||
return kernel
|
return kernel
|
||||||
end
|
end
|
||||||
|
|
||||||
local kernelradius = 4
|
local kernel = createGaussianKernel(guass_radius, gauss_sigma)
|
||||||
local kernel = createGaussianKernel(kernelradius, 2)
|
|
||||||
|
|
||||||
terraform.terraform = function(pos,radius,threshold,shape)
|
worldedit_terraform.terraform = function(pos,radius,threshold,shape)
|
||||||
|
|
||||||
local manip, area = mh.init_radius(pos, radius+kernelradius)
|
local manip, area = mh.init_radius(pos, radius+guass_radius)
|
||||||
|
|
||||||
local data = mh.get_empty_data(area)
|
local data = mh.get_empty_data(area)
|
||||||
|
|
||||||
|
@ -68,14 +58,14 @@ terraform.terraform = function(pos,radius,threshold,shape)
|
||||||
|
|
||||||
local function convolute(conpos)
|
local function convolute(conpos)
|
||||||
local sum = 0
|
local sum = 0
|
||||||
for kx = -kernelradius, kernelradius do
|
for kx = -guass_radius, guass_radius do
|
||||||
for ky = -kernelradius, kernelradius do
|
for ky = -guass_radius, guass_radius do
|
||||||
for kz = -kernelradius, kernelradius do
|
for kz = -guass_radius, guass_radius do
|
||||||
local temppos = vector.new(conpos.x + kx, conpos.y + ky, conpos.z + kz)
|
local temppos = vector.new(conpos.x + kx, conpos.y + ky, conpos.z + kz)
|
||||||
local node = manip:get_node_at(temppos)
|
local node = manip:get_node_at(temppos)
|
||||||
if node.name ~= "ignore" then
|
if node.name ~= "ignore" then
|
||||||
if node.name ~= "air" then
|
if node.name ~= "air" then
|
||||||
sum = sum + kernel[kx + kernelradius + 1][ky + kernelradius + 1][kz + kernelradius + 1]
|
sum = sum + kernel[kx + guass_radius + 1][ky + guass_radius + 1][kz + guass_radius + 1]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -107,7 +97,7 @@ terraform.terraform = function(pos,radius,threshold,shape)
|
||||||
mh.finish(manip, data)
|
mh.finish(manip, data)
|
||||||
end
|
end
|
||||||
|
|
||||||
terraform.check_terraform = function(param)
|
worldedit_terraform.check_terraform = function(param)
|
||||||
local found, _, radius, threshold, shape = param:find("^(%d+)%s+(%d+)%s+(%a+)$")
|
local found, _, radius, threshold, shape = param:find("^(%d+)%s+(%d+)%s+(%a+)$")
|
||||||
if found == nil then
|
if found == nil then
|
||||||
return false
|
return false
|
||||||
|
@ -117,16 +107,17 @@ terraform.check_terraform = function(param)
|
||||||
if(radius > radius_limit) then radius = radius_limit end
|
if(radius > radius_limit) then radius = radius_limit end
|
||||||
if(threshold > 100) then threshold = 100 end
|
if(threshold > 100) then threshold = 100 end
|
||||||
if(shape == "cube") then shape = true else shape = false end
|
if(shape == "cube") then shape = true else shape = false end
|
||||||
return true, radius, ((threshold/500)*threshold_multiplier)+0.4, shape
|
threshold = 0.5-(threshold_multiplier/200)+((threshold_multiplier*threshold)/10000)
|
||||||
|
return true, radius, threshold, shape
|
||||||
end
|
end
|
||||||
|
|
||||||
worldedit.register_command("terraform", {
|
worldedit.register_command("terraform", {
|
||||||
params = "<radius> <shape> <threshold offset>",
|
params = "<radius> <threshold offset> <shape>",
|
||||||
description = S("Terraform the blocks in <shape>(true = cube, false = sphere) at WorldEdit position 1 with radius <radius> and <threshold> [0,100], <radius> is limited to conf max radius."),
|
description = S("Terraform the blocks in <shape>(\"cube\" or \"sphere\") at WorldEdit position 1 with radius <radius> and <threshold> [0,100], <radius> is limited to configured max radius."),
|
||||||
privs = {worldedit=true},
|
privs = {worldedit=true},
|
||||||
require_pos = 1,
|
require_pos = 1,
|
||||||
parse = terraform.check_terraform,
|
parse = worldedit_terraform.check_terraform,
|
||||||
func = function(name, radius, threshold,shape)
|
func = function(name, radius, threshold,shape)
|
||||||
terraform.terraform(worldedit.pos1[name], radius, threshold, shape)
|
worldedit_terraform.terraform(worldedit.pos1[name], radius, threshold, shape)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
4
mod.conf
4
mod.conf
|
@ -1,5 +1,5 @@
|
||||||
name = terraform
|
name = worldedit_terraform
|
||||||
title = terraform
|
title = worldedit_terraform
|
||||||
depends = worldedit
|
depends = worldedit
|
||||||
optional_depends = default
|
optional_depends = default
|
||||||
description = a terraform command for worldedit
|
description = a terraform command for worldedit
|
||||||
|
|
|
@ -12,8 +12,10 @@ shape: Shape of the terraform area, either "sphere" or "cube".
|
||||||
|
|
||||||
## Settings
|
## Settings
|
||||||
|
|
||||||
radius_limit (int): Maximum allowable radius for the terraform operation.\
|
radius_limit: Maximum allowable radius for the terraform operation.\
|
||||||
threshold_multiplier (int): Multiplier applied to the threshold value.
|
threshold_multiplier: Multiplier applied to the threshold value.\
|
||||||
|
gauss_sigma: The sigma value used in the generation of the guassian kernel.\
|
||||||
|
guass_radius: The radius of the kernel.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
# I recommend not going much higher than 10 as it gets really slow
|
worldedit_terraform_radius_limit (The maximum radius of the terraform command) int 10
|
||||||
radius_limit (the maximum radius the terraform command can have) int 10
|
# 20 is default, which ranges the threshold between 0.4 and 0.6 for 0-100 in the command. 0 disables it, 100 ranges it between 0 and 1
|
||||||
# A multiplier for the threshold value for the convolution algorithm
|
worldedit_terraform_threshold_multiplier (Multiplier for the threshold) int 20
|
||||||
threshold_multiplier (the internal multiplier for the block placement threshold) int 1
|
# lower makes it more center targeted, high makes it more equally distributed
|
||||||
|
worldedit_terraform_gauss_sigma (The sigma value for the gaussian kernel) int 4
|
||||||
|
# Higher values make it more accurate, but the computation time increase cubic along with the terraform radius
|
||||||
|
worldedit_terraform_guass_radius (The radius for the gaussian kernel) int 2
|
Loading…
Reference in a new issue