Compare commits

...

3 commits

Author SHA1 Message Date
mjokfox
dbb8b7d2c4
Update readme.md 2024-05-26 16:20:36 +02:00
mjokfox
53a3937e45 name change because "Terraform" mod already exists 2024-05-26 16:13:10 +02:00
mjokfox
27319454b0 more settings, mod friendly naming convention 2024-05-26 15:25:29 +02:00
4 changed files with 35 additions and 39 deletions

View file

@ -1,26 +1,17 @@
local S = minetest.get_translator("worldedit_commands")
local terraform = {}
local worldedit_terraform = {}
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
radius_limit = 10
minetest.settings:set("radius_limit",10)
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)
if (threshold_multiplier > 100) then
threshold_multiplier = 100
minetest.settings:set("worldedit_terraform_threshold_multiplier",100)
end
local function createGaussianKernel(radius, sigma)
@ -53,12 +44,11 @@ local function createGaussianKernel(radius, sigma)
return kernel
end
local kernelradius = 4
local kernel = createGaussianKernel(kernelradius, 2)
local kernel = createGaussianKernel(guass_radius, gauss_sigma)
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)
@ -68,14 +58,14 @@ terraform.terraform = function(pos,radius,threshold,shape)
local function convolute(conpos)
local sum = 0
for kx = -kernelradius, kernelradius do
for ky = -kernelradius, kernelradius do
for kz = -kernelradius, kernelradius do
for kx = -guass_radius, guass_radius do
for ky = -guass_radius, guass_radius do
for kz = -guass_radius, guass_radius do
local temppos = vector.new(conpos.x + kx, conpos.y + ky, conpos.z + kz)
local node = manip:get_node_at(temppos)
if node.name ~= "ignore" 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
@ -107,7 +97,7 @@ terraform.terraform = function(pos,radius,threshold,shape)
mh.finish(manip, data)
end
terraform.check_terraform = function(param)
worldedit_terraform.check_terraform = function(param)
local found, _, radius, threshold, shape = param:find("^(%d+)%s+(%d+)%s+(%a+)$")
if found == nil then
return false
@ -117,16 +107,17 @@ terraform.check_terraform = function(param)
if(radius > radius_limit) then radius = radius_limit end
if(threshold > 100) then threshold = 100 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
worldedit.register_command("terraform", {
params = "<radius> <shape> <threshold offset>",
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."),
params = "<radius> <threshold offset> <shape>",
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},
require_pos = 1,
parse = terraform.check_terraform,
parse = worldedit_terraform.check_terraform,
func = function(name, radius, threshold,shape)
terraform.terraform(worldedit.pos1[name], radius, threshold, shape)
worldedit_terraform.terraform(worldedit.pos1[name], radius, threshold, shape)
end,
})

View file

@ -1,5 +1,5 @@
name = terraform
title = terraform
name = worldedit_terraform
title = worldedit_terraform
depends = worldedit
optional_depends = default
description = a terraform command for worldedit

View file

@ -12,8 +12,10 @@ shape: Shape of the terraform area, either "sphere" or "cube".
## Settings
radius_limit (int): Maximum allowable radius for the terraform operation.\
threshold_multiplier (int): Multiplier applied to the threshold value.
radius_limit: Maximum allowable radius for the terraform operation.\
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

View file

@ -1,4 +1,7 @@
# I recommend not going much higher than 10 as it gets really slow
radius_limit (the maximum radius the terraform command can have) int 10
# A multiplier for the threshold value for the convolution algorithm
threshold_multiplier (the internal multiplier for the block placement threshold) int 1
worldedit_terraform_radius_limit (The maximum radius of the terraform command) 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
worldedit_terraform_threshold_multiplier (Multiplier for the threshold) int 20
# 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