adv_boxes/init.lua

70 lines
2.1 KiB
Lua

--Lib : Advanced Nodeboxes[adv_boxes]
--© Lars Müller @appguru.eu, licensed under CC-BY-SA 3.0
--Rotates nodeboxes around the y-axis
--Defaults--
CONNECTIONS={2, 3, 1, 0}
RECTANGLE={0,1,1,0,1,1,0,0}
STEPS=4 --Accuracy of rotated nodeboxes
function rotate_point(x, y, degrees)
local deg = math.deg(math.atan2(y, x))
local distance = math.sqrt(x * x + y * y)
if (deg < 0) then
deg = deg+360
end
deg = deg+degrees;
if (deg > 360) then
deg = deg-360
end
if (deg < 0) then
deg = deg+360
end
deg = math.rad(deg);
return {distance * math.cos(deg), distance * math.sin(deg)};
end
function rotateNodeboxYAxis(nodebox, degrees)
local rect={nodebox[1], nodebox[3], nodebox[4], nodebox[6]}
local corners={}
for value = 1,8,2 do
local x=rect[1+RECTANGLE[value]]
local y=rect[3+RECTANGLE[value+1]]
local rotated_point=rotate_point(x,y,degrees)
corners[value]=rotated_point[0]
corners[value+1]=rotated_point[1]
end
local index=1
local rectangles={}
for value = 1,8,2 do
local x = corners[value]
local y = corners[value+1]
local dif_x = corners[CONNECTIONS[value]*2] - x
local dif_y = corners[CONNECTIONS[value]*2+1] - y
local width = dif_x / STEPS
local height = dif_y / STEPS
for i = 1,STEPS,1 do
rectangles[index]={x,y,x+width,y+height}
x = x+width
y = y+height
index=index+1
end
end
local nodeboxes={}
index=1
for rectangle in pairs(rectangles) do
nodeboxes[index]={math.min(rectangle[1], rectangle[3]),nodebox[2],math.min(rectangle[2], rectangle[4]),math.max(rectangle[1], rectangle[3]),nodebox[5],math.max(rectangle[2], rectangle[4])}
index=index+1
end
return nodeboxes
end
function rotateMultipleNodeboxesYAxis(nodeboxes, degrees)
local result={}
for nodebox in pairs(nodeboxes) do
result=table.concat(result, rotateNodeboxYAxis(nodebox,degrees))
end
return result
end
minetest.chat_send_all(rotateNodeboxYAxis({-0.5,-0.5,-0.5,0.5,0.5,0.5},45))