2022-05-15 16:42:19 +00:00
local wea = worldeditadditions
local Vector3 = wea.Vector3
-- ███ ███ ███████ ████████ █████ ██████ █████ ██ ██ ███████
-- ████ ████ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-- ██ ████ ██ █████ ██ ███████ ██████ ███████ ██ ██ ███████
-- ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██
-- ██ ██ ███████ ██ ██ ██ ██████ ██ ██ ███████ ███████ ███████
--- Renders 2 or more metaballs with the given node and threshold value.
-- direction the point should point.
-- @param metaballs [{pos: Vector3, radius: number}] Aa list of metaballs to render. Each metaball should be a table with 2 properties: pos - the position of the centre of the metaball as a Vector3, and radius - the radius of the metaball.
-- @param replace_node string The fully qualified name of the node to use to make the dome with.
2022-05-16 00:01:01 +00:00
local function render ( metaballs , replace_node , threshold )
2022-05-15 16:42:19 +00:00
local pos1 , pos2
if not threshold then threshold = 1 end
for i , metaball in ipairs ( metaballs ) do
local pos1_c = metaball.pos - metaball.radius
local pos2_c = metaball.pos + metaball.radius
if i == 1 then
pos1 = pos1_c
pos2 = pos2_c
end
pos1 = Vector3.min ( pos1 , pos1_c )
pos2 = Vector3.max ( pos2 , pos2_c )
end
-- pos2 will always have the highest co-ordinates now
-- Fetch the nodes in the specified area
local manip , area = worldedit.manip_helpers . init ( pos1 , pos2 )
local data = manip : get_data ( )
local node_id_replace = minetest.get_content_id ( replace_node )
local replaced = 0
for z = pos2.z , pos1.z , - 1 do
for y = pos2.y , pos1.y , - 1 do
for x = pos2.x , pos1.x , - 1 do
local pos_here = Vector3.new ( x , y , z )
local metaball_sum = 0
for i , metaball in ipairs ( metaballs ) do
local distance_sq = ( metaball.pos - pos_here ) : length_squared ( )
local radius_sq = metaball.radius * metaball.radius
local falloff = ( 1 / ( distance_sq / radius_sq ) ) ^ 2
metaball_sum = metaball_sum + falloff
end
2022-05-16 19:14:31 +00:00
if metaball_sum >= threshold then
2022-05-15 16:42:19 +00:00
data [ area : index ( x , y , z ) ] = node_id_replace
replaced = replaced + 1
end
end
end
end
-- Save the modified nodes back to disk & return
worldedit.manip_helpers . finish ( manip , data )
return true , replaced
end
2022-05-16 00:01:01 +00:00
return render