pick_and_place/schematic_transpose.lua
Buckaroo Banzai 9cd093046d
schematic rotation (#1)
* schematic rotation

* fixes

* remove auto-rotation code

* schematic encoding v2

* testing

* working encode/decode

* rotate schematic

* spec

* rotate dialog

* skip if rotation == 0

* wip

* wip

* wip

* fix order

* fix metadata rotation

---------

Co-authored-by: BuckarooBanzay <BuckarooBanzay@users.noreply.github.com>
2024-02-29 13:15:18 +01:00

45 lines
1.4 KiB
Lua

local function transpose_data(data, max, indexFn, axis1, axis2)
-- https://github.com/Uberi/Minetest-WorldEdit/blob/master/worldedit/manipulations.lua#L422
local pos = {x=0, y=0, z=0}
while pos.x <= max.x do
pos.y = 0
while pos.y <= max.y do
pos.z = 0
while pos.z <= max.z do
local extent1, extent2 = pos[axis1], pos[axis2]
if extent1 < extent2 then -- Transpose only if below the diagonal
local data_1 = data[indexFn(pos)]
local value1, value2 = pos[axis1], pos[axis2] -- Save position values
pos[axis1], pos[axis2] = extent2, extent1 -- Swap axis extents
local data_2 = data[indexFn(pos)]
data[indexFn(pos)] = data_1
pos[axis1], pos[axis2] = value1, value2 -- Restore position values
data[indexFn(pos)] = data_2
end
pos.z = pos.z + 1
end
pos.y = pos.y + 1
end
pos.x = pos.x + 1
end
end
function pick_and_place.schematic_transpose(node_ids, param2_data, metadata, max, axis1, axis2)
local min = { x=0, y=0, z=0 }
local area = VoxelArea:new({MinEdge=min, MaxEdge=max})
local vmanipIndex = function(pos) return area:indexp(pos) end
local metaIndex = function(pos) return minetest.pos_to_string(pos) end
transpose_data(node_ids, max, vmanipIndex, axis1, axis2)
transpose_data(param2_data, max, vmanipIndex, axis1, axis2)
if metadata then
transpose_data(metadata, max, metaIndex, axis1, axis2)
end
end