]> git.lizzy.rs Git - worldedit.git/commitdiff
Always use faster vmanip copying code
authorsfan5 <sfan5@live.de>
Mon, 16 Sep 2019 23:20:10 +0000 (01:20 +0200)
committersfan5 <sfan5@live.de>
Mon, 16 Sep 2019 23:28:53 +0000 (01:28 +0200)
Since the code has two arrays of the area before and after,
the copy order is totally irrelevant.
Of course, this doesn't apply to metadata and we still need
to do that backwards.

worldedit/manipulations.lua

index 25aa14110f0cbb63fad4edf64cf0ac93fcbc1401..9d20b3b6659a596f1172a8a9146a415e02fe8256 100644 (file)
@@ -152,57 +152,21 @@ end
 function worldedit.copy(pos1, pos2, axis, amount)\r
        local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
 \r
-       local dim = vector.add(vector.subtract(pos2, pos1), 1)\r
-       if amount > 0 and amount < dim[axis] then\r
-               -- Source and destination region are overlapping and moving needs to\r
-               -- happen in reverse.\r
-               -- FIXME: I can't be bothered, so just defer to the legacy code for now.\r
-               return worldedit.legacy_copy(pos1, pos2, axis, amount)\r
-       end\r
+       -- Decide if we need to copy stuff backwards (only applies to metadata)\r
+       local backwards = amount > 0 and amount < (pos2[axis] - pos1[axis] + 1)\r
 \r
        local off = {x=0, y=0, z=0}\r
        off[axis] = amount\r
-       return worldedit.copy2(pos1, pos2, off)\r
-end\r
-\r
--- This function is not offical part of the API and may be removed at any time.\r
-function worldedit.legacy_copy(pos1, pos2, axis, amount)\r
-       local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
-\r
-       worldedit.keep_loaded(pos1, pos2)\r
-\r
-       local get_node, get_meta, set_node = minetest.get_node,\r
-                       minetest.get_meta, minetest.set_node\r
-       -- Copy things backwards\r
-       local pos = {}\r
-       pos.x = pos2.x\r
-       while pos.x >= pos1.x do\r
-               pos.y = pos2.y\r
-               while pos.y >= pos1.y do\r
-                       pos.z = pos2.z\r
-                       while pos.z >= pos1.z do\r
-                               local node = get_node(pos) -- Obtain current node\r
-                               local meta = get_meta(pos):to_table() -- Get meta of current node\r
-                               local value = pos[axis] -- Store current position\r
-                               pos[axis] = value + amount -- Move along axis\r
-                               set_node(pos, node) -- Copy node to new position\r
-                               get_meta(pos):from_table(meta) -- Set metadata of new node\r
-                               pos[axis] = value -- Restore old position\r
-                               pos.z = pos.z - 1\r
-                       end\r
-                       pos.y = pos.y - 1\r
-               end\r
-               pos.x = pos.x - 1\r
-       end\r
-       return worldedit.volume(pos1, pos2)\r
+       return worldedit.copy2(pos1, pos2, off, backwards)\r
 end\r
 \r
 --- Copies a region by offset vector `off`.\r
 -- @param pos1\r
 -- @param pos2\r
 -- @param off\r
+-- @param meta_backwards (not officially part of API)\r
 -- @return The number of nodes copied.\r
-function worldedit.copy2(pos1, pos2, off)\r
+function worldedit.copy2(pos1, pos2, off, meta_backwards)\r
        local pos1, pos2 = worldedit.sort_pos(pos1, pos2)\r
 \r
        local src_manip, src_area = mh.init(pos1, pos2)\r
@@ -258,6 +222,18 @@ function worldedit.copy2(pos1, pos2, off)
 \r
        -- Copy metadata\r
        local get_meta = minetest.get_meta\r
+       if meta_backwards then\r
+       for z = dim.z-1, 0, -1 do\r
+               for y = dim.y-1, 0, -1 do\r
+                       for x = dim.x-1, 0, -1 do\r
+                               local pos = {x=pos1.x+x, y=pos1.y+y, z=pos1.z+z}\r
+                               local meta = get_meta(pos):to_table()\r
+                               pos = vector.add(pos, off)\r
+                               get_meta(pos):from_table(meta)\r
+                       end\r
+               end\r
+       end\r
+       else\r
        for z = 0, dim.z-1 do\r
                for y = 0, dim.y-1 do\r
                        for x = 0, dim.x-1 do\r
@@ -268,6 +244,7 @@ function worldedit.copy2(pos1, pos2, off)
                        end\r
                end\r
        end\r
+       end\r
 \r
        return worldedit.volume(pos1, pos2)\r
 end\r